• 数组初学者向导:使用Python从零开始制作经典战舰游戏


    引言

    战舰游戏,一个广受欢迎的经典游戏,为玩家提供了策略与猜测的完美结合。这个游戏的核心思想是通过猜测敌方船只的位置并尝试击沉它们来赢得比赛。在这篇文章中,我们将使用Python语言和数组来构建这款游戏,让你更加了解数组的操作和实用性。

    1. 游戏概述

    在战舰游戏中,每位玩家都有一个10 x 10的网格,可以放置5艘船只。这些船只有不同的长度,并且可以横向或纵向放置。玩家和计算机轮流猜测对方网格上的坐标,并尝试“攻击”。如果某个坐标上有船,那么这个坐标就被标记为“被击中”。如果某艘船的所有坐标都被击中,那么这艘船就被认为是“被击沉”。当一个玩家的所有船只都被击沉时,游戏结束。

    2. 游戏设置

    我们首先需要为玩家和计算机设置10 x 10的游戏网格。在Python中,我们可以使用列表的列表(即数组)来实现这个网格。

    def create_board():
        """创建一个10x10的游戏网格"""
        return [["O"] * 10 for _ in range(10)]
    
    • 1
    • 2
    • 3

    这里,每个"O"代表一个空的网格位置。我们会在后续过程中更新这些位置来显示船只或攻击的结果。

    3. 船只的放置

    我们需要为玩家和电脑放置船只。为简单起见,我们假设每艘船的长度为3。这意味着每艘船都需要3个连续的网格位置。

    import random
    
    def place_ships(board, num_ships=5, ship_length=3):
        """在指定的游戏板上放置船只"""
        for _ in range(num_ships):
            while True:
                direction = random.choice(["horizontal", "vertical"])
                if direction == "horizontal":
                    row = random.randint(0, 9)
                    col = random.randint(0, 10 - ship_length)
                else:  # vertical
                    row = random.randint(0, 10 - ship_length)
                    col = random.randint(0, 9)
    
                # 检查该位置是否可用
                if direction == "horizontal":
                    if all([board[row][col + i] == "O" for i in range(ship_length)]):
                        for i in range(ship_length):
                            board[row][col + i] = "S"
                        break
                else:
                    if all([board[row + i][col] == "O" for i in range(ship_length)]):
                        for i in range(ship_length):
                            board[row + i][col] = "S"
                        break
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    在这里,我们首先随机选择放置船只的方向(横向或纵向)。然后,我们随机选择一个起始坐标,并检查这个坐标及其连续位置是否都为空。如果都为空,我们就在这些位置放置船只。

    注意:为了简洁和清晰,本文中的代码可能不是最优的或最完整的实现。为了获得完整的项目和更多的优化技巧,请下载完整项目

    4. 游戏循环与攻击

    在游戏开始之前,玩家和电脑都已经部署了他们的船只。现在,我们需要设置一个游戏循环,其中玩家和电脑轮流进行攻击。

    首先,我们定义一个函数来让玩家输入他想要攻击的坐标:

    def player_attack():
        """让玩家选择攻击的坐标"""
        while True:
            try:
                row, col = map(int, input("请输入你要攻击的坐标(例如: 5,3): ").split(','))
                if 0 <= row < 10 and 0 <= col < 10:
                    return row, col
                print("坐标必须在0-9之间。")
            except ValueError:
                print("请输入有效的坐标,例如: 5,3。")
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    接下来,我们定义一个函数让电脑随机选择一个攻击坐标:

    def computer_attack():
        """电脑随机选择攻击坐标"""
        return random.randint(0, 9), random.randint(0, 9)
    
    • 1
    • 2
    • 3

    现在,我们可以定义一个函数来执行实际的攻击:

    def attack(board, row, col):
        """在指定的坐标上执行攻击"""
        if board[row][col] == "S":
            board[row][col] = "H"  # Hit
            return "H"
        elif board[row][col] == "O":
            board[row][col] = "M"  # Miss
            return "M"
        else:
            return None  # 已经攻击过的位置
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    最后,我们需要一个游戏循环来处理玩家和电脑的轮流攻击:

    def game_loop(player_board, computer_board):
        """主游戏循环"""
        while True:
            # 玩家攻击
            row, col = player_attack()
            result = attack(computer_board, row, col)
            if result == "H":
                print("命中!")
                if all(cell == "M" or cell == "H" for row in computer_board for cell in row):
                    return "Player Wins"
            elif result == "M":
                print("失误!")
            else:
                print("你已经攻击过这个位置了!")
    
            # 电脑攻击
            row, col = computer_attack()
            result = attack(player_board, row, col)
            if result == "H":
                print(f"电脑命中了坐标 {row},{col}!")
                if all(cell == "M" or cell == "H" for row in player_board for cell in row):
                    return "Computer Wins"
            elif result == "M":
                print(f"电脑在坐标 {row},{col} 失误!")
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    5. 游戏结果展示

    游戏结束时,我们需要告诉玩家谁赢得了比赛。

    def display_result(winner):
        """展示游戏结果"""
        if winner == "Player Wins":
            print("恭喜你击败了电脑!")
        else:
            print("电脑赢得了比赛!")
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    6. 辅助功能:展示游戏板

    为了让玩家知道他们的游戏进度和船只的状态,我们需要一个函数来展示游戏板。

    def display_board(board):
        """展示指定的游戏板"""
        for row in board:
            print(" ".join(row))
        print("\n" + "-" * 20 + "\n")
    
    • 1
    • 2
    • 3
    • 4
    • 5

    这个函数会打印游戏板上的每一行,使其看起来更加整齐。

    7. 启动游戏

    现在,我们需要一个启动游戏的函数,将之前定义的所有函数组合起来:

    def start_game():
        """开始战舰游戏"""
        # 创建游戏板
        player_board = create_board()
        computer_board = create_board()
    
        # 放置船只
        place_ships(player_board)
        place_ships(computer_board)
    
        # 游戏主循环
        winner = game_loop(player_board, computer_board)
    
        # 展示结果
        display_result(winner)
    
        # 展示完整的电脑游戏板,以便玩家知道船只的位置
        print("电脑的游戏板:")
        display_board(computer_board)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    8. 总结

    通过本教程,我们使用Python和数组构建了一个简单的战舰游戏。在这个过程中,我们学习了如何创建和操作数组,如何随机放置船只,如何管理游戏循环,以及如何展示结果。

    这款游戏可以进一步完善和扩展。例如,你可以增加不同长度的船只,为电脑玩家添加更复杂的策略,或者增加更丰富的用户界面。

    我们鼓励你使用这篇文章作为起点,探索更多的功能和创新,从而进一步提高你的编程和问题解决能力。

    9. 扩展思路

    1. 增加不同类型的船只:船只可以有不同的大小,如航空母舰(5个单位长度)、战列舰(4个单位长度)等。
    2. 增加障碍物:在游戏板上添加障碍物,增加游戏的策略性和复杂性。
    3. 更智能的电脑玩家:你可以为电脑玩家设计更复杂的策略,比如基于前几次攻击的结果进行猜测等。
    4. 图形用户界面:使用Python的图形库,如Tkinter或Pygame,为游戏添加一个图形用户界面。

    这就是我们的完整战舰游戏教程!希望这篇文章能帮助你更加熟悉数组的概念,并鼓励你进一步探索编程的乐趣。

    注意:为了简洁和清晰,本文中的代码可能不是最优的或最完整的实现。为了获得完整的项目和更多的优化技巧,请下载完整项目

  • 相关阅读:
    PYTHON快捷键合集!学会让你成为大一最靓的仔
    Git高频命令【最实用命令】
    理想汽车×OceanBase:当造车新势力遇上数据库新势力
    美团二面算法题-输出每对有效括号内的内容;
    dockerfile关键字
    并发编程带来的安全性挑战之同步锁
    移动端项目创建,脚手架,vant3移动开发的UI组件
    Java PrintWriter.print()方法具有什么功能呢?
    转扩!寻找G2022次列车“旅客”
    VUE面试题
  • 原文地址:https://blog.csdn.net/m0_57781768/article/details/133033896