5 个稳定版本

使用旧 Rust 2015

2.1.0 2017年1月6日
2.0.0 2017年1月5日
1.0.2 2016年12月31日

1000Rust 模式

X11 许可证

43KB
984

lib-battleship

Build Status

一个用于实现战舰游戏的 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!")
}

无运行时依赖