Topic 4.4 - 整合各个游戏功能到主程序¶
1. 完善主程序¶
通过前面几节,我们基本上完成了各个游戏功能模块的开发。现在,我们需要将这些模块整合到主程序中,使得游戏能够顺利运行。
- 其实,我们在前面的章节中,已经完成了主程序的框架代码
- 我们只需要把完善好的接口调用进去就行,顺便加点界面优化和日志记录
# src/main.py
from config import Config
from ui import UI
from world import World
from logger import Logger
class Program:
def run(self):
# 记录程序开始
Logger.log_write("系统日志 -- 程序开始运行")
# 游戏主循环
while True:
# 展示标题和菜单
UI.display_title()
UI.display_menu()
print("-" * 40)
# 获取玩家输入
choice = input("请输入选项:")
print("-" * 40)
if choice == "p":
while True:
# 展示游戏难度选择菜单
print("请选择游戏难度:")
print("0. 新手(超小地图)")
print("1. 简单(小地图)")
print("2. 普通(中地图)")
print("3. 困难(大地图)")
print("q. 返回主菜单")
print("-" * 40)
choice_play = input("请选择游戏难度:").strip()
print("-" * 40)
# 根据选择启动游戏
if choice_play == "0":
Logger.log_write("系统日志 -- 游戏开始,难度:新手(超小地图)")
self.start_game(f"{Config.PATH_DATA}/map/map_tiny.txt")
Logger.log_write("系统日志 -- 游戏结束,难度:新手(超小地图)")
break # 默认跳出难度选择循环,返回主菜单
elif choice_play == "1":
Logger.log_write("系统日志 -- 游戏开始,难度:简单(小地图)")
self.start_game(f"{Config.PATH_DATA}/map/map_small.txt")
Logger.log_write("系统日志 -- 游戏结束,难度:简单(小地图)")
break # 默认跳出难度选择循环,返回主菜单
elif choice_play == "2":
Logger.log_write("系统日志 -- 游戏开始,难度:普通(中地图)")
self.start_game(f"{Config.PATH_DATA}/map/map_medium.txt")
Logger.log_write("系统日志 -- 游戏结束,难度:普通(中地图)")
break # 默认跳出难度选择循环,返回主菜单
elif choice_play == "3":
Logger.log_write("系统日志 -- 游戏开始,难度:困难(大地图)")
self.start_game(f"{Config.PATH_DATA}/map/map_large.txt")
Logger.log_write("系统日志 -- 游戏结束,难度:困难(大地图)")
break # 默认跳出难度选择循环,返回主菜单
elif choice_play == "q":
break # 返回主菜单
else:
print("无效的选项,请重新输入!")
if choice == "r":
UI.display_rule()
if choice == "q":
print("感谢游玩,期待下次再见!")
break
def start_game(self, map_path):
world = World(map_path)
print("游戏开始!")
print("使用 w/a/s/d 控制上下左右移动,q 退出本局游戏。")
print("-" * 40)
while True:
world.map_show()
cmd = input("您的指令:").strip().lower()
if cmd == 'q':
print("你退出了本次游戏。")
Logger.log_write("游戏日志 -- 玩家退出游戏")
break
elif cmd == 'w':
world.move_player(0, -1)
elif cmd == 's':
world.move_player(0, 1)
elif cmd == 'a':
world.move_player(-1, 0)
elif cmd == 'd':
world.move_player(1, 0)
else:
print("无效的命令,请重新输入!")
if not world.player.is_alive():
print("你的生命值归零,游戏结束。")
Logger.log_write("游戏日志 -- 游戏结束,玩家失败")
break
if world.monsters == {}:
print("恭喜你,击败了所有怪物,赢得了游戏!")
Logger.log_write("游戏日志 -- 游戏结束,玩家胜利")
break
input("按回车返回主菜单...")
if __name__ == "__main__":
program = Program()
program.run()
我们尝试运行一下主程序,运行一下最小的地图,看看效果如何:
================================
= ███████╗███╗ ██╗██████╗ =
= ██╔════╝████╗ ██║██╔══██╗ =
= █████╗ ██╔██╗ ██║██║ ██║ =
= ██╔══╝ ██║╚██╗██║██║ ██║ =
= ██║ ██║ ╚████║██████╔╝ =
= ╚═╝ ╚═╝ ╚═══╝╚═════╝ =
================================
= 勇士与地下城 =
================================
请选择:
p. 开始游戏
r. 查看规则
q. 退出游戏
----------------------------------------
请输入选项:p
----------------------------------------
请选择游戏难度:
0. 新手(超小地图)
1. 简单(小地图)
2. 普通(中地图)
3. 困难(大地图)
q. 返回主菜单
----------------------------------------
请选择游戏难度:0
----------------------------------------
游戏开始!
使用 w/a/s/d 控制上下左右移动,q 退出本局游戏。
----------------------------------------
############
#P.S^^^^^^^#
#...D..~~~~#
#H..M..M..M#
############
您的指令:d
############
#.PS^^^^^^^#
#...D..~~~~#
#H..M..M..M#
############
您的指令:d
你捡到了剑,攻击力为: 10 点!
############
#..P^^^^^^^#
#...D..~~~~#
#H..M..M..M#
############
您的指令:s
############
#...^^^^^^^#
#..PD..~~~~#
#H..M..M..M#
############
您的指令:d
你捡到了盾牌,防御力为: 6 点!
############
#...^^^^^^^#
#...P..~~~~#
#H..M..M..M#
############
您的指令:s
【战斗开始】 玩家 VS 怪物
你的有效攻击:7
怪物的有效攻击:2
--- 第 1 回合 ---
玩家 攻击了 怪物,怪物 剩余血量:13
怪物 攻击了 玩家,玩家 剩余血量:28
--- 第 2 回合 ---
玩家 攻击了 怪物,怪物 剩余血量:6
怪物 攻击了 玩家,玩家 剩余血量:26
--- 第 3 回合 ---
玩家 攻击了 怪物,怪物 剩余血量:0
怪物 被击败了!
怪物被击败!
############
#...^^^^^^^#
#......~~~~#
#H..P..M..M#
############
您的指令:a
############
#...^^^^^^^#
#......~~~~#
#H.P...M..M#
############
您的指令:a
############
#...^^^^^^^#
#......~~~~#
#HP....M..M#
############
您的指令:a
你捡到了生命药水,生命值为: 36 点!
############
#...^^^^^^^#
#......~~~~#
#P.....M..M#
############
您的指令:d
############
#...^^^^^^^#
#......~~~~#
#.P....M..M#
############
您的指令:d
############
#...^^^^^^^#
#......~~~~#
#..P...M..M#
############
您的指令:d
############
#...^^^^^^^#
#......~~~~#
#...P..M..M#
############
您的指令:d
############
#...^^^^^^^#
#......~~~~#
#....P.M..M#
############
您的指令:d
############
#...^^^^^^^#
#......~~~~#
#.....PM..M#
############
您的指令:d
【战斗开始】 玩家 VS 怪物
你的有效攻击:7
怪物的有效攻击:2
--- 第 1 回合 ---
玩家 攻击了 怪物,怪物 剩余血量:13
怪物 攻击了 玩家,玩家 剩余血量:34
--- 第 2 回合 ---
玩家 攻击了 怪物,怪物 剩余血量:6
怪物 攻击了 玩家,玩家 剩余血量:32
--- 第 3 回合 ---
玩家 攻击了 怪物,怪物 剩余血量:0
怪物 被击败了!
怪物被击败!
############
#...^^^^^^^#
#......~~~~#
#......P..M#
############
您的指令:d
############
#...^^^^^^^#
#......~~~~#
#.......P.M#
############
您的指令:d
############
#...^^^^^^^#
#......~~~~#
#........PM#
############
您的指令:d
【战斗开始】 玩家 VS 怪物
你的有效攻击:7
怪物的有效攻击:2
--- 第 1 回合 ---
玩家 攻击了 怪物,怪物 剩余血量:13
怪物 攻击了 玩家,玩家 剩余血量:30
--- 第 2 回合 ---
玩家 攻击了 怪物,怪物 剩余血量:6
怪物 攻击了 玩家,玩家 剩余血量:28
--- 第 3 回合 ---
玩家 攻击了 怪物,怪物 剩余血量:0
怪物 被击败了!
怪物被击败!
恭喜你,击败了所有怪物,赢得了游戏!
按回车返回主菜单...
================================
= ███████╗███╗ ██╗██████╗ =
= ██╔════╝████╗ ██║██╔══██╗ =
= █████╗ ██╔██╗ ██║██║ ██║ =
= ██╔══╝ ██║╚██╗██║██║ ██║ =
= ██║ ██║ ╚████║██████╔╝ =
= ╚═╝ ╚═╝ ╚═══╝╚═════╝ =
================================
= 勇士与地下城 =
================================
请选择:
p. 开始游戏
r. 查看规则
q. 退出游戏
----------------------------------------
请输入选项:q
----------------------------------------
感谢游玩,期待下次再见!
看到这个结果,就说明我们的主程序已经成功整合了各个功能模块,游戏可以顺利运行啦!
2. 编写 README.md 文件¶
由于我们没有使用任何第三方库,因此 requirements.txt 文件可以为空,我们这里只编写 README.md 文件,介绍游戏的玩法和运行方法:
# 勇士与地下城
## 游戏介绍
《勇士与地下城》是一款基于文本的冒险游戏。玩家将扮演一名勇士,在地下城中探索、战斗并收集宝物,最终击败所有怪物,赢得胜利。
## 游戏玩法
- 进入游戏后按照菜单提示选择游戏难度。
- 使用 `w/a/s/d` 控制勇士上下左右移动。
- 遇到怪物时会自动进入战斗,战斗采用回合制。
- 收集地图上的道具可以提升勇士的属性。
- 当勇士的生命值归零时,游戏结束。
- 击败所有怪物即为胜利。
## 运行方法
1. 克隆本仓库到本地
2. 进入项目目录
3. 运行主程序 `python src/main.py`
4. 按照游戏提示进行操作
到这里,我们就基本把整个游戏开发完成啦!下两节,我们将对游戏进行一些扩展和优化。