当前位置:   article > 正文

Python基于tkinterGUI的冒险交互小游戏项目总结_tkinter游戏

tkinter游戏

前言

Python课程的作业,最初的版本是玩家使用文字进行游戏,但实际体验感相当差,现在利用GUI进行可视化交互,方便玩家进行游戏。

不过许多功能是为了踩点拿分做,代码结构现在回过来看看emmm。但总之对能跑起来,各个功能都可以正常运行,没啥大bug。

游戏说明

这是一款冒险游戏。玩家在一个破败的基地中醒来。玩家需要通过探索基地来寻找帮助其回家的物品,但也会有许多陷阱和宝藏。玩家需要在基地收集足够的钥匙,击败怪物方可逃离。

1.游戏地图

游戏地图为两张,分为一层和二层,只有收集所需武器以及钥匙才可以击杀最终boss

一层地图:

二层地图:

2.类图

3.代码

代码主要分为四个部分:GUI(负责界面交互)、Game(游戏主要逻辑)、Room(游戏房间设置)、Player(玩家HP、武器、钥匙等物品)

顺便设置了自动化测试(确保功能可以正常运行)以及log记录(方便玩家查看自己的行动历史)

GUI代码如下:

  1. import tkinter as tk
  2. from tkinter import messagebox, RIGHT, LEFT, TOP, NW, DISABLED, NORMAL, BOTTOM
  3. import tkinter
  4. from PIL import ImageTk, Image
  5. from Game import Game
  6. import datetime
  7. class MyGame_FIRSTUI:
  8. def __init__(self, root,PLAYER_IMAGE):
  9. '''
  10. User initial interface
  11. Enter user nickname
  12. :param root:
  13. '''
  14. # Create the model instance ...
  15. self.PLAYER_IMAGE=PLAYER_IMAGE
  16. #PLAYER_IMAGE=0
  17. self.root = root
  18. self.root.config()
  19. self.userframe = tk.Frame(self.root, width=1100, height=700)
  20. self.userframe.pack_propagate(0) # Prevents resizing
  21. self.userframe.pack()
  22. self.userframe.columnconfigure(0, pad=5)
  23. for i in range(7):
  24. self.userframe.rowconfigure(i, pad=5)
  25. self.start_image = ImageTk.PhotoImage(Image.open('images/welcome.png'))
  26. self.image1 = ImageTk.PhotoImage(Image.open("images/player.png"))
  27. self.image2 = ImageTk.PhotoImage(Image.open("images/player2.gif"))
  28. self.start = tk.Label(self.userframe, image=self.start_image, width=1100, height=300)
  29. self.start.grid(row=0,column=0)
  30. self. label = tk.Label(self.userframe, text='Please enter user name', font=('Sans', '15', 'bold'))
  31. self.label.grid(row=1, column=0)
  32. self.button = tk.Button(self.userframe, text='start', command=self.change,font=('Sans', '15', 'bold'))
  33. self.button.grid(row=3,column=0, ipady=10, pady=10)
  34. self.player_name = tk.Entry(self.userframe, text='player_name')
  35. self.player_name.grid(row=2,column=0, ipady=10, pady=10)
  36. self.label_w = tk.Label(self.userframe, text='Please choose your Avatar', font=('Sans', '15', 'bold'))
  37. self.label_w.grid(row=4,column=0)
  38. self.button_image1=tk.Button(self.userframe,image=self.image1,compound=tkinter.BOTTOM,text='Avatar 1', command=self.Avatar1)
  39. self.button_image1.grid(row=5, column=0)
  40. self.button_image2 = tk.Button(self.userframe, image=self.image2,compound=tkinter.BOTTOM,text='Avatar 2', command=self.Avatar2)
  41. self.button_image2.grid(row=6, column=0)
  42. def change(self):
  43. """
  44. close the firstUI and start the secondUI
  45. Global variable: PLAYER_NAME
  46. Error prevention and recovery
  47. """
  48. global PLAYER_NAME
  49. try:
  50. PLAYER_NAME = self.player_name.get()
  51. if PLAYER_NAME.isalpha() == False:
  52. raise (ValueError())
  53. except ValueError:
  54. messagebox.showinfo("NOTE",message="Please use String type!")
  55. else:
  56. self.userframe.destroy()
  57. myApp = MyGame_secondUI(self.root,self.PLAYER_IMAGE)
  58. def Avatar1(self):
  59. #global PLAYER_IMAGE
  60. self.PLAYER_IMAGE=1
  61. def Avatar2(self):
  62. #global PLAYER_IMAGE
  63. self.PLAYER_IMAGE=2
  64. class MyGame_secondUI:
  65. def __init__(self, root,PLAYER_IMAGE):
  66. '''
  67. The main interface of the game
  68. :param root:
  69. '''
  70. # Create the model instance ...
  71. self.PLAYER_IMAGE=PLAYER_IMAGE
  72. self.game = Game()
  73. self.res = False
  74. self.root = root
  75. self.people_x=225
  76. self.people_y=125
  77. self.nowroom='outside'
  78. # Create the GUI
  79. #add menubar
  80. menubar=tk.Menu()
  81. menubar.add_command(label="Quit",command=root.destroy)
  82. root.config(menu=menubar)
  83. menubar.add_command(label="About",command=self.about)
  84. root.config(menu=menubar)
  85. # add frame
  86. self.frame1 = tk.Frame(root, width=850,height=640, bg='GREY', borderwidth=2)
  87. self.frame1.pack_propagate(0) # Prevents resizing
  88. self.frame1.pack(side = LEFT)
  89. self.frame2 = tk.Frame(root, width=250, height=650, borderwidth=2)
  90. self.frame2.pack_propagate(0) # Prevents resizing
  91. self.frame2.pack(side = RIGHT)
  92. self.frame3 = tk.Frame(self.frame2, width=250, height=350, borderwidth=2)
  93. self.frame3.pack_propagate(0) # Prevents resizing
  94. self.frame3.pack(side = TOP)
  95. self.frame4 = tk.Frame(self.frame2, width=250, height=350, borderwidth=2)
  96. self.frame4.pack_propagate(0) # Prevents resizing
  97. self.frame4.pack(side = TOP)
  98. self.frame5 = tk.Frame(self.frame2, width=250, height=350, borderwidth=2)
  99. self.frame5.pack_propagate(0) # Prevents resizing
  100. self.frame5.pack(side=TOP)
  101. self.frame3.columnconfigure(0, pad=10)
  102. for i in range(6):
  103. self.frame3.rowconfigure(i,pad=10)
  104. for i in range(2):
  105. self.frame4.columnconfigure(i, pad=10)
  106. for i in range(4):
  107. self.frame4.rowconfigure(i,pad=10)
  108. #get images
  109. #global PLAYER_IMAGE
  110. if self.PLAYER_IMAGE==2:
  111. self.character = ImageTk.PhotoImage(Image.open("images/player2.gif"))
  112. else:
  113. self.character = ImageTk.PhotoImage(Image.open("images/player.png"))
  114. self.east = ImageTk.PhotoImage(Image.open("images/east.png"))
  115. self.west=ImageTk.PhotoImage(Image.open("images/west.png"))
  116. self.south=ImageTk.PhotoImage(Image.open("images/south.png"))
  117. self.north=ImageTk.PhotoImage(Image.open("images/north.png"))
  118. self.weapon = ImageTk.PhotoImage(Image.open("images/axe.png"))
  119. self.coin = ImageTk.PhotoImage(Image.open("images/coin.png"))
  120. self.heart=ImageTk.PhotoImage(Image.open("images/heart.png"))
  121. self.wolf= ImageTk.PhotoImage(Image.open("images/wolf.png"))
  122. self.bear= ImageTk.PhotoImage(Image.open("images/Bear_Run.png"))
  123. self.garden_bg= ImageTk.PhotoImage(Image.open("images/Garden.png"))
  124. self.oustide_bg= ImageTk.PhotoImage(Image.open("images/outside.jpg"))
  125. self.lab_bg=ImageTk.PhotoImage(Image.open("images/lab.png"))
  126. self.diningroom_bg=ImageTk.PhotoImage(Image.open("images/diningroom.png"))
  127. self.beasment_bg=ImageTk.PhotoImage(Image.open("images/basement.png"))
  128. self.shop_bg=ImageTk.PhotoImage(Image.open("images/shop.png"))
  129. self.lobby_bg=ImageTk.PhotoImage(Image.open("images/lobby.png"))
  130. self.gym_bg=ImageTk.PhotoImage(Image.open("images/gym.png"))
  131. self.loung_bg=ImageTk.PhotoImage(Image.open("images/loung.png"))
  132. self.portal_bg=ImageTk.PhotoImage(Image.open("images/portal.png"))
  133. self.office_bg=ImageTk.PhotoImage(Image.open("images/office.png"))
  134. self.storehouse_bg=ImageTk.PhotoImage(Image.open("images/storehouse.png"))
  135. self.destination_bg=ImageTk.PhotoImage(Image.open("images/destination.png"))
  136. self.corridor_bg = ImageTk.PhotoImage(Image.open("images/corridor.png"))
  137. self.logo=ImageTk.PhotoImage(Image.open("images/destination-logo.png"))
  138. self.key=ImageTk.PhotoImage(Image.open("images/Key.png"))
  139. #add button
  140. options = ['background introduction', 'button introduction'] # List with all options
  141. self.v = tk.StringVar(self.frame3)
  142. self.v.set("help") # default value
  143. self.v.trace("w", self.help)
  144. self.w = tk.OptionMenu(self.frame3, self.v, *options)
  145. self.w.grid(row=0, column=0)
  146. self.button_bag=tk.Button(self.frame3,text="use bag",command=lambda :self.usebag())
  147. self.button_bag.grid(row=1, column=0)
  148. self.button_weapon=tk.Button(self.frame3,text="weapon",image=self.weapon,compound=tkinter.BOTTOM,command=lambda :self.checkweapon())
  149. self.button_weapon.grid(row=4, column=0)
  150. #direction
  151. self.button_north=tk.Button(self.frame4,text="north",image=self.north,compound=tkinter.BOTTOM,
  152. command=lambda :self.North())
  153. self.button_north.grid(row=0, column=0)
  154. self.button_south = tk.Button(self.frame4, text="soth", image=self.south,compound=tkinter.BOTTOM,
  155. command=lambda: self.South())
  156. self.button_south.grid(row=0, column=1)
  157. self.button_west=tk.Button(self.frame4,text="west",image=self.west,compound=tkinter.BOTTOM,
  158. command=lambda :self.West())
  159. self.button_west.grid(row=1, column=0)
  160. self.button_east=tk.Button(self.frame4,text="east",image=self.east,compound=tkinter.BOTTOM,
  161. command=lambda :self.East())
  162. self.button_east.grid(row=1, column=1)
  163. self.stair=ImageTk.PhotoImage(Image.open("images/wooden_stairs-ns.png"))
  164. self.button_up=tk.Button(self.frame4,text="upstairs",image=self.stair,compound=tkinter.BOTTOM,command=lambda :self.Up())
  165. self.button_up.grid(row=2,column=0)
  166. self.button_down = tk.Button(self.frame4, text="downstairs",image=self.stair,compound=tkinter.BOTTOM,command=lambda :self.Down())
  167. self.button_down.grid(row=2,column=1)
  168. self.button_down.configure(state=DISABLED)
  169. #LABEL
  170. self.label_HP=tk.Label(self.frame5,text="Your life:"+str(self.game.player.life)+"HP",image=self.heart,compound=tkinter.LEFT)
  171. self.label_HP.pack(side=TOP)
  172. self.label_COIN=tk.Label(self.frame5,text="Your coin:"+str(self.game.player.coins),image=self.coin,compound=tkinter.LEFT)
  173. self.label_COIN.pack(side=TOP)
  174. self.label_KEY=tk.Label(self.frame5,text="Your key:"+str(self.game.player.total_keys),image=self.key,compound=tkinter.LEFT)
  175. self.label_KEY.pack(side=TOP)
  176. #picture_room
  177. self.cv=tk.Canvas(self.frame1,bg ='white',width=850,height=650)
  178. # Create rectangle with coordinates
  179. #garden=self.cv.create_rectangle(25, 25, 175, 100)
  180. self.garden=self.cv.create_image(25, 25, anchor=NW,image=self.garden_bg)
  181. self.cv.create_text(70, 35, text="GARDEN",fill="white")
  182. door1=self.cv.create_rectangle(75, 100, 125, 125,outline="",fill="grey")
  183. #corridor=self.cv.create_rectangle(25, 125, 175, 200)
  184. self.corridor=self.cv.create_image(25, 125,anchor=NW,image=self.corridor_bg)
  185. self.cv.create_text(70, 135, text="CORRIDOR",fill="white")
  186. door2 = self.cv.create_rectangle(75, 200, 125, 225,outline="",fill="grey")
  187. #lounge=self.cv.create_rectangle(25, 225, 175, 300)
  188. self.loung = self.cv.create_image(25, 225, anchor=NW, image=self.loung_bg)
  189. self.cv.create_text(70, 235, text="LOUNGE",fill="white")
  190. door3 = self.cv.create_rectangle(75, 300, 125, 325,outline="",fill="grey")
  191. #gym=self.cv.create_rectangle(25, 325, 175, 400)
  192. self.gym=self.cv.create_image(25, 325, anchor=NW, image=self.gym_bg)
  193. self.cv.create_text(70, 335, text="GYM",fill="white")
  194. door4 = self.cv.create_rectangle(75, 400, 125, 425,outline="",fill="grey")
  195. #destination=self.cv.create_rectangle(25, 425, 175, 500)
  196. self.destination = self.cv.create_image(25, 425, anchor=NW, image=self.destination_bg)
  197. self.cv.create_text(70,435, text="DISTINATION",fill="white")
  198. door5=self.cv.create_rectangle(175, 150, 225, 175,outline="",fill="grey")
  199. #outside=self.cv.create_rectangle(225, 125, 375, 200)
  200. self.outside = self.cv.create_image(225, 125, anchor=NW, image=self.oustide_bg)
  201. self.cv.create_text(270,135, text="OUTSIDE",fill="white")
  202. door6 = self.cv.create_rectangle(275,200,325,225,outline="",fill="grey")
  203. #lab=self.cv.create_rectangle(225,225,375,300)
  204. self.lab = self.cv.create_image(225,225, anchor=NW, image=self.lab_bg)
  205. self.cv.create_text(270,235, text="LAB",fill="white")
  206. door7 = self.cv.create_rectangle(275,300,325,325,outline="",fill="grey")
  207. #storehouse=self.cv.create_rectangle(225,325,375,400)
  208. self.storehouse = self.cv.create_image(225,325, anchor=NW, image=self.storehouse_bg)
  209. self.cv.create_text(270,335, text="STOREHOUSE",fill="white"
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/AllinToyou/article/detail/73783
推荐阅读
相关标签
  

闽ICP备14008679号