欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

弹球游戏实验: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

弹球游戏实验:Ball_Game v1.0
弹球游戏实验:Ball_Game v1.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)