专栏名称: 申龙斌的程序人生
分享可繁殖的知识与技能:GTD时间管理、读书心得、个人成长、财富自由之路
目录
相关文章推荐
程序员的那些事  ·  “令人作呕!” 马斯克刚离职没几天就开喷了 ·  3 天前  
程序员的那些事  ·  不到 2 个月,OpenAI 火速用 ... ·  2 天前  
程序员的那些事  ·  疯了!我那些怀疑 AI ... ·  4 天前  
稀土掘金技术社区  ·  new Image() 预加载 为什么比 ... ·  3 天前  
腾讯技术工程  ·  腾讯的CMS管理系统能好用到什么程度 ·  2 天前  
51好读  ›  专栏  ›  申龙斌的程序人生

通过欧拉计划学Rust编程(第54题)

申龙斌的程序人生  · 公众号  · 程序员  · 2020-02-15 08:43

正文

请到「今天看啥」查看全文


其中有多少局玩家1获胜?




解题过程:

遇到一个复杂的问题,可以尝试将问题分解,变为一个个简单的情况,然后慢慢逼近最终的问题。

第一步: 先读文件,将玩家1和玩家2的牌分开。

第22题里已经学会了读文件,并且将字符串分隔成向量,再利用切片功能将前5个赋给玩家1,后5个赋给玩家2。

let data = std::fs::read_to_string("poker.txt").expect("打开文件出错");
let data2 = data.replace("\r\n", "\n");
let lines = data2.trim().split('\n');
for line in lines {
let hand1 = &line[..14];
let hand2 = &line[15..];
println!("{:?} {:?}", hand1, hand2);
}


第二步: 多文件管理

这个项目涉及到手牌、牌张、花色等概念,适合用面向对象的编程思路。Rust项目对多源文件的功能支持也相当不错,main.rs放主程序,poker.rs放扑克相关的模块。

一手牌Hand由多张牌Card组成,一个Card由牌点(用8位整数表示)和花色Suit构成,花色只有4种,适合用枚举表示。Rust里的枚举看上去与C/C#/Java等语言的枚举很像,但实际上它的功能远远不是一个简单的枚举。

// 文件poker.rs
pub enum Suit {
Spade, // 黑桃
Heart, // 红桃
Diamond, // 方块
Club, // 梅花
}

pub struct Card {
value: u8, // 214表示2, 3, ..., 10, J, Q, K, A
suit: Suit,
}

pub struct Hand {
cards: Vec,
}

main.rs需要加一行语句,告诉主程序要使用poker.rs中定义的模块。

mod poker;

这个时候,程序可以编译,会给出几个警告,提示Hand,Card和Suit这些类型从来没用过。


第三步: 构建一张牌Card

我们的任务要通过一个字符串构建出一个Card对象。比如,"8C"构建出梅花8,"TS"构建也黑桃10,"KC"为梅花K,"9H"为红桃9,"4S"为黑桃4。

这个时候要先学会Rust中的Trait概念,Trait这个东西很像Java/C#里的接口,但又不是。Rust内置不支持构造函数,下面这段代码相当于给Card定义了一个静态方法new(),相当于其它语言里的构造函数。

impl






请到「今天看啥」查看全文