mainとlibに分離した。一応これで完成。
成果物
コード
- janken/
- src/
- main.rs
- lib.rs
- src/
main.rs
use std::io::Write; use std::io::stdout; fn main() { loop { println!("じゃんけんゲーム"); print!("1:✊ 2:✌ 3:✋> "); stdout().flush(); let player: u32 = read_stdin(); let player = janken::Hand::from(player); let npc: janken::Hand = rand::random(); println!("{} {}", player, npc); let res = player.jadge(npc); println!("{}", res); } } fn read_stdin<T: std::str::FromStr>() -> T { let mut s = String::new(); std::io::stdin().read_line(&mut s).ok(); s.trim().parse().ok().unwrap() }
lib.rs
use rand::{distributions::{Distribution, Standard},Rng}; use std::io::Write; use std::io::stdout; #[derive(Debug,PartialEq)] pub enum Result { Win, Lose, Draw } impl std::fmt::Display for crate::Result { fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result { match *self { crate::Result::Win => write!(f, "Win!!"), crate::Result::Lose => write!(f, "Lose..."), crate::Result::Draw => write!(f, "Draw"), } } } #[derive(Debug,PartialEq)] pub enum Hand { Rock, Scissors, Paper } impl std::fmt::Display for Hand { fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result { match *self { Hand::Rock => write!(f, "✊"), Hand::Scissors => write!(f, "✌"), Hand::Paper => write!(f, "✋"), } } } impl From<u32> for Hand { fn from(hand: u32) -> Hand { match hand { 1 => Hand::Rock, 2 => Hand::Scissors, 3 => Hand::Paper, _ => panic!("手は1〜3のいずれかで指定してください。") } } } impl Distribution<Hand> for Standard { fn sample<R: Rng + ?Sized>(&self, rng: &mut R) -> Hand { Hand::from(rng.gen_range(1, 4)) } } impl Hand { pub fn jadge(&self, opponent: Hand) -> crate::Result { if *self == Hand::Rock && opponent == Hand::Scissors { crate::Result::Win } else if *self == Hand::Rock && opponent == Hand::Paper { crate::Result::Lose } else if *self == Hand::Scissors && opponent == Hand::Rock { crate::Result::Lose } else if *self == Hand::Scissors && opponent == Hand::Paper { crate::Result::Win } else if *self == Hand::Paper && opponent == Hand::Rock { crate::Result::Win } else if *self == Hand::Paper && opponent == Hand::Scissors { crate::Result::Lose } else { crate::Result::Draw } } }
所感
本当は最上位をjanken::Game.start();
みたいにしたかった。でも、無駄に冗長になりそうなのでやめた。
できればTUI版、GUI(GTK)版もつくってみたい。そうすれば、janken::{Cui,Tui,Gui}::start()
みたいにできるかな?
とりあえず、じゃんけんシリーズは一区切りついた。
対象環境
- Raspbierry pi 3 Model B+
- Raspbian stretch 9.0 2018-11-13
- bash 4.4.12(1)-release
- rustc 1.34.2 (6c2484dc3 2019-05-13)
- cargo 1.34.0 (6789d8a0a 2019-04-01)
$ uname -a Linux raspberrypi 4.19.42-v7+ #1219 SMP Tue May 14 21:20:58 BST 2019 armv7l GNU/Linux
前回まで
- Rust学習まとめ(ドキュメント)
- Rust自習(じゃんけんゲーム1)
- Rust自習(双方向リスト1)
- Rust自習(単方向リスト1)
- Rust自習(単方向リスト2)
- Rust自習(単方向リスト3)
- Rust自習(単方向リスト4)
- Rust自習(単方向リスト5)
- Rust自習(単方向リスト6)
- Rust自習(単方向リスト7)
- Rust自習(リストのインタフェースを考える)
- Rust自習(連結リスト1)
- Rust自習(連結リスト2)
- Rust自習(連結リスト3)
- Rust自習(連結リスト4)
- Rust自習(連結リストの取得系インタフェース考察)
- Rust自習(連結リスト5)
- Rust自習(連結リストの取得系インタフェース考察2)
- Rust自習(連結リスト6)
- Rust自習(連結リスト7)
- Rust自習(連結リスト8)
- Rust自習(連結リスト9)
- Rust自習(変数名でイテレートする方法)
- Rust自習(iter、iter_mut実装方法)
- Rust自習(連結リスト10)
- Rust自習(rev()実装できず)
- Rust自習(cycle()実装できず)
- Rust自習(じゃんけんゲーム2)
- Rust自習(じゃんけんゲーム3)
- Rust自習(じゃんけんゲーム4)
- Rust自習(じゃんけんゲーム5)
- Rust自習(じゃんけんゲーム6)
- Rust自習(じゃんけんゲーム7)