Python实现聪明的尼姆游戏

尼姆游戏是个著名的游戏,有很多变种玩法。两个玩家轮流从一堆物品中拿走一部分。在每一步中,玩家可以自由选择拿走多少物品,但是必须至少拿走一个并且最多只能拿走一半物品,然后轮到下一个玩家。拿走最后一个物品的玩家则输掉游戏
在聪明模式中,计算机每次拿走一定数量的物品使得堆的大小是 2 的幂次方减 1—也就是 3、7、15、31、63 等。如果有一定数量的剩余物品,计算机就随机拿出一些。编写程序,模拟聪明版本的尼姆游戏。

先创建两个函数,一个用于玩家拿走商品,另一个用于电脑拿走商品。题目要求电脑要随机挑选,因此我们用到了random库中的choice方法,用法为random.choice(iterable),就是从序列中随机挑选一个元素。

import random

# 玩家拿走物品
def play(num):
    while True:
        try:
            if num == 1:
                print('请输入要拿走物品的数量(1)')
                take_num = int(input())
                assert take_num == 1
            else:
                print('请输入要拿走物品的数量(1-%d)' % (num / 2))
                take_num = int(input())
                assert 1 <= take_num <= num // 2
        except(ValueError, AssertionError):
            print('请正确输入数量!')
        else:
            break
    num -= take_num
    print('玩家拿走了', take_num, '个,还剩', num, '个')
    return num

# 电脑拿走物品
def computer(num):
    take_max = num // 2
    lst = []
    for i in range(1, num):
        temp = 2 ** i - 1
        if temp <= num - 1:
            lst.append(temp)
        else:
            break
    lst = list(filter(lambda y: num - y <= num // 2, lst))
    if lst:
        temp_lst = []
        for i in lst:
            x = num - i
            temp_lst.append(x)
        take_num = random.choice(temp_lst)
        num -= take_num
        print('电脑拿走了', take_num, '个,还剩', num, '个')
        return num
    else:
        take_num = random.randint(1, take_max)
        num -= take_num
        print('电脑拿走了', take_num, '个,还剩', num, '个')
        return num

while True:
    try:
        initial_value = int(input('请输入起始数量堆的大小:'))
    except(ValueError, AssertionError):
        print('请正确输入数量!')
    else:
        break
player = 1
computer_player = 1
# 依次循环玩家和电脑那走物品,若玩家先拿完则提前跳出循环,若电脑先拿完则正常退出循环
while computer_player and player:
    initial_value = play(initial_value)
    player = initial_value
    if player == 0 or player == 1:
        break
    initial_value = computer(initial_value)
    computer_player = initial_value
if player == 0:
    print('\n电脑胜利!')
else:
    print('电脑拿走了 1 个,还剩 0 个')
    print('\n玩家胜利!')

以上代码纯本人想法,若有更好的想法可留言一起探讨

到此这篇关于Python实现聪明的尼姆游戏的文章就介绍到这了,更多相关Python尼姆游戏内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • python入门游戏之井字棋实例代码

    目录 井字棋简介 实例代码 总结 井字棋简介 井字棋又称三子棋,英文名为Tic Tac Toe.具体玩法为在一个3x3的棋盘上,一个玩家用X做棋子,另一个玩家用O做棋子,谁先在棋盘上的一行.一列或对角线上画满三个棋子,即可获胜,如果棋盘下满无人胜出,即为平局. 实例代码 #要用的函数,可以在主程序用到时再看 def panduan1(a,b):#判断是否获胜,返回1则证明此颜色的棋获胜 x=0 if x==0: for i in range(3):#检索二维数组的第i行 q=0;p=0 for

  • Python修改游戏内存的方法

    目录 前言 游戏的安装 思路 一句话总结 大概的思路 实战 确定修改哪一款游戏的数据 代码 地址的寻找 视频教程 修改数据 代码 效果 完整的源码 所有的软件下载包 前言 大家好,我叫善念.上篇文章我许了一个愿,就是想让大家多多关注我,然后我的粉丝就蹭蹭的涨了好几百,谢谢大家的厚爱.可是我发现粉丝是涨了,三连变少了,谢谢大家这次给我三连,我一定再接再厉.有问题留在评论区,我会一一回复,谢谢大家! 这次要做的是修改一款单机游戏的数据,学过C语言的朋友肯定经常会看到有些老师讲这个案例,就是<植物大战

  • Python手机与电脑游戏脚本的编写方法

    目录 前言 分析(x0) 分析(x1) 那么如何去确定这个像素范围呢? 那么如何去判断出哪个块是黑块呢? 视频教程 源代码 关于pyautogui的安装 1.下载后安装 2.检测安装是否成功 前言 大家好,我叫善念.我发现我的粉丝量涨的很慢,这次厚脸皮要波关注.这次做的是一个小巧的游戏脚本,本质上它可以用于任意的电脑与手机游戏. 分析(x0) 这个游戏是4399上的"别猜百块儿", 意思就是让咱们只踩黑块,然后会给我们弹一手音乐. 我们来看看经典模式,选择pro,虽然我也不知道各种模式

  • Python实现聪明的尼姆游戏

    尼姆游戏是个著名的游戏,有很多变种玩法.两个玩家轮流从一堆物品中拿走一部分.在每一步中,玩家可以自由选择拿走多少物品,但是必须至少拿走一个并且最多只能拿走一半物品,然后轮到下一个玩家.拿走最后一个物品的玩家则输掉游戏 在聪明模式中,计算机每次拿走一定数量的物品使得堆的大小是 2 的幂次方减 1-也就是 3.7.15.31.63 等.如果有一定数量的剩余物品,计算机就随机拿出一些.编写程序,模拟聪明版本的尼姆游戏. 先创建两个函数,一个用于玩家拿走商品,另一个用于电脑拿走商品.题目要求电脑要随机挑

  • python实现尼姆游戏

    题目 尼姆游戏,这是一个著名的游戏,有很多变种玩法.两个玩家轮流从一堆物品中拿走一部分.在每一步中,玩家可以自由选择拿走多少物品,但是必须拿走一部并且最多只能拿走一半物品,然后轮到下一个玩家.拿走最后一个物品的玩家输掉游戏.先手随机. 代码运行效果 python代码 #/sur/bin/nve python # coding: utf-8 import os #用os.system(r'clear')清屏 import random #用random.randint()随机取数 def clea

  • Python+Pygame实战之吃豆豆游戏的实现

    目录 导语​ 一.首先 ​二.正式开始 三.效果展示 导语​ ​昨晚玩起了小时候玩的游戏“吃豆豆”,但是我发现,一局游戏三条命,我根本不能吃完所有的豆豆,总是被敌人吃掉 于是,我在想怎么能够保证我达到吃完所有豆豆的目标,然后我就想到了一个办法: 自己找资料找素材学习仿写了一款吃豆豆的小游戏,然后给我自己无限开挂! 哈哈哈!这不?完全解决了我的问题,完美的躺赢了!聪明的我.jpg 一.首先 1)素材 首先找到吃豆豆游戏的界面按照上面的素材找找准备下相似的图片!如下: 2)环境 本文的环境都跟之前的

  • python实现的简单猜数字游戏

    本文实例讲述了python实现的简单猜数字游戏.分享给大家供大家参考.具体如下: 给定一个1-99之间的数,让用户猜数字,当用户猜错时会提示用户猜的数字是过大还是过小,知道用户猜对数字为止,猜对数字用的次数越少成绩越好. import random n = random.randint(1, 99) guess = int(raw_input("Enter an integer from 1 to 99: ")) while n != "guess": print

  • Python基于pygame实现的font游戏字体(附源码)

    本文实例讲述了Python基于pygame实现的font游戏字体.分享给大家供大家参考,具体如下: 在pygame游戏开发中,一个友好的UI中,漂亮的字体是少不了的 今天就给大伙带来有关pygame中字体的一些介绍说明 首先我们得判断一下我们的pygame中有没有font这个模块 复制代码 代码如下: if not pygame.font: print('Warning, fonts disabled') 如果有的话才可以进行接下来的操作:-) 我们可以这样使用pygame中的字体: 复制代码

  • python实现的简单文本类游戏实例

    本文实例讲述了python实现的简单文本类游戏实现方法.分享给大家供大家参考.具体实现方法如下: ############################################################ # - My version on the game "Dragon Realm". # - taken from the book "invent with python" by Al Sweigart. # - thanks for a grea

  • python实现维吉尼亚算法

    本文实例为大家分享了python实现维吉尼亚算法的具体代码,供大家参考,具体内容如下 1 Virginia加密算法.解密算法 Vigenenre密码是最著名的多表代换密码,是法国著名密码学家Vigenenre发明的.Vigenenre密码使用一个词组作为密钥,密钥中每一个字母用来确定一个代换表,每一个密钥字母被用来加密一个明文字母,第一个密钥字母加密第一个明文字母,第二个密钥字母加密第二个明文字母,等所有密钥字母使用完后,密钥再次循环使用,于是加解密前需先将明密文按照密钥长度进行分组. 密码算法

  • python实现维吉尼亚加密法

    本文实例为大家分享了python实现维吉尼亚加密法的具体代码,供大家参考,具体内容如下 Vigenere加密/解密时,把英文字母映射为0-25的数字再进行运算,并按n个字母为一组进行变换.算法定义如下: 设密钥 k =(k1,k2,k3-,kn),明文 m = (m1,m2,-.mn),则加密算法为: Ek(m) = (c1,c2,-cn) 其中:c1 = (mi+ki)(mod 26),i=1,2,3-..n 解密算法为: mi = (ci - ki)(mod 26), i = 1,2,-..

  • 使用python和pygame制作挡板弹球游戏

    python是个很有趣的语言,可以在cmd命令窗口运行,还有很多的功能强大的模块. 学了一天pygame,用python和pygame写一个简单的挡板弹球游戏. 2018年6月21日 00:15:21 GitHub: EasyBaffleBallGame # -*- coding:utf-8 -*- from sys import exit import pygame from pygame.locals import * pygame.init() # 创建窗口 ScreenWidth = 5

  • python实现井字棋小游戏

    本文为大家分享了python实现井字棋小游戏,供大家参考,具体内容如下 周五晚上上了python的选修课,本来以为老师是从python的基础语法开始的,没想到是从turtle画图开始,正好补上了我以前一些不懂的地方,有人讲一下还是比啃书好一点. 之前从图书馆借了一本python游戏编程,看了前面几章后就没怎么看了,晚上突然想看看,然后跟着教程写个游戏的.最后就有了这个井字棋的诞生,其实代码并不是很长,主要是思路,需要考虑的周全一点.代码写完后就和电脑下了好久的井字棋,一局都没赢,真的是很无奈了,

随机推荐