跳转至

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. 按照游戏提示进行操作

到这里,我们就基本把整个游戏开发完成啦!下两节,我们将对游戏进行一些扩展和优化。