弹球游戏实验:Ball_Game v1.0

这个游戏程序是按照《趣学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_第1张图片
弹球游戏实验:Ball_Game v1.0_第2张图片

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('',move_pad)
canvas.bind_all('',move_pad)
canvas.bind_all('',atmo)

你可能感兴趣的:(python,小游戏代码,编程练习)