5 个稳定版本
使用旧 Rust 2015
2.1.0 | 2017年1月6日 |
---|---|
2.0.0 | 2017年1月5日 |
1.0.2 | 2016年12月31日 |
1000 在 Rust 模式 中
43KB
984 行
lib-battleship
一个用于实现战舰游戏的 Rust 库。
如何使用
您可以通过创建和配置一个 PreGame
对象来设置游戏,如下所示
extern crate lib_battleship;
use lib_battleship::PreGame;
use lib_battleship::common::Player::*;
use lib_battleship::common::Orientation::*;
use lib_battleship::results::ShootOk;
// when hard-coding the game's dimensions, use `unwrap()`.
// PreGame's constructor makes sure that the battlefield
// is no smaller than 2x2.
let mut pregame = PreGame::new(10, 10).unwrap();
// add ship types
// `PreGame` validates that a ship is no shorter
// than 1 in length, thus the call to `unwrap()`.
let sub = pregame.add_ship_type("Submarine", 1).unwrap();
let corvette = pregame.add_ship_type("Corvette", 2).unwrap();
然后每个玩家必须在战场上放置所有他们的船只。每个玩家有一种类型的每艘船。
// pregame also validates the placement of each ship.
pregame.place_ship(P1, &corvette, 0, 0, Horizontal).unwrap();
pregame.place_ship(P1, &sub, 9, 9, Horizontal).unwrap();
pregame.place_ship(P2, &corvette, 5, 5, Vertical).unwrap();
pregame.place_ship(P2, &sub, 3, 7, Horizontal).unwrap();
通过遍历其单元格来显示玩家的战场,如下所示
for y in 0..pregame.height() {
for x in 0..pregame.width() {
// PreGame::get_cell only returns Empty or Ship.
let char = match pregame.get_cell(P1, x, y) {
CellStatus::Empty => " ",
CellStatus::Ship => "X",
_ => unreachable!()
};
print!("{}", char);
}
println!("");
}
当所有船只都放置完毕后,开始游戏,如下所示
// pregame::start() checks that all ships have been
// placed and will complain if that's not the case.
let mut game = pregame.start().unwrap();
使用 Game::get_cell 和 Game::get_opponent_cell 显示相应的战场,类似于上面的 PreGame::get_cell。使用 Game::get_cell 来显示战场给其所有者,使用 Game::get_opponent_cell 来显示他们的对手的战场,其中未击中的单元格为空。
从现在起,玩家可以轮流射击对方的船只。只要得分,玩家就可以继续射击。
/// game validates that it's the shooting player's
/// turn and that they don't shoot out of bounds.
match game.shoot(P2, 0, 0).unwrap() {
ShootOk::Hit => println!("hit!"),
ShootOk::Miss => println!("miss!"),
ShootOk::Destroyed => println!("ship destroyed!"),
ShootOk::WinningShot => println!("you won!")
}