4个稳定版本
1.1.2 | 2021年5月27日 |
---|---|
1.1.1 | 2021年5月1日 |
1.1.0 | 2021年4月21日 |
1.0.0 | 2021年2月4日 |
#273 in 游戏
每月23次下载
555KB
14K SLoC
rust-sc2
StarCraft II API的Rust实现
该库旨在简单易用,同时非常快速和功能丰富。然而,它提供了高、低层次抽象。此库受到 python-sc2 库的启发,因此人们可能会发现它很容易切换到 rust-sc2。它最初创建的原因是其他Rust库过时、功能不足且为低层次。
请随时在这些Discord服务器的 #rust
频道中提问
入门指南
安装 Rust >= 1.42.0
警告:在 rustc 1.45.0 - 1.46.0 中编译失败,您将获得以下错误
thread 'rustc' has overflowed its stack
error: could not compile `rust-sc2`.
在 Cargo.toml 中添加依赖项
[dependencies]
rust-sc2 = "1.1.0"
或者如果您想直接从GitHub获取开发者版本
[dependencies]
rust-sc2 = { git = "https://github.com/UltraMachine/rust-sc2" }
30行以下的简单竞技机器人
use rust_sc2::prelude::*;
#[bot]
#[derive(Default)]
struct WorkerRush;
impl Player for WorkerRush {
fn get_player_settings(&self) -> PlayerSettings {
PlayerSettings::new(Race::Protoss)
}
fn on_start(&mut self) -> SC2Result<()> {
for worker in &self.units.my.workers {
worker.attack(Target::Pos(self.enemy_start), false);
}
Ok(())
}
}
fn main() -> SC2Result<()> {
let mut bot = WorkerRush::default();
run_vs_computer(
&mut bot,
Computer::new(Race::Random, Difficulty::Medium, None),
"EternalEmpireLE",
Default::default(),
)
}
更多高级示例请参阅 examples
文件夹。
可选功能
"rayon"
- 启用并行性并使所有类型线程安全"serde"
- 为 ids, Race, GameResult, ... 等添加Serialize
,Deserialize
实现
逐步制作机器人
首先,导入 rust-sc2 库
use rust_sc2::prelude::*;
创建您的机器人结构体(可以是 Unit 或 C-like)
#[bot]
struct MyBot;
#[bot]
struct MyBot {
/* fields here */
}
然后为您的机器人实现 Player
特性
// You mustn't call any of these methods by hands, they're for API only
impl Player for MyBot {
// Must be implemented
fn get_player_settings(&self) -> PlayerSettings {
// Race can be Terran, Zerg, Protoss or Random
PlayerSettings::new(Race::Random)
}
// Methods below aren't necessary to implement (Empty by default)
// Called once on first step
fn on_start(&mut self) -> SC2Result<()> {
/* your awesome code here */
}
// Called on every game step
fn on_step(&mut self, iteration: usize) -> SC2Result<()> {
/* your awesome code here */
}
// Called once on last step
// "result" says if your bot won or lost game
fn on_end(&self, result: GameResult) -> SC2Result<()> {
/* your awesome code here */
}
// Called on different events, see more in `examples/events.rs`
fn on_event(&mut self, event: Event) -> SC2Result<()> {
/* your awesome code here */
}
}
您还可以添加构建方法
impl MyBot {
// It's necessary to have #[bot_new] here
#[bot_new]
fn new() -> Self {
Self {
/* initializing fields */
}
}
}
如果您的机器人实现了 Default
,您可以简单地调用 MyBot::default()
,但如果您想对初始化器有更多控制
impl MyBot {
// You don't need #[bot_new] here, because of "..Default::default()"
fn new() -> Self {
Self {
/* initializing fields */
..Default::default()
}
}
}
其余的运行它
fn main() -> SC2Result<()> {
let mut bot = MyBot::new();
run_vs_computer(
&mut bot,
Computer::new(
Race::Random,
Difficulty::VeryEasy,
None, // AI Build (random here)
),
"EternalEmpireLE", // Map name
LaunchOptions::default(),
)
}
依赖项
~11–15MB
~295K SLoC