python弹球游戏,能够选择难度和分数控制。
程序利用tkinter模块编写(说到这里吐槽一下tkinter模块,虽然tkinter是python自带的模块,但是编写手感真没有wxpython好,一个原因是tkinter模块较复杂定义了交互界面还要pack,位置也难调整,更重要的是界面没有wxpython好看)
python3代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 |
from tkinter import * from tkinter import messagebox import random import time class Ball: def __init__(self, canvas, paddle, color): self.canvas = canvas self.paddle = paddle self.id = canvas.create_oval(10, 10, 25, 25, fill=color) self.canvas.move(self.id, 245, 100) startx = [-3, -2, -1, 1, 2, 3] random.shuffle(startx) self.x = startx[0] self.y = -3 self.canvas_height = self.canvas.winfo_height() self.canvas_width = self.canvas.winfo_width() self.hit_bottom = False def draw(self): self.canvas.move(self.id, self.x, self.y) pos = self.canvas.coords(self.id) # top-left bottom-right if pos[1] <= 0 or self.hit_paddle(pos) == True: self.y = -self.y if pos[0] <= 0 or pos[2] >= self.canvas_width: self.x = -self.x if pos[3] >= self.canvas_height: self.hit_bottom = True def hit_paddle(self, pos): global score paddle_pos = self.canvas.coords(self.paddle.id) if pos[2] >= paddle_pos[0] and pos[0] <= paddle_pos[2]: if pos[3] >= paddle_pos[1] and pos[3] <= paddle_pos[3]: score += 1 return True return False class Paddle: def __init__(self, canvas, color,width): self.canvas = canvas self.id = canvas.create_rectangle(0, 0, width, 10, fill=color) self.x = 0 self.y = 0 self.canvas.move(self.id, 200, 300) self.canvas_width = self.canvas.winfo_width() self.canvas.bind_all("<Key-Left>", self.turn_left) self.canvas.bind_all("<Key-Right>", self.turn_right) def draw(self): pos = self.canvas.coords(self.id) if pos[0] + self.x >= 0 and pos[2] + self.x <= self.canvas_width: self.canvas.move(self.id, self.x, 0) # self.x = 0 def turn_left(self, event): self.x = -4 def turn_right(self, event): self.x = 4 width = 0 def test1(): global width2 width2 = 200 def test2(): global width2 width2 = 100 width2 = 100 score = 0 tk = Tk() tk.title("Game") tk.resizable(0, 0) # not resizable tk.wm_attributes("-topmost", 1) # at top btn1 = Button(tk, text='简单', command=test1) btn2 = Button(tk, text='难', command=test2) btn1.pack(side='left') btn2.pack(side='left') canvas = Canvas(tk, width=500, height=350, bd=0, highlightthickness=0) canvas.pack() canvas.create_line(1, 0, 1, 600, fill='red') tk.update() paddle = Paddle(canvas, 'blue', width2) ball = Ball(canvas, paddle, 'red') while True: if ball.hit_bottom == False: ball.draw() paddle.draw() else: messagebox.showinfo(title='失败!', message="你的分数为:" + str(score)) break tk.update_idletasks() tk.update() time.sleep(0.01) |
效果图: