如何为尼姆游戏(Nim)添加“再玩一次”功能并统计胜负次数

夏婷吖_1549

夏婷吖_1549

2026-05-15

490人浏览

原创

如何为尼姆游戏(Nim)添加“再玩一次”功能并统计胜负次数

本文详解如何在python实现的尼姆游戏中嵌套主循环,支持用户选择重复对局,并自动统计玩家胜/负场次,避免逻辑错位与状态残留问题。

本文详解如何在python实现的尼姆游戏中嵌套主循环,支持用户选择重复对局,并自动统计玩家胜/负场次,避免逻辑错位与状态残留问题。

要让尼姆游戏真正具备可重玩性,不能仅在单局逻辑内简单加一层 while,而需重构程序结构:将整局游戏封装为函数,并在外层用主循环控制是否重启,同时维护跨局的计分状态。

以下是优化后的完整实现方案(关键改动已高亮说明):

import random

def print_move(current_player, row, stick_quantity):
    if stick_quantity == 1:
        print(f"{current_player} takes {stick_quantity} stick from row {row}")
    else:
        print(f"{current_player} takes {stick_quantity} sticks from row {row}")

def display_sticks(sticks):
    """清晰显示当前每行火柴数(带行号和竖线)"""
    for i, count in enumerate(sticks, 1):
        print(f"{i}: {'|' * count}")

def get_player_move(sticks, name):
    """安全获取玩家输入,含完整校验"""
    while True:
        try:
            row = int(input(f"\n{name}, which row? (1-{len(sticks)}): "))
            if not (1  0]
    if not non_empty_rows:
        return None, None
    row_idx = random.choice(non_empty_rows)
    row = row_idx + 1
    stick_quantity = random.randint(1, sticks[row_idx])
    return row, stick_quantity

def play_one_game(name):
    """执行一局完整游戏,返回获胜者(name 或 'CPU')"""
    sticks = [1, 3, 5, 7]
    current_player = random.choice([name, "CPU"])
    print(f"\n--- New Game ---\n{current_player} goes first!")

    while sum(sticks) > 0:
        display_sticks(sticks)

        if current_player == name:
            row, stick_quantity = get_player_move(sticks, name)
            sticks[row - 1] -= stick_quantity
            print_move(current_player, row, stick_quantity)
            current_player = "CPU"
        else:
            row, stick_quantity = get_cpu_move(sticks)
            if row is None:  # 理论上不会发生,防错
                break
            sticks[row - 1] -= stick_quantity
            print_move(current_player, row, stick_quantity)
            current_player = name

    # 胜者是上一轮之后的 current_player(因取走最后一根者获胜,轮到对方时已无子可取)
    winner = "CPU" if current_player == name else name
    print(f"\n? Winner is {winner}!")
    return winner

# === 主程序入口:支持重复游玩 + 计分 ===
if __name__ == "__main__":
    print("Welcome to Nim!")
    name = input("Enter your name: ").strip() or "Player"

    # 初始化计分器
    wins = 0
    losses = 0

    replay = 'y'
    while replay.lower() == 'y':
        winner = play_one_game(name)
        if winner == name:
            wins += 1
        else:
            losses += 1

        # 询问是否再玩
        replay = input("\nPlay again? (y/n): ").strip()

    # 游戏结束总结
    print(f"\n{'='*40}")
    print(f"? Final Score for {name}:")
    print(f"✅ Wins: {wins}")
    print(f"❌ Losses: {losses}")
    if wins > losses:
        print("? You're the ultimate Nim master!")
    elif losses > wins:
        print("? CPU remains undefeated... for now.")
    else:
        print("⚖️  It's a perfect tie!")
    print(f"{'='*40}")

关键设计要点说明:

  • 函数化封装:play_one_game() 将单局逻辑完全隔离,确保每次重启时 sticks、current_player 等状态从零初始化,避免变量污染。
  • 计分持久化:wins/losses 在主循环外定义,跨局累加;replay.lower() == 'y' 支持大小写输入。
  • 健壮性增强:
    • get_player_move() 增加空行检查与范围提示;
    • display_sticks() 提升可读性(明确标注 row X:);
    • CPU逻辑加入 non_empty_rows 防错,杜绝 IndexError。
  • 胜负判定修正:原代码中 winner = current_player 存在逻辑错误(取走最后一根者应为胜者,而此时轮到对方),本实现通过轮换时机精准判断。

✅ 测试建议:运行后连续输入 y 多次,验证计分是否准确累加;输入 Y、yes、n、空格等边界值,确认程序鲁棒性。

通过这种结构化重构,你的尼姆游戏不仅实现了“再玩一次”的核心需求,更具备了生产级代码的可维护性与用户体验。

在线游戏
在线游戏

海量精品小游戏合集,无需安装即点即玩,休闲益智、动作闯关应有尽有,秒开即玩,轻松解压,快乐停不下来

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
python打包成可执行文件
python打包成可执行文件

本专题为大家带来python打包成可执行文件相关的文章,大家可以免费的下载体验。

2023.07.20

1691

4

python能做什么
python能做什么

python能做的有:可用于开发基于控制台的应用程序、多媒体部分开发、用于开发基于Web的应用程序、使用python处理数据、系统编程等等。本专题为大家提供python相关的各种文章、以及下载和课程。

2023.07.25

4284

7

format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.07.31

1689

3

python教程
python教程

Python已成为一门网红语言,即使是在非编程开发者当中,也掀起了一股学习的热潮。本专题为大家带来python教程的相关文章,大家可以免费体验学习。

2023.08.03

24977

23

python环境变量的配置
python环境变量的配置

Python是一种流行的编程语言,被广泛用于软件开发、数据分析和科学计算等领域。在安装Python之后,我们需要配置环境变量,以便在任何位置都能够访问Python的可执行文件。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.04

3047

5

python eval
python eval

eval函数是Python中一个非常强大的函数,它可以将字符串作为Python代码进行执行,实现动态编程的效果。然而,由于其潜在的安全风险和性能问题,需要谨慎使用。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.04

3067

5

scratch和python区别
scratch和python区别

scratch和python的区别:1、scratch是一种专为初学者设计的图形化编程语言,python是一种文本编程语言;2、scratch使用的是基于积木的编程语法,python采用更加传统的文本编程语法等等。本专题为大家提供scratch和python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

1163

5

python合并两个列表
python合并两个列表

Python是一种强大的编程语言,具有许多方便的功能和工具。在Python中,有多种方法可以合并两个列表。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.10

596

4

python是前端还是后端
python是前端还是后端

Python属于前端也属于后端,其灵活性和丰富的生态系统使得开发人员能够在不同的领域中灵活运用。本专题为大家提供python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

2383

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
phpStudy极速入门视频教程
phpStudy极速入门视频教程

共6课时 | 54.6万人学习

独孤九贱(4)_PHP视频教程
独孤九贱(4)_PHP视频教程

共89课时 | 133.4万人学习