这是很早之前课余时间写的基于Python/Tkinter单机小游戏,用来练手,今天将代码贴出来,方便大家一起学习,通过Py/Tk对于学习GUI作为一个入口,其实是个不错入口,在这里推荐一下Tcl/Tk这门工具控制语言也是很好的脚本语言,对于快速构建应用GUI以及Demo都有不错的帮助(支持SWIG),国外有人将Tcl/Tk嵌入到C中,可以实现用C快速构建GUI,一直都想将实现这个目标,终因诸多因素搁浅,不能不说这是个遗憾...
注:打包好的win32位exe程序以及代码文件都已经上传到CSDN
游戏截图:
阅读代码要求:需要读者对构建TkinterGUI程序函数参数有基本的了解
以及了解基本的Python语法
运行环境:WIN 32位 /LINUX32位
代码行数:700行
游戏介绍
#基于Tk的打飞机游戏
#该游戏是基于TkGUI包开发的小游戏,可以通过键盘上的上下左右按键控制飞机,来躲避和击落敌机#的小游戏,游戏包括飞机的控制和发射子弹,以及敌机的生成与下落,当子弹击中敌机,敌机消失,当飞#机碰到敌机生命值减少,当飞机生命值减少为0的时候,游戏结束。
1.初始化
def __init__(self):
self.base_path=os.getcwd()#当前路径
self.health_point_value=5#生命值
self.mark_value=0#分数
self.shoot_down_plane_num_value=0 #击落飞机数量
self.height_record_val=self.read_pkl_file()#最高历史记录
self.root=Tk()
self.root.option_add("*Font", "华文中宋")
2.读取配置文件(最高游戏记录)
def read_pkl_file(self):
try:
pkl_file=open(self.base_path+"//"+'h_r.pkl','rb')
data1=pickle.load(pkl_file)
pkl_file.close()
except Exception,e:
output=open(self.base_path+"//"+'h_r.pkl','wb')
data_h_r={"heighest_record":0,}
pickle.dump(data_h_r,output)
output.close()
return 0
else:
return data1['heighest_record']
3.写入配置文件
def write_pkl_file(self,value_h_r):
output=open(self.base_path+"//"+'h_r.pkl','wb')
data_h_r={"heighest_record":value_h_r,}
pickle.dump(data_h_r,output)
output.close()
4.游戏主界面
def main_gui(self):
def over_game():
#self.root.quit()
self.root.destroy()
os._exit(1)
self.root.geometry("420x500")
self.root.maxsize(420,500)
self.root.minsize(420,500)
#ico_path=os.path.join(self.base_path,"plane.ico")
#self.root.iconbitmap(ico_path)
self.root.title("飞机大战")
self.canvas_show=Canvas(self.root,width=320,height=500,bg='white')
self.canvas_show.pack(side=LEFT)
self.frame_right=Frame(self.root)
self.frame_right.pack(side=LEFT,anchor=S,pady=20)
self.frame_score1=Frame(self.frame_right)
self.score_value1_label=Label(self.frame_score1,text="最高纪录",width=10)
self.score_value1_label.pack(side=TOP)
self.score_value1_label_tag=Label(self.frame_score1,text=str(self.height_record_val),
font=('Vandana',12),width=10)
self.score_value1_label_tag.pack(side=TOP)
self.frame_score1.pack(side=TOP,pady=20)
self.frame_life=Frame(self.frame_right)
self.frame_life.pack(side=TOP,pady=10)
self.life_num=Label(self.frame_life,text=" ",height=1,font=('Vandana',4),bg="blue")
self.life_num.pack(side=TOP,pady=2)
self.life_num1=Label(self.frame_life,text=" ",height=1,font=('Vandana',4),bg="blue")
self.life_num1.pack(side=TOP,pady=2)
self.life_num2=Label(self.frame_life,text=" ",height=1,font=('Vandana',4),bg="blue")
self.life_num2.pack(side=TOP,pady=2)
self.life_num3=Label(self.frame_life,text=" ",height=1,font=('Vandana',4),bg="blue")
self.life_num3.pack(side=TOP,pady=2)
self.life_num4=Label(self.frame_life,text=" ",height=1,font=('Vandana',4),bg="blue")
self.life_num4.pack(side=TOP,pady=2)
self.life_value_label=Label(self.frame_life,text="生命值",width=10)
self.life_value_label.pack(side=TOP,pady=2)
self.frame_score=Frame(self.frame_right)
self.score_value_label=Label(self.frame_score,text="分数",width=10)
self.score_value_label.pack(side=TOP)
self.score_value_label_tag=Label(self.frame_score,text=str(self.mark_value),
font=('Vandana',12),width=10)
self.score_value_label_tag.pack(side=TOP)
self.frame_score.pack(side=TOP,pady=10)
self.frame_shoot_down_num=Frame(self.frame_right)
self.pl_num_value_label=Label(self.frame_shoot_down_num,text="击落飞机\n数量")
self.pl_num_value_label.pack(side=TOP)
self.shoot_down_pl_num_tag=Label(self.frame_shoot_down_num,
text=str(self.shoot_down_plane_num_value),
font=('Vandana',12),width=10)
self.shoot_down_pl_num_tag.pack(side=TOP)
self.frame_shoot_down_num.pack(side=TOP,pady=10)
self.frame_button=Frame(self.frame_right)
start_pause_but=ttk.Button(self.frame_button,text='开始游戏')
start_pause_but.pack(side=TOP,pady=5,padx=3)
start_pause_but['command']=self.start_game_cmd
over_pause_but=ttk.Button(self.frame_button,text='结束游戏')
over_pause_but.pack(side=TOP,pady=5,padx=3)
over_pause_but['command']=over_game
self.frame_button.pack(side=TOP,pady=10)
self.root.mainloop()
5.游戏逻辑控制主模块
def start_game_cmd(self):
for i in self.canvas_show.find_all():#清空画布
self.canvas_show.delete(i)
self.plane_square()#初始化飞机函数
self.while_ci_1=0
self.over_tag=False
self.loaded_show_list=[]
self.objects_enemy_show=[]
self.space_enemy_tag=4
while True:
self.algorithm_pl_game()
#执行游戏算法
if self.over_tag==True:
#退出游戏算法,给出用户成绩,并且刷新历史记录
tkMessageBox.showinfo("提示","不好意思,你完蛋了!\n你的成绩:\n 分数 "+
str(self.mark_value)+" \n击落飞机数量 "+
str(self.shoot_down_plane_num_value)+" \n")
if int(self.height_record_val)<int(self.mark_value):
self.write_pkl_file(self.mark_value)
self.height_record_val=self.read_pkl_file()
self.score_value1_label_tag.conf