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小试牛刀之猜猜看游戏相关推荐

  1. Rust程序设计语言-猜猜看游戏

    在 Rust 中,变量默认是不可变的.下面的例子展示了如何在变量名前使用 mut 来使一个变量可变: let foo = 5; // 不可变 let mut bar = 5; // 可变 Rust 标 ...

  2. c#课程设计---猜猜看游戏

    1:游戏要求 1. 随机显示 一个名字 与 若干张相片(如3张).选择正确的相片. 2. 记录老师对每一个学生的认识概率P.并依据认识概率,确定"猜猜看"游戏中学生出现的频率. 认 ...

  3. 《C#程序设计》猜猜看游戏开发总结

    <猜猜看>游戏开发总结 一.开发目的 在校园中,我们经常遇到某个学生叫自己老师,但老师却想不出该学生的名字,彼此显得有点尴尬.不仅师生之间的互动交流会有这样的问题存在,就连我们身边的同学之 ...

  4. C#程序设计开发总结(猜猜看游戏开发)

    <C#程序设计>开发总结 李 杰 信息学院:物联1121:201211672114 一.课程设计的任务 设计一个猜数字游戏程序,该游戏可以由程序产生随机数字,玩家通过输入数字来匹配程序生成 ...

  5. 用python玩转微信小游戏 大小猜猜看

    用python玩转微信小游戏 大小猜猜看 游戏模式 在微信小程序里搜索"大小猜猜看",即可找到该游戏. 游戏的目标比拼计算能力,找出谁大谁小,一共有40题,全部答对即挑战成功. 一 ...

  6. 《JAVA程序设计》实训第三天——《猜猜看》游戏

    基本的代码运行可以通过了.显示图片,猜猜看基本可以运行,游戏整体代码已经完成.就是统计猜对猜错次数那个还在努力,在查找中,不知能不能运行得了一个可以统计猜对猜错次数的猜猜看游戏. <pre na ...

  7. 《猜猜看》游戏的开发总结

    <猜猜看>游戏的开发总结 1.最终成果 1.1课程设计的目的 把软件工程中规范的软件开发方法应用到本次教师认识学生软件"猜猜看"的开发过程中,以经济地开发出高质量的软件 ...

  8. 微信无法连接服务器501,微信成语猜猜看第501关BUG出现全是英文怎么过解决方法...

    近日因为跳一跳许多微信小程序游戏异常火爆,其中就包括了成语猜猜看游戏,但是很多小伙伴向小编反应游戏之中出现了BUG,那么微信成语猜猜看BUG怎么办呢?为了帮助各位小伙伴,小编特意带来了成语猜猜看BUG ...

  9. C#“猜猜看”——物联网工程1122 黄炜彬

    本次猜猜看游戏是基于Unity 3D平台进行开发,采用C scripts编写游戏脚本语言. 主要代码如下: using UnityEngine; using System.Collections; u ...

最新文章

  1. 目录文件和根目录文件夹
  2. oracle windows 使用,Oracle在windows上的安装及使用
  3. linux+取消磁盘阵列,Linux下彻底关闭某个RAID磁盘阵列
  4. java数据类型的一些注意事项
  5. python urlretrieve 管道_Python基础之 urllib模块urlopen()与urlretrieve()的使用方法详解。...
  6. Python递归实现汉诺塔
  7. C# / VB.NET合并PDF指定页
  8. 为什么linux默认都没有MP3和视频或者连FLASH都没有呢?
  9. 禁止访问磁盘的注册表
  10. Bluetooth handsfree 和 headset 区别
  11. golang断言的使用(Type Assertion)
  12. 软件工程实验一--编程随机生成30个四则运算,算数包括100以内的整数和真分数。...
  13. CAD2016软件安装教程
  14. GitHub客户端 Desktop使用
  15. arcpy批量重命名
  16. 转载_ANC降噪学习
  17. Word文档中快速插入分隔线的技巧_C#教程
  18. 电脑版的微信怎么打开连接到服务器地址,电脑端浏览器打开微信限制页面的方法...
  19. 计算机单位换换算,时间单位换算表与计算机单位换算
  20. Vegas Pro给视频加马赛克方法

热门文章

  1. mos管结电容等效模型_MOS管等效模型
  2. linux定位so快捷方式_5分钟带你了解Linux常用命令全称
  3. mysql2表连接优化性能_MySQL性能优化方法二:表结构优化
  4. python public_python中private、protectedamp;public
  5. java calendar 时分秒_Java中Calendar类的常用方法(对时间进行计算的类)
  6. python win32转pdf 横版_Python调用Win32com实现Office批量转PDF
  7. 函数重载函数的引用算重载吗_了解C ++中的函数重载
  8. 如何学习Web前端知识转型?
  9. Codeforces Round #544 (Div. 3) A.Middle of the Contest
  10. svn添加提交备注限制和自动发布web项目