Rust小试牛刀之猜猜看游戏
Time: 20190919
学习主题
直接进入Rust实践阶段,涉及到如下几个概念:
- let
- match
- methods
- associated functions
- 使用
外部包
等
新建项目
cargo new guessing_game
cd guessing_game
猜猜看游戏逻辑
1.输入数据逻辑
首先,既然是猜测游戏,那一定先有数据输入进来。
然后要处理、检查输入。
因此第一步,我们先处理程序输入问题。
use std::io;fn main() {println!("猜数字~");println!("请输入一个数字:");let mut guess = String::new();io::stdin().read_line(&mut guess).expect("读取数据失败...");println!("你输入的数据是:{}", guess);
}
这简短的代码片段中包含的信息量还是蛮大的。
首先,处理输入,需要引入一个能够处理输入输出的库io
,这是标准包中的库,因此前缀是std
。
默认情况下,Rust只会引入少量的数据类型,如果想引入新的类型,工具,需要用use std::io;
这种语法。
程序的入口点
fn main() {}
函数是程序的入口函数。
fn
用于声明一个函数。
println!
是一个宏,用于打印数据到屏幕。
用变量存储数据
let mut guess = String::new();
let
用于声明一个变量,这种let foo = bar;
是将变量foo
绑定到bar
这个变量上。
非常值得注意的是,Rust
中声明的变量,默认是不可变的。如果想定义一个可变的变量,则用mut
显式声明。
let foo = 5; // 不可变
let mut bar = 5; // 可变
String::new();
这里涉及到两个概念:
- 基本类型
- 关联函数(定义在类型上的函数)
其中关联函数,在其他语言中也称作静态函数,这么一看就很好理解了。
这里的new
函数会创建一个空的字符串实例。
现在正式进入输入模块。
输入数据
要存储输入数据的变量已经准备完毕,就等着外部输入了。
io::stdin()
会返回一个std::io::Stdin
实例,Stdin
类型用于表示一个句柄,能够处理终端的输入。
然后调用Stdin
类型上的函数read_line
,用于读取标准输入句柄上的用户输入的内容,读取的结果存在guess
变量上。
read_line
的职能就是读取用户的任何输入并且将其存放到字符串中,因此它接收一个字符串类型变量当做输入参数。且需注意,这个字符串类型变量需要是可变的,因为该方法会修改字符串的内容(添加用户的输入内容)。
主要是这个语法有点奇怪:io::stdin().read_line(&mut guess)
,为何在guess
变量前添加&mut
修饰呢?
这和C++
中的引用参数是一个道理。
表示直接修改我们定义的变量guess
,而不是复制数据,生成新的变量,加mut
表示变量可变。
后面会再详细阐述Rust中的引用变量。
处理可能会遇到的失败问题,Result类型
read_line
函数会干两件事情:
- 将读取的数据存到变量
guess
- 返回一个
io::Result
类型
对于Result
而言,有两个变量值:
Ok
Err
在Result
类型上有一个函数可以调用.expect
,如果Result
结果是失败,则返回.expect()
函数中提供的信息。如果成功,则返回读取的值。
嗯,很合理。
打印数值,使用占位符
println!("You guessed: {}", guess);
不止可以使用一个占位符,可用多个,按照顺序即可:
#![allow(unused_variables)]
fn main() {let x = 5;
let y = 10;println!("x = {} and y = {}", x, y);
}
2.生成一个随机数字逻辑
生成一个让用户猜测的数值,用随机数生成器是最好的方式,人工指定,则游戏缺乏可玩性。
同时为了降低游戏的难度,我们限定生成的数字在1~100之间。
但是,问题是,在Rust标准库中,并不包含生成随机数的功能。但提供了一个可以生成随机数的包,rand crate
。
修改cargo包数据源
参考:https://blog.csdn.net/Buhdda/article/details/84399718
在~/.cargo
目录下新建config
文件,或者有这个文件的话修改内容为:
[source.crates-io]
replace-with = 'ustc'[source.ustc]
registry = "git://mirrors.ustc.edu.cn/crates.io-index"
即可使用国内源。
使用 rand crate
切换好镜像源之后,就可以使用cargo build
构建,会首先更新包索引,然后根据依赖项,安装依赖。依赖本身的依赖也会被获取。
Cargo.lock
此文件会记录第一次执行cargo build
时的依赖情况。
cargo update用于更新包
这个命令会忽略Cargo.lock
,按照Cargo.toml
中的指定的版本更新包。
完整的猜谜游戏代码
use std::io;
use rand::Rng;
use std::cmp::Ordering;fn main() {println!("猜数字游戏~");let secret_number = rand::thread_rng().gen_range(1, 101);// println!("生成的随机数是:{}", secret_number);loop {println!("输入数字:");let mut guess = String::new();io::stdin().read_line(&mut guess).expect("读取数据失败...");// parse()返回一个Result类型,这是个枚举类型,有Ok和Err两个值let guess: u32 = match guess.trim().parse() {Ok(num) => num,Err(_) => continue,};println!("你输入的数据是:{}", guess);// 模式匹配器match guess.cmp(&secret_number) {Ordering::Less => println!("猜小了!"), Ordering::Greater => println!("猜大了!"), Ordering::Equal => {println!("猜对了!");break; // 打断外层loop循环}}}
}
2019.10 Update:
第一届PAT算法直播课培训班招募帖,欢迎点击查看详情、
END.
参考
https://doc.rust-lang.org/book/ch02-00-guessing-game-tutorial.html#handling-potential-failure-with-the-result-type
Rust小试牛刀之猜猜看游戏相关推荐
- Rust程序设计语言-猜猜看游戏
在 Rust 中,变量默认是不可变的.下面的例子展示了如何在变量名前使用 mut 来使一个变量可变: let foo = 5; // 不可变 let mut bar = 5; // 可变 Rust 标 ...
- c#课程设计---猜猜看游戏
1:游戏要求 1. 随机显示 一个名字 与 若干张相片(如3张).选择正确的相片. 2. 记录老师对每一个学生的认识概率P.并依据认识概率,确定"猜猜看"游戏中学生出现的频率. 认 ...
- 《C#程序设计》猜猜看游戏开发总结
<猜猜看>游戏开发总结 一.开发目的 在校园中,我们经常遇到某个学生叫自己老师,但老师却想不出该学生的名字,彼此显得有点尴尬.不仅师生之间的互动交流会有这样的问题存在,就连我们身边的同学之 ...
- C#程序设计开发总结(猜猜看游戏开发)
<C#程序设计>开发总结 李 杰 信息学院:物联1121:201211672114 一.课程设计的任务 设计一个猜数字游戏程序,该游戏可以由程序产生随机数字,玩家通过输入数字来匹配程序生成 ...
- 用python玩转微信小游戏 大小猜猜看
用python玩转微信小游戏 大小猜猜看 游戏模式 在微信小程序里搜索"大小猜猜看",即可找到该游戏. 游戏的目标比拼计算能力,找出谁大谁小,一共有40题,全部答对即挑战成功. 一 ...
- 《JAVA程序设计》实训第三天——《猜猜看》游戏
基本的代码运行可以通过了.显示图片,猜猜看基本可以运行,游戏整体代码已经完成.就是统计猜对猜错次数那个还在努力,在查找中,不知能不能运行得了一个可以统计猜对猜错次数的猜猜看游戏. <pre na ...
- 《猜猜看》游戏的开发总结
<猜猜看>游戏的开发总结 1.最终成果 1.1课程设计的目的 把软件工程中规范的软件开发方法应用到本次教师认识学生软件"猜猜看"的开发过程中,以经济地开发出高质量的软件 ...
- 微信无法连接服务器501,微信成语猜猜看第501关BUG出现全是英文怎么过解决方法...
近日因为跳一跳许多微信小程序游戏异常火爆,其中就包括了成语猜猜看游戏,但是很多小伙伴向小编反应游戏之中出现了BUG,那么微信成语猜猜看BUG怎么办呢?为了帮助各位小伙伴,小编特意带来了成语猜猜看BUG ...
- C#“猜猜看”——物联网工程1122 黄炜彬
本次猜猜看游戏是基于Unity 3D平台进行开发,采用C scripts编写游戏脚本语言. 主要代码如下: using UnityEngine; using System.Collections; u ...
最新文章
- 目录文件和根目录文件夹
- oracle windows 使用,Oracle在windows上的安装及使用
- linux+取消磁盘阵列,Linux下彻底关闭某个RAID磁盘阵列
- java数据类型的一些注意事项
- python urlretrieve 管道_Python基础之 urllib模块urlopen()与urlretrieve()的使用方法详解。...
- Python递归实现汉诺塔
- C# / VB.NET合并PDF指定页
- 为什么linux默认都没有MP3和视频或者连FLASH都没有呢?
- 禁止访问磁盘的注册表
- Bluetooth handsfree 和 headset 区别
- golang断言的使用(Type Assertion)
- 软件工程实验一--编程随机生成30个四则运算,算数包括100以内的整数和真分数。...
- CAD2016软件安装教程
- GitHub客户端 Desktop使用
- arcpy批量重命名
- 转载_ANC降噪学习
- Word文档中快速插入分隔线的技巧_C#教程
- 电脑版的微信怎么打开连接到服务器地址,电脑端浏览器打开微信限制页面的方法...
- 计算机单位换换算,时间单位换算表与计算机单位换算
- Vegas Pro给视频加马赛克方法
热门文章
- mos管结电容等效模型_MOS管等效模型
- linux定位so快捷方式_5分钟带你了解Linux常用命令全称
- mysql2表连接优化性能_MySQL性能优化方法二:表结构优化
- python public_python中private、protectedamp;public
- java calendar 时分秒_Java中Calendar类的常用方法(对时间进行计算的类)
- python win32转pdf 横版_Python调用Win32com实现Office批量转PDF
- 函数重载函数的引用算重载吗_了解C ++中的函数重载
- 如何学习Web前端知识转型?
- Codeforces Round #544 (Div. 3) A.Middle of the Contest
- svn添加提交备注限制和自动发布web项目