弹球游戏python代码含记分模式_python实现弹球游戏的⽰例
代码
运⾏效果
实现代码
# -*- coding: utf-8 -*-
import tkinter as tkinter
ssagebox as mb
import random,time
class Ball():
'''
创建Ball类,初始化对象,即创建对象设置属性,
python新手代码示例init函数是在对象被创建的同时就设置属性的⼀种⽅法,Python会在创建新对象时⾃动调⽤这个函数。
'''
def __init__(self,canvas,paddle,score,color,init_x=100,init_y=100):
'''
Ball类初始化属性
:param canvas:画布
:param paddle:球拍
:param score:得分
:param color:⼩球的颜⾊
:param init_x:⼩球球的初始横坐标,有默认值,可不传
:param init_y:⼩球球的初始纵坐标,有默认值,可不传
'''
self.canvas = canvas
self.paddle = paddle
self.score = score
# 保存tkinter画⼩球返回的id,为后期移动屏幕上的⼩球做准备,
# 参数分别表⽰为:(10,10)表⽰左上⾓x,y坐标,(30,30)表⽰右下⾓x,y坐标,即创建⼀个直径为20的圆
# fill为⼩球的填充⾊
self.id = ate_oval(10,10,30,30,lor)
# 将⼩球移动到初始位置,初始位置可通过传参进⾏更改,有默认值
ve(self.id,init_x,init_y)
# 给⼀串x分量的起始值(x和y代表横坐标和纵坐标的分量)
starts = [-3,-2,-1,1,2,3]
# shuffle() ⽅法将序列的所有元素随机排序
random.shuffle(starts)
# 随机混排序,赋值给对象变量x,让它起始的时候获得随机分量值,引起球每次起始⾓度都不同
self.x = starts[0]
# 对象变量y就是垂直分量移动的初始值,等价于上下移动,值代表移动多少像素点
self.y = -3
# winfo_height()函数来获取画布当前的⾼度,赋值给对象变量
self.canvas_height = self.canvas.winfo_height()
# winfo_width()函数来获取画布当前的宽度,赋值给对象变量
self.canvas_width = self.canvas.winfo_width()
# ⼩球是否碰触到画布底部,初始值为False,即没有碰到
self.hit_bottom = False
def draw(self):
'''
该函数⽤于让⼩球⽔平和垂直运动,在运动的过程中,判断是否得分、游戏是否结束
'''
# 让⼩球可以⽔平和垂直运动
ve(self.id,self.x,self.y)
# coords函数通过id返回画布球的坐标列表(两个坐标,左上⾓的坐标和右下⾓的两个坐标)
position = ds(self.id)
# 判断⼩球是否撞到画布顶部或者底部,保证⼩球反弹回去,不消失
if position[1] <= 0: # 如果⼩球的左上⾓y坐标⼩于0,则向下移动3个像素
self.y = 3
if position[3] >= self.canvas_height: # 如果⼩球的右下⾓y坐标⼤于画布宽度,则表⽰⼩球碰到了画布底部,游戏结束self.hit_bottom = True
if self.hit_paddle(position) == True: # 判断 球 是否碰到了 球拍,如果碰到了则使⼩球回弹
self.y = -3
if position[0] <= 0: # 如果⼩球的左上⾓x坐标 ⼩于等于0,则向右移动3个像素
self.x = 3
if position[2] >= self.canvas_width: # 如果⼩球的右下⾓x坐标 ⼤于等于画布宽度,则向左移动3个像素
self.x = -3
def hit_paddle(self,position):
'''
该函数⽤于判断 球 是否碰到了 球拍,如果碰到了则使⼩球回弹,否则游戏结束
:param position:⼩球的坐标
'''
# 获取球拍在画布的坐标,返回⼀个数组(两个坐标,左上⾓的坐标和右下⾓的两个坐标)
paddle_position = ds(self.paddle.id)
print ('paddle_position:',paddle_position[0],paddle_position[1],paddle_position[2],paddle_position[3]) # 如果⼩球的右下⾓x坐标 ⼤于等于 球拍左上⾓x坐标,且⼩球左上⾓x坐标 ⼩于等于 球拍右下⾓x坐标
if position[2] >= paddle_position[0] and position[0] <= paddle_position[2]:
# 如果⼩球右下⾓y坐标 ⼤于等于 球拍左上⾓y坐标,且⼩球右下⾓y坐标 ⼩于等于 球拍右下⾓坐标
if position[3] >= paddle_position[1] and position[3] <= paddle_position[3]:
# 横坐标 等于
self.x += self.paddle.x
colors = ['red','green']
# shuffle() ⽅法将序列的所有元素随机排序,以便随机获得⼩球颜⾊
random.shuffle(colors)
#
self.canvas.itemconfig(self.id,fill=colors[0])
# 计算得分并展⽰,且同时将⼩球的颜⾊、关卡颜⾊同步
self.score.hit(ball_color = lor)
self.canvas.itemconfig(self.paddle.id,lor)
# 增加或减少球拍的宽度
self.adjust_paddle(paddle_position)
return True
return False
def adjust_paddle(self,paddle_position):
'''
该函数⽤于增加或减少球拍的宽度
:paddle_position:球拍的位置坐标
'''
# 球拍每次的增量⼤⼩
paddle_grow_length = 30
# 球拍的宽度 = 球拍的右下⾓x坐标 - 球拍的左上⾓x坐标
paddle_width = paddle_position[2] - paddle_position[0]
lor == 'red': # 如果当前球的颜⾊为红⾊
if paddle_width > 30: # 如果球拍的宽度⼤于60
if paddle_position[2] >= self.canvas_width: # 如果球拍右下⾓的x坐标 ⼤于等于 画布宽度# 球拍右下⾓x坐标 = 球拍右下⾓x坐标 - 增量值
paddle_position[2] = paddle_position[2] - paddle_grow_length
else:
# 球拍的左上⾓x坐标 = 球拍的左上⾓x坐标 + 增量值
paddle_position[0] = paddle_position[0] + paddle_grow_length
lor == 'green': # 如果当前球的颜⾊为绿⾊
if paddle_width < 300: # 如果球拍的宽度⼩于300
if paddle_position[2] >= self.canvas_width: # 如果球拍的右下⾓x坐标 ⼤于等于 画布宽度# 球拍左上⾓x坐标 - 增量值
paddle_position[0] = paddle_position[0] - paddle_grow_length
else:
# 球拍右下⾓x坐标 + 增量值
paddle_position[2]=paddle_position[2]+paddle_grow_length
class Paddle:
'''
球拍类
'''
def __init__(self,canvas,color):
'''
:param canvas:画布
:param color:球拍的颜⾊
'''
self.canvas = canvas
# winfo_width()函数来获取画布当前的宽度,赋值给对象变量
self.canvas_width = self.canvas.winfo_width()
# winfo_height()函数来获取画布当前的⾼度,赋值给对象变量
self.canvas_height = self.canvas.winfo_height()
# 保存tkinter画球拍时返回的id,为后期移动屏幕上的球拍做准备,
# create_rectangle 画矩形,fill为球拍的颜⾊
self.id = ate_rectangle(0,0,180,15,fill=color)
# 将球拍移动⾄初始位置
ve(self.id,200,self.canvas_height*0.75) # 设置对象变量x,初始值为0.也就是球拍先不移动
self.x = 0
# 游戏是否开始,默认为Flase,即 不开始
self.started = False
# 是否继续游戏,默认值为 否
# 初始化时将事件‘按下左键'和函数向左移动绑定
self.canvas.bind_all('',self.turn_left)
# 初始化时将事件‘按下右键'和函数向右移动绑定
self.canvas.bind_all('',self.turn_right)
# 初始化时将事件‘按下Enter键'和函数继续游戏绑定self.canvas.bind_all('',inue_game)
# 按任意键开始游戏
self.canvas.bind_all('',self.start_game)
# 初始化时将事件‘按下space键'和函数暂停游戏绑定self.canvas.bind_all('',self.pause_game)
def turn_left(self,event):
'''
该函数⽤于向左移动时,
'''
# 获取球拍的位置坐标
position = ds(self.id)
# 如果球拍的左上⾓x坐标 ⼩于 0
if position[0] <= 0:
# 则再次按向左移动时,移动距离为0
self.x = 0
else:
# 每次向左移动3个像素
self.x = -3
def turn_right(self,event):
# 获取球拍的位置坐标
position = ds(self.id)

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。