弹球游戏实验:Ball_Game v1.0

来源:互联网 发布:手机淘宝怎么没有直播 编辑:程序博客网 时间:2024/06/05 19:40

这个游戏程序是按照《趣学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

powershell进入环境
Gui界面

import timefrom Tkinter import *import randomimport math as mt#定义游戏的一些初始设定,画面宽度长度,球的直径,起始位置window_width=400window_height=400ball_size=10start_x=random.randint(0,window_width)start_y=random.randint(0,window_height)step_x=1step_y=1pad_width=150pad_hight=5pad_startX=(window_width-pad_width)/2pad_startY=350d_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.5d_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')#判断是否发生击球动作,发生则返回Truedef 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)
原创粉丝点击