[Python]由弹球游戏改编的“弹球对战”游戏

本文介绍了一款基于Python的双人弹球对战游戏,游戏由经典弹球游戏改编,存在代码冗余和边界处理问题。玩家通过键盘控制上下两个板子击打球,但尚未实现计分和输赢判定功能。目前的bug是球可能会穿越板子或离开游戏界面。游戏主要涉及Tkinter库,包含小球和球拍类的定义,以及运动逻辑的实现。
摘要由CSDN通过智能技术生成

程序说明:弹球对战为双人游戏,暴力改编自‘经典弹球游戏"。上下两块板子以及它们的方法实现,直接是从已实现好的弹球游戏中,copy+paste,然后修改得来,简单粗暴,代码冗余严重…

玩法:两个玩家分别控制上、下两个板子,1P操作为"wsad",2P操作为“↑↓←→”,各自的活动范围是半个屏幕,要通过上下左右的移动,将球击打到对方底线。

补充:1、计分功能和输赢判定没有实现
2、bug:由于边界没有处理好,所以当板子处在边缘的时候,很容易直接穿越自己所在的片区,到达另一个万家的操作片区,甚至会跑出游戏界面。
如图所示,蓝色方将红球打过了自己的半区(下半区),而黄球很明显接不到了,所以这里蓝色方赢了1球

以下是代码:

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:月色真美
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值