Python小实验——尼姆游戏(即人机对战)

尼姆游戏游戏规则:两个玩家轮流从一堆物品中拿走一部分,在每一步中,玩家可以自由选择拿走多少物品,但必须至少拿走一个且最多只能拿走一半物品,然后轮到下一个玩家。拿走最后一个物品的玩家输掉游戏。

计算机玩家每次拿走一定数量的物品使得剩下的数量是2的幂次方减1一即3、7、15、 31、 63等。如果无法做到这一点,计算机则随机拿走一些。每次计算机玩家作为先手。
 

实验步骤:

1. 导入random库

import random

2. 设置输入物品个数

def __init__(self):
        self.number = 0  # 当前物品总数

3. 设计计算机玩家的拿法
计算机玩家拿取规则:
1)如果剩2个物品,计算机玩家只能拿1个

2)如果剩1个物品,计算机玩家不拿,直接宣布玩家胜利

3)拿走物品后,剩余数量为2的幂次方减1

def computer_turn(self):
        a = 0
        b = 0
        if self.number == 2:
            b = 1
        elif self.number == 1:
            print('游戏结束,你赢了')
            return 0
        else:
            while True:
                if pow(2, a) < self.number <= pow(2, a + 1):
                    break
                a = a + 1
            if self.number == pow(2, a + 1):
                b  = random.randint(1, int(self.number / 2))
            else:
                b  = self.number - (pow(2, a) - 1)
        return b

4. 设计人类玩家拿法

人类玩家拿取规则:

1)如果剩余数量为1,直接宣布计算机玩家胜利

2)每次拿取数量大于1,小于等于剩余数量的一半

def player_turn(self):
        if self.number == 1:
            print('游戏结束,你输了')
            return 0
        b  = int(input('请输入要拿走的物品个数:'))
        flag = b < 1 or b > int(self.number / 2)
        while flag:
            print('输入数据不符合游戏规则,请重新输入!')
            b = int(input('请输入要拿走的物品个数:'))
            flag = b < 1 or b > int(self.number / 2)
        return b

5. 设计游戏主程序

def begin(self):
        computer = 0
        player = 0
        self.number = int(input('请输入物品总数:'))
        while True:
            computer = self.computer_turn()
            if computer == 0:
                break
            else:
                self.number = self.number - computer
                print('电脑回合:拿走{:d}个物品,剩余{:d}个物品'.format(computer, self.number))
            player = self.player_turn()
            if player == 0:
                break
            else:
                self.number = self.number - player
                print('玩家回合:拿走{:d}个物品,剩余{:d}个物品'.format(player, self.number))

6.最外层用Game,完整代码如下

import random
class Game:
    def __init__(self):
        self.number = 0

    def computer_turn(self):
        a = 0
        b = 0
        if self.number == 2:
            b = 1
        elif self.number == 1:
            print('游戏结束,你赢了')
            return 0
        else:
            while True:
                if pow(2, a) < self.number <= pow(2, a + 1):
                    break
                a = a + 1
            if self.number == pow(2, a + 1):
                b  = random.randint(1, int(self.number / 2))
            else:
                b  = self.number - (pow(2, a) - 1)
        return b

    def player_turn(self):
        if self.number == 1:
            print('游戏结束,你输了')
            return 0
        b  = int(input('请输入要拿走的物品个数:'))
        flag = b < 1 or b > int(self.number / 2)
        while flag:
            print('输入数据不符合游戏规则,请重新输入!')
            b = int(input('请输入要拿走的物品个数:'))
            flag = b < 1 or b > int(self.number / 2)
        return b

    def begin(self):
        computer = 0
        player = 0
        self.number = int(input('请输入物品总数:'))
        while True:
            computer = self.computer_turn()
            if computer == 0:
                break
            else:
                self.number = self.number - computer
                print('电脑回合:拿走{:d}个物品,剩余{:d}个物品'.format(computer, self.number))
            player = self.player_turn()
            if player == 0:
                break
            else:
                self.number = self.number - player
                print('玩家回合:拿走{:d}个物品,剩余{:d}个物品'.format(player, self.number))


if __name__ == '__main__':
    game = Game()
    game.begin()

游戏示例:

尼姆游戏,也称为取反游戏(Nim),是一种经典的策略游戏,通常涉及两个玩家轮流从堆栈或一组物品中移除任意数量的项目,直到所有物品都被拿完。傻瓜模式(Dumb-Nim)是对传统规则的一种变体,假设对手总是采取最差的选择,即每次都会拿走剩余数目最多的物品。 在Python中实现一个人机对战尼姆游戏傻瓜模式,你可以按照以下步骤操作: 1. **初始化游戏状态**:创建一个列表表示初始的游戏物品数量,或让用户输入这些值。 ```python def initialize_game(): items = [int(item) for item in input("请输入物品数量(用逗号分隔):").split(",")] return items items = initialize_game() ``` 2. **检查游戏结束条件**:如果所有物品都是单个的,那么先手就赢了;否则游戏继续。 ```python def is_game_over(items): return all(len(item) == 1 for item in items) if is_game_over(items): print("你赢了!") else: ``` 3. **傻瓜模式下的人机对战**:玩家先移除,然后机器模拟对手最坏的选择。 ```python while not is_game_over(items): # 玩家移动 player_move = int(input("请输入你要移除的物品数量:")) if player_move > sum([len(item) for item in items]): print("错误,移除的数量超过了当前可用的物品数。") break else: for i, item in enumerate(items): if len(item) >= player_move: items[i] = item[player_move:] break else: items.pop(0) # 机器模拟对手移动 if items: machine_move = max(len(item) for item in items) items = [item(machine_move - len(item)) for item in items] else: print("电脑获胜!") ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值