正文
其中有多少局玩家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, // 用2到14表示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