用python编写一个弹球游戏

用python编写一个简单的弹球游戏

这是学习python时用来练习的一个项目,作为笔记。
最终是实现一个简单的弹球游戏,效果图如下:
在这里插入图片描述

源代码:

#无限命版的弹球游戏python代码
from tkinter import *  # 来源于python的标准库,GUI
import random
import time


# 创建Ball类,对小球进行定义
class Ball:
    def __init__(self, canvas, paddle, color):  # 初始化函数
        self.canvas = canvas  # 把对象变量canvas赋值给对象变量canvas
        self.paddle = paddle #把对象变量赋值给paddle
        self.id = canvas.create_oval(10, 10, 25, 25, fill=color)  # 函数creat_oval返回的是创建目标的ID
        self.canvas.move(self.id, 245, 100)  # 移动小球到画布中心
        starts = [-3, -2, -1, 1, 2, 3]  # 定义一个列表存初始速度
        random.shuffle(starts)  # 把列表里面的数随机排列
        self.x = starts[0]  # 取列表中的第一个数
        self.y = -3  # 把小球向上的速度变为3,初始的合速度变大
        self.canvas_height = self.canvas.winfo_height()  # 获取当前画布高度并赋值给对象变量canvas_height
        self.canvas_width = self.canvas.winfo_width()
        self.hit_bottom = False

    def hit_paddle(self, pos): #定义弹球击打操作,当两个图像有相交时返回true,否则false
        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]:
                return True
        return False

#在画布上按照定义的要求画出小球
    def draw(self):
        self.canvas.move(self.id, self.x, self.y)  # 使小球移动,画布上move函数的调用,传入的参数是x,y
        pos = self.canvas.coords(self.id)  # 创建变量并将画布函数coords赋值给pos,通过圆的ID返回一个列表,4个数分别是左上角和右下角的坐标
        if pos[1] <= 0:#列表pos中0和1的位置是圆的左上方的坐标,2和3的位置是右下方的坐标
            self.y = 4  # 更改数字可以实现小球的不同方向的变速
        if pos[3] >= self.canvas_height:
#            self.hit_bottom = True #如果想实现小球到画布底端就gameover可以加上这行,同时注释掉下一行
            self.y = -4
        if self.hit_paddle(pos) == True:#实现球与球拍接触时反弹
            self.y = -4
        if pos[0] <= 0:
            self.x = 4
        if pos[2] >= self.canvas_width:
            self.x = -4


# 创建球拍类
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.canvas.bind_all('<KeyPress-Left>', self.turn_left)#把按键和球拍类左右键分别进行绑定
        self.canvas.bind_all('<KeyPress-Right>', self.turn_right)

    def draw(self): #在画布上画出球拍
        self.canvas.move(self.id, self.x, 0)
        pos = self.canvas.coords(self.id)
        if pos[0] <= 0:#这两个if语句用来设置球拍边界
            self.x = 0
        elif pos[2] >= self.canvas_width:
            self.x = 0

#定义左右键函数
    def turn_left(self, evt):
        self.x = -5#改变数值可以实现球拍灵活度的改变

    def turn_right(self, evt):
        self.x = 5


# 创建游戏画布
tk = Tk()  # 创建tk对象
tk.title("变速版弹球游戏")  # 使用tk对象中的title函数给窗口加标题
tk.resizable(0, 0)  # 使窗口大小在水平和垂直方向上都不可以改变
tk.wm_attributes("-topmost", 1)  # 把包含我们画布的窗口放到所有其他窗口之前
canvas = Canvas(tk, width=500, height=400, bd=0, highlightthickness=0)  # bd=0是确保在画布之外没有边框
canvas.pack()  # 让画布按照前一行给出的宽度和高度参数来调整其自身大小
tk.update()  # 让tkinter为游戏中的动画做好初始化

paddle = Paddle(canvas, 'blue')
ball = Ball(canvas, paddle, 'red')  # 创建一个Ball类的对象

while 1:  # 动画循环,让tkinter一直画图
    if ball.hit_bottom == False:#如果球没有被接到,gameover
        ball.draw()
        paddle.draw()
    tk.update_idletasks()
    tk.update()
    time.sleep(0.01)  # 循环一次,python自己休息的时间,可以理解为一直画图的时候,间隔时间

  • 6
    点赞
  • 74
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,下面是一个简单的弹球游戏Python代码,使用了Pygame模块: ```python import pygame import random # 初始化Pygame pygame.init() # 游戏窗口大小 WINDOW_WIDTH = 600 WINDOW_HEIGHT = 600 # 定义颜色 WHITE = (255, 255, 255) BLACK = (0, 0, 0) RED = (255, 0, 0) GREEN = (0, 255, 0) BLUE = (0, 0, 255) # 创建游戏窗口 WINDOW = pygame.display.set_mode((WINDOW_WIDTH, WINDOW_HEIGHT)) pygame.display.set_caption("弹球游戏") # 创建小球类 class Ball: def __init__(self, x, y, r, color): self.x = x self.y = y self.r = r self.color = color self.speed_x = random.randint(3, 6) self.speed_y = random.randint(3, 6) def move(self): self.x += self.speed_x self.y += self.speed_y # 检测小球是否触边界 if self.x + self.r > WINDOW_WIDTH or self.x - self.r < 0: self.speed_x = -self.speed_x if self.y + self.r > WINDOW_HEIGHT or self.y - self.r < 0: self.speed_y = -self.speed_y def draw(self): pygame.draw.circle(WINDOW, self.color, (int(self.x), int(self.y)), self.r) # 创建挡板类 class Paddle: def __init__(self, x, y, w, h, color): self.x = x self.y = y self.w = w self.h = h self.color = color def draw(self): pygame.draw.rect(WINDOW, self.color, (self.x, self.y, self.w, self.h)) def move_left(self): self.x -= 5 if self.x < 0: self.x = 0 def move_right(self): self.x += 5 if self.x + self.w > WINDOW_WIDTH: self.x = WINDOW_WIDTH - self.w # 创建小球对象和挡板对象 ball = Ball(WINDOW_WIDTH/2, WINDOW_HEIGHT/2, 10, BLUE) paddle = Paddle(WINDOW_WIDTH/2-50, WINDOW_HEIGHT-20, 100, 10, GREEN) # 游戏主循环 while True: # 响应退出事件 for event in pygame.event.get(): if event.type == pygame.QUIT: pygame.quit() exit() # 检测挡板移动 keys = pygame.key.get_pressed() if keys[pygame.K_LEFT]: paddle.move_left() if keys[pygame.K_RIGHT]: paddle.move_right() # 移动小球 ball.move() # 检测小球和挡板是否碰撞 if ball.y + ball.r > paddle.y and ball.x > paddle.x and ball.x < paddle.x + paddle.w: ball.speed_y = -ball.speed_y # 清屏 WINDOW.fill(WHITE) # 绘制小球和挡板 ball.draw() paddle.draw() # 更新屏幕 pygame.display.update() ``` 这是一个非常简单的弹球游戏,小球会在窗口中自动反弹,并且可以用左右箭头键控制挡板移动。你可以根据自己的需要对代码进行修改和优化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值