Välkommen till linuxportalen.se!

Linuxportalen.se är Sveriges största och aktivaste webbplats för användare av öppen- och fri programvara.

Du besöker Linuxportalen.se som gäst vilket begränsar din möjlighet att använda webbplatsens alla funktioner. Genom att registera dig som medlem får du inte bara möjlighet att söka bland webbplatsens innehåll, skapa nya och delta i befintliga diskussioner, skapa din egen blogg, kommunicera med andra medlemmar genom privata meddelanden och delta i omröstningar. Du får också tillgång till Veckans Kadavro - en seriestrip unikt skapad för Linuxportalen.se!

Registeringen sker snabbt och är helt kostnadsfri - tveka inte, bli medlem idag!

Quest: Try as many script languages as possible in a week

Häromdagen skrev jag en ircbot i php. Det var sådär skoj. Idag skrev jag ett pongspel i ruby med curses som gränssnitt.

Ruby är riktigt skoj och har ett väldigt bra system för att hantera klasser, den kan t.ex enkelt skapa getters och setters för objekt i en klass helt automagiskt - vilket jag gillar.

Next to try: python!


#!/usr/bin/ruby

#init curses
require "ncurses"

Ncurses::initscr

#CONFIG

Ncurses::nl
Ncurses::noecho
Ncurses::curs_set(0)
Ncurses::nodelay(Ncurses::stdscr, true)
Ncurses::raw

Ncurses::keypad(Ncurses::stdscr,1)

Ncurses::start_color
Ncurses::init_pair(1,Ncurses::COLOR_GREEN, Ncurses::COLOR_RED)
Ncurses::init_pair(2,Ncurses::COLOR_CYAN, Ncurses::COLOR_BLACK)

my_window = Ncurses::WINDOW.new(24,75,0,0)

#the pong class
class Pong
	attr_accessor :x, :y, :keyUP, :keyDOWN, :length, :score
	def move(direction)
		if (direction == 1)
			@y = @y-1
		
		elsif (direction == 2)
			@y = @y+1
		end
	end

end

class Ball
	attr_accessor :x, :y, :xspeed, :yspeed, :oldy, :oldx

	def move
		@oldx = @x
		@oldy = @y
		@x = @x + @xspeed
		@y = @y + @yspeed
	end
end


#create a pong

firstpong = Pong.new
firstpong.x = 4
firstpong.y = 4
firstpong.keyUP = "KEY_UP"
firstpong.keyDOWN = "KEY_DOWN"
firstpong.length = 6
firstpong.score = 0

#and another one
secondpong = Pong.new
secondpong.x = 70
secondpong.y = 15
secondpong.keyUP = "KEY_LEFT"
secondpong.keyDOWN= "KEY_RIGHT"
secondpong.length = 6
secondpong.score = 0


#okay now we have the pongs. 

#lets put a ball on the field!

ball = Ball.new
ball.x = 15
ball.y = 10
ball.xspeed=1
ball.yspeed=1

#main loop
pause = false
begin
	
	case(Ncurses.getch)
	
		when "q"[0]
			break
		when "p"[0]
			if pause
				pause = false
			else
				pause = true
		end

		when Ncurses::KEY_UP
			secondpong.move(1)
	
		when Ncurses::KEY_DOWN
			secondpong.move(2)

		when "a"[0]
			firstpong.move(1)

		when "z"[0]
			firstpong.move(2)
	end
	#do some magic ball things, like move it and why do we do that? because WE LIKE TO MOVE IT MOVE IT, WE LIKE TO MOVE IT MOVE IT
	if(!pause)
		ball.move
		#check if ball hits wall
		if(ball.x >= 72)
			ball.xspeed = -1
		elsif(ball.x <=1)
			ball.xspeed=1
		elsif(ball.y <= 2)
			ball.yspeed = 1
		elsif(ball.y >= 22)
			ball.yspeed = -1
		end

		#check if ball hits a pong

		if(ball.x == firstpong.x)
			if(ball.y >= firstpong.y && ball.y <= firstpong.y + firstpong.length)
				ball.xspeed *= -1;
			end	
		elsif(ball.x == secondpong.x)
			if(ball.y >=secondpong.y && ball.y <= secondpong.y + secondpong.length)
				ball.xspeed *= -1;
			end

		#check if ball hits a goal
	
		#uglyhack - goal starts at x 0 and x74, and its 15 long, both start at y5  later do this dynamical
		elsif(ball.x == 1 && ball.y >= 5 && ball.y<= 5 + 15 )
			secondpong.score += 1
			ball.x = 25
		elsif(ball.x == 72 && ball.y >=5 && ball.y<= 5 + 15 )
			firstpong.score += 1
			ball.x = 25

		end

	
		
		#draw things
		my_window.border(*([0]*8))
		my_window.color_set(2,nil)

		#draw a black square on the old ball location
		my_window.mvaddstr(ball.oldy , ball.oldx , " ")
	
		my_window.mvaddstr(ball.y,ball.x, "*")

	
	
		#do the PONGS!
		c=0
		my_window.mvaddstr(firstpong.y - 1, firstpong.x, " ");
	
		my_window.color_set(1,nil)
		begin
			my_window.mvaddstr(firstpong.y + c,firstpong.x, " ")
			c = c+1	
		end while c<firstpong.length

		my_window.color_set(2,nil)
		my_window.mvaddstr(firstpong.y + c , firstpong.x, " ")
		#second pong
		my_window.color_set(2,nil)
		my_window.mvaddstr(secondpong.y - 1, secondpong.x , " ")
		c=0

		my_window.color_set(1,nil)

		begin
			my_window.mvaddstr(secondpong.y + c,secondpong.x, " ")
			c=c+1
		end while c<secondpong.length
		my_window.color_set(2,nil)
		my_window.mvaddstr(secondpong.y + c, secondpong.x, " ")

		#and we need some goals as well. otherwise it is impossible to wine the game!
		i = 0
		begin
			my_window.mvaddstr(5 + i, 0, " ")
			my_window.mvaddstr(5 + i, 74, " ")
			i+=1
		end while i < 15

		#write out what we have here now
		my_window.mvaddstr(23, 4, "| Ping: " + firstpong.score.to_s + " | Pong: " + secondpong.score.to_s + " | q to quit, p to pause")
	

		#update screen
		my_window.noutrefresh()
		Ncurses::doupdate
		sleep(0.05)
	end
end while true
Ncurses::echo
Ncurses::nocbreak
Ncurses::curs_set(1)
Ncurses::endwin

Alternativ för kommentarvisning

Välj ditt önskade sätt att visa kommentarerna och klicka på "Spara" för att verkställa dina ändringar.

Kristians bild

Mycket bra initiativ. I de flesta fall nöjer sig folk med "Hello world" och det är totalt meningslöst om man vill se hur ett språk fungerar. Frågan är dock om man gör uppgiften rättvis om man blott "portar" koden från ett annat språk. Ta följande exempel i C

int square(int value)

{

    return value * value;

}

int main()

{

    int vec = {1, 2, 3, 4};

    for (int i = 0; i < sizeof(vec) / sizeof(int); ++i) {

        vec[i] = square(vec[i]);

    }

}

 

Detta kan i ELISP skrivas enligt

(defun square(x)

    (* x x))

(setq vec '(1 2 3 4))

(setq it vec)

(while (not (eq it nil))

    (setcar it (square (car it)))

    (setq it (cdr it))

)

ELLER enligt för detta språk mer naturliga

(setq vec (mapc '(lambda (x) (* x x)) '(1 2 3 4)))

 

Ett språk är inte bara en syntax, det är ett sätt att tänka Smile

 

---------------------------------------

 

valdermans bild

Varför bara scriptspråk? Vill du prova på någonting nytt är det ganska meningslöst att bara köra igenom de populärare scriptspråken (Ruby, Python, Lua, PHP, Perl) eftersom de allihop är bara är mer eller mindre olika syntax för exakt samma språk; imperativa, dynamiskt typade, objektorienterade, tråkiga.

Pröva på Haskell, Erlang och Prolog istället om du vill ha nya sätt att se på saker. (Eller Lisp, O'Caml, F#, etc.) På tok för många människor tror tragiskt nog att OOP är det enda sättet att programmera.

Mer om Haskell kan du läsa på http://www.learnyouahaskell.org och http://www.realworldhaskell.org. Erlang kan du lära dig på http://www.learnyousomeerlang.com/ Prologrelaterade resurser får du gräva fram själv.

--
あるユーモアのないアホのため、シグナチャーをカエルことにした。カエルさん