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

Rust小练习,编写井字棋

在这里插入图片描述

画叉画圈的游戏通常指的是 井字棋(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 玩家或优化游戏体验。希望这个示例对你有帮助!

相关文章:

Rust小练习,编写井字棋

画叉画圈的游戏通常指的是 井字棋&#xff08;Tic-Tac-Toe&#xff09;&#xff0c;是一个简单的两人游戏&#xff0c;规则如下&#xff1a; 游戏规则 棋盘&#xff1a;游戏在一个3x3的方格上进行。玩家&#xff1a;有两个玩家&#xff0c;一个用“X”表示&#xff0c;另一个…...

RabbitMQ 入门(八)SpringAMQP消息转换器

一、消息转换器 Spring会把你发送的消息序列化为字节发送给MQ&#xff0c;接收消息的时候&#xff0c;还会把字节反序列化为Java对象。 只不过&#xff0c;默认情况下Spring采用的序列化方式是JDK序列化。众所周知&#xff0c;JDK序列化存在下列问题&#xff1a; - 数…...

【C++】一文带你深入理解C++异常机制

⭐️个人主页&#xff1a;小羊 ⭐️所属专栏&#xff1a;C 很荣幸您能阅读我的文章&#xff0c;诚请评论指点&#xff0c;欢迎欢迎 ~ 目录 前言一、C语言处理错误的方式二、C异常三、异常的使用3.1 异常的抛出和捕获3.2 异常的重新抛出3.3 异常安全3.4 异常规范 四、自定义异…...

Qt之QObject

简介 QObject是qt中所有对象的基类&#xff0c;也是信号槽的基础 结构 #mermaid-svg-mpp2FHEcRCzUK75S {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-mpp2FHEcRCzUK75S .error-icon{fill:#552222;}#mermaid-svg-…...

鸿蒙到底是不是纯血?到底能不能走向世界?

关注卢松松&#xff0c;会经常给你分享一些我的经验和观点。 2016年5月鸿蒙系统开始立项。 2018年美国开始经济战争&#xff0c;其中一项就是制裁华为&#xff0c;不让华为用安卓。 2019年8月9日华为正式发布鸿蒙系统。问题就出在这里&#xff0c;大家可以仔细看。 安卓一…...

【Android】MVP架构

MVP架构简介 MVP&#xff08;Model-View-Presenter&#xff09;是一种常见的软件架构模式&#xff0c;尤其在Android应用开发中被广泛使用。它将应用程序分为三层&#xff1a;Model、View 和 Presenter&#xff0c;以实现职责分离&#xff0c;提高代码的可维护性和可测试性。 …...

Web服务器之Nginx

Nginx&#xff08;发音为Engine X&#xff09;是一款开源的高性能HTTP和反向代理服务器&#xff0c;同时也提供了IMAP/POP3/SMTP服务。由伊戈尔赛索耶夫&#xff08;Igor Sysoev&#xff09;为俄罗斯访问量第二的Rambler.ru站点开发&#xff0c;Nginx自发布以来&#xff0c;凭借…...

【大模型实战篇】大模型分词算法Unigram及代码示例

1. 算法原理介绍 与 BPE 分词&#xff08;参考《BPE原理及代码示例》&#xff09;和 WordPiece 分词&#xff08;参考《WordPiece原理及代码示例》&#xff09;不同&#xff0c;Unigram 分词方法【1】是从一个包含足够多字符串或词元的初始集合开始&#xff0c;迭代地删除其中的…...

Dockerfile搭建ELK

使用 Dockerfile 安装 ELK 一、引言 ELK Stack&#xff08;Elasticsearch, Logstash, Kibana&#xff09;是一种流行的日志管理和分析解决方案。它允许用户实时搜索、分析和可视化日志数据。通过 Docker&#xff0c;可以方便地部署 ELK &#xff0c;快速获取一个功能齐全的日…...

在合规的地方怎么用EACO地球链兑换交换价值?

地球链EACO&#xff08;EarthChain&#xff0c;简称$E&#xff09;是一种虚拟数字资产。 目前在中国大陆&#xff0c;虚拟资产相关业务活动属于金融活动&#xff0c;包括虚拟资产的交易、兑换等操作&#xff0c;因此应该谨慎去寻求如何用它来交换价值。 虚拟资产交易炒作活动&…...

VS无法安装Win10SDK_10.0.2200,快捷方法

Visual Studio无法安装Win10SDK_10.0.2200&#xff0c;我在安装VS2019、2022提示&#xff0c;软件就不能编译。 因为之前安装过VS软件&#xff0c;重新安装软件提示“无法安装”。 原因 之前安装在D盘&#xff0c;现在没有D盘了 说明 因为电脑第一次安装VS&#xff0c;会自动安…...

github多个账号配置多个SSH秘钥

背景 对于有多个github账号的同学&#xff0c;需要配置多个ssh秘钥分别管理多个账号。 方法 1、生成多个SSH秘钥 # 为第一个 GitHub 账号生成密钥 ssh-keygen -t ed25519 -C "your_email_1example.com" -f ~/.ssh/id_ed25519_github_work# 为第二个 GitHub 账号生…...

静态/动态代理详解,一次性看完再也不会搞不清!

代理官方原文翻译&#xff1a; 给其他对象提供一个代理或者占位符&#xff0c;来控制对这个对象的访问。 代理最核心的思想&#xff1a; 在客户端和目标对象之间创建一个“中介”&#xff0c;用于保护目标对象和增强目标对象 静态代理&#xff1a; 该代理对象需要我们手动…...

Webserver(2)GCC

目录 安装GCCVScode远程连接到虚拟机编写代码gcc编译过程gcc与g的区别Xftp连接虚拟机上传文件 安装GCC sudo apt install gcc g查看版本是7.5 touch test.c创建代码 但是在虚拟机中写代码很不方便 VScode远程连接到虚拟机编写代码 gcc test.c -o app在虚拟机中用gcc编译的…...

mac电脑设置chrome浏览器语言切换为日语英语等不生效问题

在chrome中设置了语言&#xff0c;并且已经置顶了&#xff0c;但是不生效&#xff0c;在windows上直接有设置当前语言为chrome显示语言&#xff0c;但是mac上没有。 解决办法 在系统里面有一个单独给chrome设置语言的&#xff1a; 单独给它设定成指定的语言&#xff0c;然后重…...

Python中的人工智能框架与实例

在人工智能(AI)领域&#xff0c;Python因其简洁的语法、丰富的库和强大的社区支持&#xff0c;成为了最受欢迎的编程语言之一。本文将详细介绍Python中的人工智能框架&#xff0c;并通过具体实例展示如何使用这些框架来实现不同的人工智能应用。 一、Python中的人工智能框架 …...

论文阅读(二十六):Dual Attention Network for Scene Segmentation

文章目录 1.Introduction3.DANet3.1Position Attention Module3.2Channel Attention Module 论文&#xff1a;Dual Attention Network for Scene Segmentation   论文链接&#xff1a;Dual Attention Network for Scene Segmentation   代码链接&#xff1a;Github 1.Intr…...

Stack和Queue(3)

Stack和Queue&#xff08;3&#xff09; priority_queue的模拟实现 priority_queue.h #include <vector>namespace soobin {template<class T, class Container vector<T>>class priority_queue{public://强制生成默认构造priority_queue() default;temp…...

怎样把学生的成绩单独告知家长?

期中考试季的到来让校园里的气氛似乎也变得紧张起来。家长们开始频繁地联系老师&#xff0c;希望了解孩子的表现&#xff1b;孩子们则在考试后&#xff0c;绞尽脑汁地想出各种理由&#xff0c;以期在成绩不理想时能减轻家长的失望。老师们更是忙得不可开交&#xff0c;不仅要批…...

vue3父组件控制子组件表单验证及获取子组件数值方法

1、关键部分的代码如下&#xff0c;我努力交代清楚了&#xff0c;希望能让大家看懂。 <template><KeepAlive><component ref"comp" :is"compNames[steps[compIndex].comp]" /></KeepAlive><el-button click"prevBtn"…...

【JavaEE】【多线程】单例模式

目录 一、设计模式1.1 单例模式1.1.1 饿汉模式1.1.2 懒汉模式 1.2 线程安全问题1.3 懒汉模式线程安全问题的解决方法1.3.1 原子性问题解决1.3.2 解决效率问题1.3.3 解决内存可见性问题和指令重排序问题 一、设计模式 在讲解案例前&#xff0c;先介绍一个概念设计模式&#xff…...

Java.6--多态-设计模式-抽象父类-抽象方法

一、多态 1.定义--什么是多态&#xff1f; a.同一个父类的不同子类对象&#xff0c;在做同一行为的时候&#xff0c;有不同的表现形式&#xff0c;这就是多态。&#xff08;总结为&#xff1a;一个父类下的不同子类&#xff0c;同一行为&#xff0c;不同表现形式。&#xff0…...

JAVA Maven 的安装与配置

一、下载地址 官方网站&#xff1a;Maven – Download Apache Maven 我这里是3.8.6版本 二、安装步骤 maven安装之前要先安装jdk&#xff0c;请确保你的系统已经安装了jdk环境。 1.将下载好的 Maven 进行解压 apache-maven-3.6.8-bin.zip 2.配置本地仓库:修改 conf/settin…...

【程序分享】PCB元件坐标对齐工具 V1.3

↑↑↑点击上方蓝字&#xff0c;关注我们&#xff01; “PCB元件坐标对齐工具 V1.3”脚本程序在PCB文档中将元件的坐标自动移动到参考圆弧的中心&#xff0c;参考圆弧支持机械层1层和禁止布线层&#xff0c;参考图元的位置任意&#xff0c;不局限于栅格位置。 程序会自动…...

[bug] vllm 0.6.1 RuntimeError: operator torchvision::nms does not exist

[bug] vllm 0.6.1 RuntimeError: operator torchvision::nms does not exist 环境 python 3.10 torch 2.4.0cu118 torchvision 0.19.0cu118 vllm 0.6.1.post2cu118问题详情 if torch._C._d…...

处理Hutool的Http工具上传大文件报OOM

程序环境 JDK版本&#xff1a; 1.8Hutool版本&#xff1a; 5.8.25 问题描述 客服端文件上传主要代码&#xff1a; HttpRequest httpRequest HttpUtil.createPost(FILE_UPLOAD_URL); Resource urlResource new UrlResource(url, fileName); httpRequest.form("file&q…...

transforms的使用

示例代码 from PIL import Image from torch.utils.tensorboard import SummaryWriter from torchvision import transforms#打开该图片 img_path"hymenoptera_data/val/bees/10870992_eebeeb3a12.jpg" imgImage.open(img_path) writerSummaryWriter("logs&quo…...

python-PyQt项目实战案例:制作一个视频播放器

文章目录 1. 关键问题描述2. 通过OpenCV读取视频/打开摄像头抓取视频3. 通过PyQt 中的 QTimer定时器实现视频播放4. PyQt 视频播放器实现代码参考文献 1. 关键问题描述 在前面的文章中已经分享了pyqt制作图像处理工具的文章&#xff0c;也知道pyqt通过使用label控件显示图像的…...

反向传播的微积分原理 | Chapter 4 | Deep Learning | 3Blue1Brown

目录 前言1. 简介2. 神经网络中的链式法则3. 微积分的计算4. 公式含义5. 代价函数对权重偏置的敏感度6. 多个神经元的情形7. 回顾相关资料结语 前言 3Blue1Brown 视频笔记&#xff0c;仅供自己参考 这个章节主要来深度讲解反向传播中的一些微积分理论 官网&#xff1a;https://…...

matlab读取excel表格

使用matlab读取excel表格中的数据 使用推荐代码读取excel表格中的数据 path "C:\Users\24975\Desktop\503\GUI展示案例\Tx_20_0_Rx_40_90_0.1_95_L.xlsx";%文件路径 data readtable(path,Sheet,Sheet1,ReadRowNames,false,ReadVariableNames,false&#xff0c;Ra…...

企业网站制作心得/外链信息

分层好处&#xff1a; 1&#xff0c;复杂问题简单化&#xff1a;将复杂的任务分解成多层来完成&#xff0c;每一层只处理简单的任务&#xff0c;方便定位问题 2&#xff0c;减少重复开发&#xff1a;规范数据分层&#xff0c;通过中间层数据&#xff0c;能够减少极大的重复计算…...

做二维码的网站/北京建站工作室

文章目录SSH连接GitHub并配置ssh key一、设置Git的user name和email二、本地生成ssh key1、检查ssh keys是否存在2、生成ssh key3、将ssh key添加到ssh-agent三、配置git的ssh key1、将ssh key配置到github2、测试ssh key的配置情况SSH连接GitHub并配置ssh key 配置git的ssh提…...

阿雷网站建设公司/百度数据平台

在前后端完全分离的情况下&#xff0c;Vue项目中实现token验证大致思路如下&#xff1a; 1、第一次登录的时候&#xff0c;前端调后端的登陆接口&#xff0c;发送用户名和密码 2、后端收到请求&#xff0c;验证用户名和密码&#xff0c;验证成功&#xff0c;就给前端返回一个…...

南昌网站seo外包/网店培训

&#x1f3a0;&#x1f52e;导语&#xff1a; 好玩又考验智力的小游戏来了~每天上班上学之后太累就做个小游戏犒劳一下自己吧&#xff01;这期就是用python做迷宫小游戏分享给大家让我们愉快地开始吧~&#x1f3a0;想领取更多完整源码或Python学习资料可点击这行蓝色字体 &…...

a00000网站建设丽丽/免费网站统计代码

所有题目均有五种语言实现。C实现目录、C++ 实现目录、Python实现目录、Java实现目录、JavaScript实现目录<...

清河县网站建设/打开百度一下

需要给表单的 class 添加值 $(#id).addClass(required); 给表单的 class 移除值 $(#id).removeClass(required);...