開発環境
- OS X El Capitan - Apple (OS)
- Emacs (Text Editor)
- Python 3.5 (プログラミング言語)
Python for Kids: A Playful Introduction to Programming (Jason R. Briggs (著) 、No Starch Press)のPart Ⅱ.(Bounce!)、Chapter 14.(Finishing Your First Game: Bounce!)、Programming Puzzles #4: Record the Player's Score(No. 4090)を解いてみる。
Programming Puzzles #4: Record the Player's Score(No. 4090)
コード(Emacs)
#!/usr/bin/env python3
#-*- coding: utf-8 -*-
import tkinter
import tkinter.font
import random
import time
class Score:
def __init__(self, canvas):
self.canvas = canvas
self.score = 0
self.id = canvas.create_text(400, 50,
text='score: {0}'.format(self.score))
def inc(self):
self.score += 1
print('score: {0}'.format(self.score))
self.canvas.itemconfig(self.id, text='score: {0}'.format(self.score))
class Paddle:
def __init__(self, canvas, color):
self.canvas = canvas
self.id = canvas.create_rectangle(0, 0, 100, 10, fill=color)
self.canvas.move(self.id, 200, 300)
self.x = 0
self.canvas_width = self.canvas.winfo_width()
self.started = False
self.canvas.bind_all('<KeyPress Left>', self.turn_left)
self.canvas.bind_all('<KeyPress Right>', self.turn_right)
self.canvas.bind_all('<Button-1>', self.start)
def turn_left(self, evt):
self.x = -2
def turn_right(self, evt):
self.x = 2
def start(self, evt):
self.started = True
def draw(self):
self.canvas.move(self.id, self.x, 0)
pos = self.canvas.coords(self.id)
if pos[0] <= 0:
self.x = 0
elif pos[2] >= self.canvas_width:
self.x = 0
class Ball:
def __init__(self, canvas, paddle, color, score):
self.canvas = canvas
self.paddle = paddle
self.id = canvas.create_oval(10, 10, 25, 25, fill=color)
self.canvas.move(self.id, 245, 100)
starts = [-3, -2, -1, 1, 2, 3]
random.shuffle(starts)
self.x = starts[0]
self.y = -3
self.canvas_height = self.canvas.winfo_height()
self.canvas_width = self.canvas.winfo_width()
self.hit_bottom = False
self.score = score
def draw(self):
self.canvas.move(self.id, self.x, self.y)
pos = self.canvas.coords(self.id)
if pos[1] <= 0:
self.y = 3
if pos[3] >= self.canvas_height:
self.hit_bottom = True
if self.hit_paddle(pos):
self.y = -3
if pos[0] <= 0:
self.x = 3
if pos[2] >= self.canvas_width:
self.x = -3
def hit_paddle(self, pos):
paddle_pos = self.canvas.coords(self.paddle.id)
if pos[2] >= paddle_pos[0] and pos[0] <= paddle_pos[2]:
if paddle_pos[1] <= pos[3] <= paddle_pos[3]:
self.x += self.paddle.x
self.score.inc()
return True
return False
if __name__ == '__main__':
tk = tkinter.Tk()
tk.title('Game')
tk.resizable(0, 0)
tk.wm_attributes('-topmost', 1)
canvas = tkinter.Canvas(tk, width=500, height=400,
bd=0, highlightthickness=0)
canvas.pack()
tk.update()
paddle = Paddle(canvas, 'blue')
score = Score(canvas)
ball = Ball(canvas, paddle, 'red', score)
text_game_over = canvas.create_text(250, 200, text='Game Over',
font=tkinter.font.Font(weight='bold'),
state=tkinter.HIDDEN)
while 1:
if (not ball.hit_bottom) and paddle.started:
ball.draw()
paddle.draw()
if ball.hit_bottom:
canvas.itemconfig(text_game_over, state=tkinter.NORMAL)
text_score = canvas.create_text(400, 50,
text='score: {0}'.format(
ball.score),
state=tkinter.HIDDEN)
tk.update_idletasks()
tk.update()
time.sleep(0.01)
入出力結果(Terminal, IPython)
$ ./sample4.py score: 1 score: 2 score: 3 score: 4 score: 5 C-c C-cTraceback (most recent call last): File "./sample4.py", line 116, in <module> time.sleep(0.01) KeyboardInterrupt $
0 コメント:
コメントを投稿