弹球游戏实验:Ball_Game v1.0
程序员文章站
2024-03-19 11:33:28
...
这个游戏程序是按照《趣学python编程》书中的小球实验做得一个基础程序,使用python2.7编程,原书使用python3写的程序,可能有些性质2.7的不太兼容,当然最大的原因可能还是自己对这一部分指示掌握的不够好。后续在python的学习中会深入掌我面向对象的这个编程思路,在这篇程序中来说好像都还是面向过程的操作,感觉还没有完全把python的性质利用起来。
游戏运作的基本思路是:给定小球运动的方向和速度,当小球运动到边界时,小球会随机改变方向弹回去,当小球落在球拍上时,只改变y方向上速度的方向,x分量不变,实现反弹的效果。书中剩下输赢,计时,分级等功能在后期版本上会继续补足完善。
另外,由于我的脚本是在一台win7系统32位的电脑上编写 调试的,当我把程序换到我常用的64位win10系统上调试的时候,延时就会出现一些问题,gui的界面也会有一些差别。另外我的代码是在notepad++里面编写的,运行使用powershell用命令行更改目录到python的安装目录下,进入python环境,脚本要保存在python安装路径下,就可以直接使用import 导入到环境,进而开始游戏。
视频链接:http://v.youku.com/v_show/id_XMzEzMzYxOTExMg==.html?spm=a2hzp.8244740.0.0
import time
from Tkinter import *
import random
import math as mt
#定义游戏的一些初始设定,画面宽度长度,球的直径,起始位置
window_width=400
window_height=400
ball_size=10
start_x=random.randint(0,window_width)
start_y=random.randint(0,window_height)
step_x=1
step_y=1
pad_width=150
pad_hight=5
pad_startX=(window_width-pad_width)/2
pad_startY=350
d_p=[1,2,3,4,5,6] #小球运动方向正方向:
d_n=[-1,-2,-3,-4,-5,-6] #小球运动方向反方向
d_t=[-3,-2,-1,0,1,2,3] #小球运动方向 任意方向
#小球运动x,y方向的初始方向分量
d_x=0.5
d_y=0.5
#创建画布,并建立对象小球 球拍
tk=Tk()
tk.title("Game")
tk.resizable(0,0)
tk.wm_attributes("-topmost",1)
canvas=Canvas(tk,width=window_width,height=window_height,highlightthickness=0)
canvas.pack()
tk.update()
ball=canvas.create_oval(start_x,start_y,start_x+ball_size,start_y+rball_size,fill='red')
pad=canvas.create_rectangle(pad_startX,pad_startY,pad_startX+pad_width,pad_startY+5,fill='blue')
#判断是否发生击球动作,发生则返回True
def hit_paddle(ball_id,pad_id):
pos_ball=canvas.coords(ball_id)
pos_pad=canvas.coords(pad_id)
if pos_ball[2]>=pos_pad[0] and pos_ball[0]<=pos_pad[2]:
if pos_ball[3]>=pos_pad[1] and pos_ball[3]<=pos_pad[3]:
return True
return False
#移动球拍,按一次,移动四个像素
def move_pad(event):
if event.keysym=='Right':
canvas.move(pad,4,0)
elif event.keysym=='Left':
canvas.move(pad,-4,0)
#自动运行检测输入,按下回车开始小球开始运动
def atmo(event):
while True:
step_x,step_y=change_dir()
canvas.move(ball,step_x,step_y)
canvas.update()
time.sleep(0.02)
#改变方向,反弹,当碰到边界时改变方向,当发生击球动作时,对y轴分量,求倒数
def change_dir():
global step_x,step_y ,d_x,d_y
speed=4 #速度
POS=canvas.coords(ball)
if POS[0]<=step_x:
d_y=random.choice(d_t)
d_x=random.choice(d_p)
elif POS[1]<=step_y:
d_x=random.choice(d_t)
d_y=random.choice(d_p)
elif (window_width-POS[2])<=step_x:
d_x=random.choice(d_n)
d_y=random.choice(d_t)
elif (window_height-POS[3])<=step_y:
d_x=random.choice(d_t)
d_y=random.choice(d_n)
if hit_paddle(ball,pad)==True:
d_y=-d_y
d_x=d_x
s=mt.sqrt(d_x*d_x+d_y*d_y) #计算不同方向下速度在x与y方向上的分量,保证小球匀速运动
step_x=speed*d_x/s
step_y=speed*d_y/s
return step_x,step_y
#基本操作,按下回车小球开始运动,按键盘方向键,左右,球拍左右移动
canvas.bind_all('<KeyPress-Right>',move_pad)
canvas.bind_all('<KeyPress-Left>',move_pad)
canvas.bind_all('<KeyPress-Return>',atmo)
上一篇: 递归实现指数型枚举