基于Python/Tkinter的飞机大战单机小游戏

本文分享了一款使用Python和Tkinter库开发的飞机大战单机小游戏,旨在提供GUI编程学习的实践案例。游戏包括飞机控制、子弹发射、敌机生成与消除等功能。读者需要具备Tkinter GUI程序基本知识和Python语法基础。游戏可在Win32/Linux 32位环境下运行,代码行数约700行。包含初始化、读写配置文件、游戏界面及逻辑控制等模块。
摘要由CSDN通过智能技术生成

这是很早之前课余时间写的基于Python/Tkinter单机小游戏,用来练手,今天将代码贴出来,方便大家一起学习,通过Py/Tk对于学习GUI作为一个入口,其实是个不错入口,在这里推荐一下Tcl/Tk这门工具控制语言也是很好的脚本语言,对于快速构建应用GUI以及Demo都有不错的帮助(支持SWIG),国外有人将Tcl/Tk嵌入到C中,可以实现用C快速构建GUI,一直都想将实现这个目标,终因诸多因素搁浅,不能不说这是个遗憾...

注:打包好的win32位exe程序以及代码文件都已经上传到CSDN

游戏截图: 

游戏截图1

游戏截图2

阅读代码要求:需要读者对构建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
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值