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!
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
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
---------------------------------------
Open Source - because writing software doesn't make you a "traitor"
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.
--
あるユーモアのないアホのため、シグナチャーをカエルことにした。