首页 > 其他分享 >Rust小练习,编写井字棋

Rust小练习,编写井字棋

时间:2024-10-21 23:20:43浏览次数:9  
标签:self 练习 玩家 井字棋 player board col Rust row

在这里插入图片描述

画叉画圈的游戏通常指的是 井字棋(Tic-Tac-Toe),是一个简单的两人游戏,规则如下:

游戏规则

  1. 棋盘:游戏在一个3x3的方格上进行。
  2. 玩家:有两个玩家,一个用“X”表示,另一个用“O”表示。
  3. 目标:玩家轮流在空格中填入自己的标记,目标是先在横向、纵向或斜向上连续放置三个相同的标记。
  4. 胜利条件:一旦有玩家先形成连续的三个标记,该玩家获胜。如果所有格子都填满且没有玩家获胜,则游戏平局。

示例棋盘

 X | O | X
-----------
 O | X | O
-----------
 O |   | X

在这个示例中,标记“X”在右列形成了三个相同的标记,因此“X”获胜。

游戏策略

虽然井字棋的规则简单,但为了增加趣味性,玩家可以在游戏中使用不同的策略,例如:

  • 尽量占据中心位置,以便于创建更多的胜利路径。
  • 阻止对手形成连续的三个标记。

井字棋游戏Rust示例实现代码

下面是一个简单的用 Rust 编写的井字棋(Tic-Tac-Toe)游戏示例。这个示例包括基本的游戏逻辑、玩家输入处理以及胜利条件的判断。

use std::io;

#[derive(Clone, Copy, PartialEq)]
enum Player {
    X,
    O,
}

#[derive(Clone)]
struct Game {
    board: [[Option<Player>; 3]; 3],
    current_player: Player,
}

impl Game {
    fn new() -> Self {
        Game {
            board: [[None; 3]; 3],
            current_player: Player::X,
        }
    }

    // 打印棋盘
    fn print_board(&self) {
        for row in &self.board {
            for cell in row {
                let display = match cell {
                    Some(Player::X) => " X ",
                    Some(Player::O) => " O ",
                    None => " . ",
                };
                print!("{}", display);
            }
            println!();
        }
    }

    // 玩家移动
    fn player_move(&mut self, row: usize, col: usize) -> bool {
        if self.board[row][col].is_none() {
            self.board[row][col] = Some(self.current_player);
            true
        } else {
            false
        }
    }

    // 检查胜利条件
    fn check_winner(&self) -> Option<Player> {
        // 检查行
        for row in 0..3 {
            if self.board[row][0].is_some()
                && self.board[row][0] == self.board[row][1]
                && self.board[row][1] == self.board[row][2]
            {
                return self.board[row][0];
            }
        }

        // 检查列
        for col in 0..3 {
            if self.board[0][col].is_some()
                && self.board[0][col] == self.board[1][col]
                && self.board[1][col] == self.board[2][col]
            {
                return self.board[0][col];
            }
        }

        // 检查对角线
        if self.board[0][0].is_some()
            && self.board[0][0] == self.board[1][1]
            && self.board[1][1] == self.board[2][2]
        {
            return self.board[0][0];
        }

        if self.board[0][2].is_some()
            && self.board[0][2] == self.board[1][1]
            && self.board[1][1] == self.board[2][0]
        {
            return self.board[0][2];
        }

        None
    }

    // 切换玩家
    fn switch_player(&mut self) {
        self.current_player = match self.current_player {
            Player::X => Player::O,
            Player::O => Player::X,
        };
    }

    // 检查平局
    fn is_draw(&self) -> bool {
        self.board.iter().all(|row| row.iter().all(|&cell| cell.is_some()))
    }
}

fn main() {
    let mut game = Game::new();

    loop {
        game.print_board();

        println!(
            "玩家 {:?},请输入行和列 (0-2) 用空格分隔:",
            game.current_player
        );

        let mut input = String::new();
        io::stdin().read_line(&mut input).unwrap();
        let coords: Vec<usize> = input
            .trim()
            .split_whitespace()
            .filter_map(|s| s.parse().ok())
            .collect();

        if coords.len() != 2 {
            println!("请输入两个数字!");
            continue;
        }

        let (row, col) = (coords[0], coords[1]);

        if row >= 3 || col >= 3 {
            println!("行和列必须在 0 到 2 之间!");
            continue;
        }

        if game.player_move(row, col) {
            if let Some(winner) = game.check_winner() {
                game.print_board();
                println!("玩家 {:?} 获胜!", winner);
                break;
            }

            if game.is_draw() {
                game.print_board();
                println!("游戏平局!");
                break;
            }

            game.switch_player();
        } else {
            println!("该位置已经被占用,请选择其他位置!");
        }
    }
}

代码说明

  1. 枚举和结构体

    • Player 枚举表示玩家,可能是 XO
    • Game 结构体表示游戏状态,包括棋盘和当前玩家。
  2. 游戏初始化

    • new() 方法创建一个新的游戏实例,初始化棋盘为空(None)并将当前玩家设置为 X
  3. 打印棋盘

    • print_board() 方法将棋盘的状态输出到终端,未占用的位置显示为 .,玩家的标记分别显示为 XO
  4. 玩家移动

    • player_move() 方法接受行和列参数,并在指定位置放置当前玩家的标记。若该位置已被占用则返回 false
  5. 胜利条件检查

    • check_winner() 方法检查当前棋盘是否有玩家获胜。它检查每行、每列和两个对角线。
  6. 切换玩家

    • switch_player() 方法在两个玩家之间切换。
  7. 平局检查

    • is_draw() 方法检查棋盘是否已满且没有获胜者,若是则返回 true
  8. 主循环

    • main 函数中,程序不断循环,直到游戏结束。
    • 每次循环打印当前棋盘,接收玩家输入,进行移动,检查胜利或平局,并切换玩家。

运行程序

  1. 依赖:这个程序不需要额外的依赖。
  2. 编译和运行:使用 Rust 工具链编译和运行程序。确保你已经安装了 Rust 环境。
    cargo run
    

总结

这个简单的井字棋游戏示例展示了如何使用 Rust 进行基本的输入处理、游戏状态管理和胜利条件检查。你可以在此基础上进行扩展,例如增加图形界面、实现更复杂的 AI 玩家或优化游戏体验。希望这个示例对你有帮助!

标签:self,练习,玩家,井字棋,player,board,col,Rust,row
From: https://blog.csdn.net/gzjimzhou/article/details/143135623

相关文章

  • Rust求解八皇后问题
    八皇后问题是一个经典的回溯算法问题,目的是在8x8的棋盘上放置8个皇后,使得它们不能相互攻击。也就是说,任意两个皇后不能在同一行、同一列或同一对角线上。这是一个使用Rust解决八皇后问题的完整代码,并附有详细的注解。Rust和Haskell等函数式语言不同,在处理递归或......
  • 刷c语言练习题9(牛客网)
    1、12345678char*getmemory(void){    charp[]= "helloworld";    returnp;}voidtest(void){    char*str=NULL;    str=getmemory(); printf(str);}请问运行Test函数会有什么样的结果?A、出错B、输出"helloworld"C、输出空......
  • LeetCode题练习与总结:区间和的个数--327
    一、题目描述给你一个整数数组 nums 以及两个整数 lower 和 upper 。求数组中,值位于范围 [lower,upper] (包含 lower 和 upper)之内的 区间和的个数 。区间和 S(i,j) 表示在 nums 中,位置从 i 到 j 的元素之和,包含 i 和 j (i ≤ j)。示例1:输入......
  • LeetCode题练习与总结:奇偶链表--328
    一、题目描述给定单链表的头节点 head ,将所有索引为奇数的节点和索引为偶数的节点分别组合在一起,然后返回重新排序的列表。第一个节点的索引被认为是 奇数 , 第二个节点的索引为 偶数 ,以此类推。请注意,偶数组和奇数组内部的相对顺序应该与输入时保持一致。你必须在 ......
  • 基于微信小程序的在线练习测试测验小程序(源码+lw+部署文档+讲解等)
    课题简介本课题聚焦于开发基于小程序的在线练习测试测验小程序。在数字化快速发展的当下,这样的小程序具有重大的现实意义。它能满足人们随时随地进行学习和自我检测的需求,打破传统学习的时间和空间限制。课题将运用先进的小程序开发技术,结合用户体验设计理念,打造一个功能......
  • 在Lua中实现Rust对象的绑定tT
    合集-算法(7)1.TimerWheel(计时轮)在Rust中的实现及源码解析06-122.Rust性能分析之测试及火焰图,附(lru,lfu,arc)测试06-183.Lru-k在Rust中的实现及源码解析06-214.带有ttl的Lru在Rust中的实现及源码解析06-24:westworld加速5.Lfu缓存在Rust中的实现及源码解析06-276.Rust宏之der......
  • 今天练习java语法·,看yxc的两个网课
    1.A+B(https://www.acwing.com/problem/content/1/)1importjava.util.Scanner;23publicclassMain{4publicstaticvoidmain(String[]args){5Scannersc=newScanner(System.in);6inta=sc.nextInt(),b=sc.nextInt();7......
  • 在Lua中实现Rust对象的绑定
    实现目标:能将Rust对象快速的映射到lua中使用,尽可能的简化使用。功能目标以structHcTestMacro为例:类型构建,在lua调用localval=HcTestMacro.new()可构建类型析构,在lua调用HcTestMacro.del(val)可析建,仅限lightuse**rdata字段的映射,假设有字段hc,我们需要能快速的进行字段......
  • Day10 备战CCF-CSP练习
    Day10题目描述十滴水是一个非常经典的小游戏。小\(C\)正在玩一个一维版本的十滴水游戏。我们通过一个例子描述游戏的基本规则。游戏在一个$1×c$的网格上进行,格子用整数$x(1≤x≤c)$编号,编号从左往右依次递增。网格内\(m\)个格子里有\(1∼4\)滴水,其余格子里没有......
  • uv 基于rust 编写的python 包管理以及项目管理工具
    uv基于rust编写的python包管理以及项目管理工具包含的特性简单工具可以替换pip,pip-tools,pipx,poetry,pyenv等比pip快10-100倍安装以及管理python版本运行以及安装python应用运行脚本支持类似cargo模式的workspace磁盘空间高效说明对于希望提示快速python包下......