当前位置:首页 > Rust > 正文

用Rust实现Nim游戏(从零开始掌握Rust语言与经典博弈算法)

欢迎来到这篇专为编程新手设计的教程!今天我们将使用Rust语言来实现一个经典的数学策略游戏——Nim游戏。无论你是刚接触编程,还是想学习游戏开发教程中的基础逻辑,这篇文章都将带你一步步完成整个过程。

用Rust实现Nim游戏(从零开始掌握Rust语言与经典博弈算法) Rust语言 Nim游戏算法 游戏开发教程 编程入门 第1张

什么是Nim游戏?

Nim是一种两人轮流取物的策略游戏。游戏开始时有若干堆石子,玩家每次可以从任意一堆中取走至少一个石子。谁取走最后一个石子,谁就获胜(或失败,取决于规则变种)。本教程采用“取最后一颗者胜”的标准规则。

为什么用Rust语言?

Rust是一门内存安全、高性能的系统编程语言,近年来在编程入门和工业级项目中都非常受欢迎。它通过所有权机制避免了常见的内存错误,同时语法清晰,非常适合学习算法和构建小型游戏。

项目结构概览

我们将创建一个简单的命令行版Nim游戏,包含以下功能:

  • 初始化三堆石子(例如:3、5、7)
  • 两名玩家轮流输入操作
  • 验证输入合法性
  • 判断胜负并结束游戏

完整代码实现

下面是我们用Rust编写的完整Nim游戏代码:

use std::io;fn main() {    // 初始化三堆石子    let mut piles = [3, 5, 7];    let mut current_player = 1;    println!("欢迎来到Nim游戏!");    println!("规则:每轮从一堆中取至少一个石子,取走最后一个石子的人获胜。");    loop {        print_piles(&piles);        // 检查是否游戏结束        if is_game_over(&piles) {            println!("玩家 {} 获胜!", if current_player == 1 { 2 } else { 1 });            break;        }        println!("\n玩家 {} 的回合:", current_player);        let (pile_index, stones_to_remove) = get_user_input();        // 验证输入是否合法        if pile_index >= piles.len() || piles[pile_index] == 0 {            println!("无效的堆编号!");            continue;        }        if stones_to_remove == 0 || stones_to_remove > piles[pile_index] {            println!("无效的石子数量!");            continue;        }        // 执行操作        piles[pile_index] -= stones_to_remove;        // 切换玩家        current_player = if current_player == 1 { 2 } else { 1 };    }}fn print_piles(piles: &[i32; 3]) {    println!("当前石子堆:");    for (i, &count) in piles.iter().enumerate() {        println!("  堆 {}: {} 颗", i + 1, count);    }}fn is_game_over(piles: &[i32; 3]) -> bool {    piles.iter().all(|&x| x == 0)}fn get_user_input() -> (usize, i32) {    let mut input = String::new();    println!("请输入堆编号和要取的石子数(格式:堆号 石子数,例如:1 2):");    io::stdin().read_line(&mut input).expect("读取输入失败");    let parts: Vec<&str> = input.trim().split_whitespace().collect();    if parts.len() != 2 {        return (0, 0); // 无效输入    }    let pile_index = parts[0].parse::().unwrap_or(0).saturating_sub(1);    let stones = parts[1].parse::().unwrap_or(0);    (pile_index, stones)}

代码详解

让我们逐段理解这段代码:

  • main函数:程序入口,初始化石子堆和当前玩家,并进入主循环。
  • print_piles:打印当前各堆石子数量。
  • is_game_over:检查所有堆是否为空,若为空则游戏结束。
  • get_user_input:读取用户输入并解析为堆编号和石子数量。

注意:堆编号在内部以0开始索引,但向用户显示时从1开始,因此需要做转换。

如何运行?

1. 安装Rust(访问 rust-lang.org
2. 创建新项目:cargo new nim_game
3. 将上述代码粘贴到 src/main.rs
4. 在终端运行:cargo run

总结

通过这个简单的项目,你不仅学会了Rust语言的基本语法(如变量、循环、函数、数组操作),还掌握了Nim游戏算法的核心逻辑。这是迈向更复杂游戏开发教程的重要一步,也为你的编程入门之路打下坚实基础。

尝试扩展功能吧!比如添加AI对手、支持更多堆、或实现“取最后一颗者输”的变种规则。祝你编码愉快!