程序说明:弹球对战为双人游戏,暴力改编自‘经典弹球游戏"。上下两块板子以及它们的方法实现,直接是从已实现好的弹球游戏中,copy+paste,然后修改得来,简单粗暴,代码冗余严重…
玩法:两个玩家分别控制上、下两个板子,1P操作为"wsad",2P操作为“↑↓←→”,各自的活动范围是半个屏幕,要通过上下左右的移动,将球击打到对方底线。
补充:1、计分功能和输赢判定没有实现
2、bug:由于边界没有处理好,所以当板子处在边缘的时候,很容易直接穿越自己所在的片区,到达另一个万家的操作片区,甚至会跑出游戏界面。
以下是代码:
import random
import time
from tkinter import *
tk = Tk()
tk.title("Game")
tk.resizable(0, 0)
tk.wm_attributes("-topmost", 1)
canvas = Canvas(tk, width=500, height=500, bd=0, highlightthickness=0)
canvas.pack()
tk.update() #------------------->x
tk.wm_protocol('WM_DELETE_WINDOW', tk.iconify) #|0,0 0,x
#生成小球类 #|
class Ball: #|
def __init__(self,canvas,color): #|y,0 y,x
self.canvas=canvas
self.paddle=paddle
self.paddle2 = paddle2
self.id=canvas.create_oval(0,0,25,25,fill=color)
self.canvas.move(self.id,0,0)
starts=[-3,-2,-1,1,2,3]
#shuffle()方法将序列的所有元素随机排序。
random.shuffle(starts)
self.x=starts[0]
self.y=starts[0]
self.canvas_height=self.canvas.winfo_height()
self.canvas_width=self.canvas.winfo_width()
self.hit_bottom=False
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 pos[1]<=paddle_pos[1] and pos[3]>=paddle_pos[1]:
return True
return False
def hit_paddle2(self,pos):
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[3] and pos[1]<=paddle_pos[3]:
return True
return False
#上板子
def hit_paddleU(self,pos):
paddle_pos=self.canvas.coords(self.paddle2.id)
if pos[2]>=paddle_pos[0] and pos[0]<=paddle_pos[2]:
if pos[1]<=paddle_pos[1] and pos[3]>=paddle_pos[1]:
return True
return False
def hit_paddleU2(self,pos):
paddle_pos=self.canvas.coords(self.paddle2.id)
if pos[2]>=paddle_pos[0] and pos[0]<=paddle_pos[2]:
if pos[3]>=paddle_pos[3] and pos[1]<=paddle_pos[3]:
return True
return False
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.y=-3
#self.hit_bottom=True
if pos[0] <= 0:
self.x = 3
if pos[2] >= self.canvas_width:
self.x = -3
if self.hit_paddle(pos) == True:
self.y = -3
if self.hit_paddle2(pos) == True:
self.y = 3
if self.hit_paddleU(pos) == True:
self.y = -3
if self.hit_paddleU2(pos) == True:
self.y = 3
#球拍类
class Paddle:
def __init__(self,canvas,color):
self.canvas=canvas
self.id=canvas.create_rectangle(0,0,60,10,fill=color)
self.canvas.move(self.id,100,300)
self.x=0
self.y=0
self.canvas_width=self.canvas.winfo_width()
self.canvas_height=self.canvas.winfo_height()
self.canvas.bind_all('<KeyPress-Left>',self.turn_left)
self.canvas.bind_all('<KeyPress-Right>', self.turn_right)
self.canvas.bind_all('<KeyPress-Up>', self.turn_up)
self.canvas.bind_all('<KeyPress-Down>', self.turn_down)
def turn_left(self,evt):
pos = self.canvas.coords(self.id)
if pos[0] <= 0: # 拍子移动到最左端,就不能再往左边动了
self.x = 0
else:
self.x=-3
def turn_right(self,evt):
pos = self.canvas.coords(self.id)
if pos[2] >=self.canvas_width:
self.x = 0
else:
self.x=3
def turn_up(self,evt):
pos = self.canvas.coords(self.id)
if pos[1] <=self.canvas_height/2:
self.y = 0
else:
self.y=-3
def turn_down(self,evt):
pos = self.canvas.coords(self.id)
if pos[3] >=self.canvas_height:
self.y = 0
else:
self.y=3
def draw(self):
self.canvas.move(self.id,self.x,self.y)
pos=self.canvas.coords(self.id)
if pos[0]<=0:
self.x=0
elif pos[2]>=self.canvas_width:#拍子移动到最右端,就不能再往右边动了
self.x=0
elif pos[3] >=self.canvas_height:
self.y = 0
elif pos[1] <=self.canvas_height/2:
self.y = 0
class PaddleUp:
def __init__(self,canvas,color):
self.canvas=canvas
self.id=canvas.create_rectangle(0,0,60,10,fill=color)
self.canvas.move(self.id,100,50)
self.x=0
self.y=0
self.canvas_width=self.canvas.winfo_width()
self.canvas_height=self.canvas.winfo_height()/2
self.canvas.bind_all('<KeyPress-a>',self.turn_left)
self.canvas.bind_all('<KeyPress-d>', self.turn_right)
self.canvas.bind_all('<KeyPress-w>', self.turn_up)
self.canvas.bind_all('<KeyPress-s>', self.turn_down)
def turn_left(self,evt):
pos = self.canvas.coords(self.id)
if pos[0] <= 0: # 拍子移动到最左端,就不能再往左边动了
self.x = 0
else:
self.x=-3
def turn_right(self,evt):
pos = self.canvas.coords(self.id)
if pos[2] >=self.canvas_width:
self.x = 0
else:
self.x=3
def turn_up(self,evt):
pos = self.canvas.coords(self.id)
if pos[1] <=0:
self.y = 0
else:
self.y=-3
def turn_down(self,evt):
pos = self.canvas.coords(self.id)
if pos[3] >=self.canvas_height:
self.y = 0
else:
self.y=3
def draw(self):
self.canvas.move(self.id,self.x,self.y)
pos=self.canvas.coords(self.id)
if pos[0]<=0:
self.x=0
elif pos[2]>=self.canvas_width:#拍子移动到最右端,就不能再往右边动了
self.x=0
elif pos[3] >=self.canvas_height:
self.y = 0
elif pos[1] <=0:
self.y = 0
#小球和球拍生成实例
paddle=Paddle(canvas,'blue')
paddle2=PaddleUp(canvas,'yellow')
ball=Ball(canvas,'red')
#无限循环
while 1:
if ball.hit_bottom==False:
ball.draw()
paddle.draw()
paddle2.draw()
tk.update_idletasks()
tk.update()
time.sleep(0.01)
else:
break
#
# #小球实例化
# ball=Ball(canvas,'black')
# #刷新屏幕,使画面中的小球“动”起来
# while 1:
# ball.draw()
# tk.update_idletasks() #刷新页面
# tk.update()
# time.sleep(0.01)
#copyright:月色真美