Lispは好きなのだが、惜しいことに標準の処理系というものがなく、いろいろ処理系がありすぎる。手元で軽く触れる言語で標準が存在するものが欲しいと思った。少し前にとある製造業で働いていたのだが、そこに居たMさんがpython派だったので話の種にpythonを勉強してみた。Mさんは僕同様言語オタクっぽい人でラムダ式の話し等で盛り上がることが出来たので楽しかった。vi派だったのとLispをイマイチ好まない人なのが残念だが。

とりあえずブロック崩しを書いてみた。
えらいこと'self'が多いのがうざったい。その他いろいろと不満な点もあるが、良い言語だと思う。
perlには及ばないだろうがrubyよりもライブラリが多いのも買えるところだ。

以下ソース、いちいち説明を書かないが、スペースキーでゲームスタート、矢印キーでパドル移動。
'press space to start'くらい書けばいいのだが、tkを調べるのに苦労したのとwindowsでtkがゲームするという用途では全く実用的な速度でないことに気付き、全くもってやる気がなくなってきた。最後は結構投げやりに。


import Tkinter as Tk
import time class Frame(Tk.Frame): def __init__(self): Tk.Frame.__init__(self) self.canv = Tk.Canvas(self, width=640, height = 480) self.canv.pack(fill=Tk.BOTH, expand = 1) self.focus_set() self.bind('<space>', self.startgame) self.top = self.canv.create_line(0, 0, 640, 0, fill = 'black') self.left = self.canv.create_line(0, 0, 0, 480, fill = 'black') self.right = self.canv.create_line(640, 0, 640, 480, fill = 'black') self.bottom = self.canv.create_line(0, 480, 640, 480, fill = 'black') def startgame(self, event): if len(self.canv.find_withtag('init')) != 0: self.canv.delete('init') self.unbind('<space>') self.bind('<Right>', self.paddle_right) self.bind('<Left>' , self.paddle_left) self.x_move = 5 self.y_move = 5 self.paddle = None self.ball = None self.paddle = self.canv.create_rectangle\ (320, 470, 420, 480, outline = 'black', fill = 'black', tags = 'init') self.ball = self.canv.create_oval\ (250, 210, 260, 220, outline = 'black', fill = 'black' , tags = 'init') self.blocklist = [] self.blocklist.append(self.canv.create_rectangle(0,0,160,60,outline='black',fill = 'red' ,tags = 'init')) self.blocklist.append(self.canv.create_rectangle(160,0,320,60,outline='black',fill = 'blue',tags = 'init')) self.blocklist.append(self.canv.create_rectangle(320,0,480,60,outline='black',fill = 'yellow',tags = 'init')) self.blocklist.append(self.canv.create_rectangle(480,0,639,60,outline='black',fill = 'black',tags = 'init')) self.blocklist.append(self.canv.create_rectangle(0,60,160,120,outline='black',fill = 'blue',tags = 'init')) self.blocklist.append(self.canv.create_rectangle(160,60,320,120,outline='black',fill = 'yellow',tags = 'init')) self.blocklist.append(self.canv.create_rectangle(320,60,480,120,outline='black',fill = 'black',tags = 'init')) self.blocklist.append(self.canv.create_rectangle(480,60,639,120,outline='black',fill = 'red',tags = 'init')) self.moveball() def moveball(self): self.canv.move(self.ball, self.x_move, self.y_move) self.canv.update() test = self.canv.find_overlapping(self.canv.coords(self.ball)[0], self.canv.coords(self.ball)[1], self.canv.coords(self.ball)[2], self.canv.coords(self.ball)[3]) if self.top in test: self.y_move = -self.y_move self.canv.after(1, self.moveball) elif self.left in test: self.x_move = -self.x_move self.canv.after(1, self.moveball) elif self.right in test: self.x_move = -self.x_move self.canv.after(1, self.moveball) elif self.paddle in test: self.y_move = -self.y_move self.canv.after(1, self.moveball) elif self.bottom in test: self.gameover() else: self.judge_block(test) self.canv.after(1, self.moveball) def paddle_right(self, event): self.canv.move(self.paddle, 20, 0) def paddle_left(self, event): self.canv.move(self.paddle, -20, 0) def gameover(self): self.bind('<space>',self.startgame) self.unbind('<Right>') self.unbind('<Left>') def judge_block(self, blockids): for id in blockids: if id in self.blocklist: self.canv.delete(id) self.blocklist.remove(id) self.y_move = -self.y_move if __name__ == '__main__': f = Frame() f.pack(fill = Tk.BOTH, expand = 1) f.mainloop()



作ってみて気がついたが横からブロックにぶつかっても変な方向にバウンドするのであからさまに未完成だ。次回はこれをどう改良し完成させるかというテーマで書くとしよう。いつ書くかだが、飽きてきたので未定。pythonよりもtkを調べるのに時間がかかった。 

こんなアホみたいなプログラムの記事に需要があるのだろうか?