Switch from rand_core to randomize (#31)

- For #7
This commit is contained in:
Jay Oster 2019-11-02 15:29:09 -07:00 committed by GitHub
parent 113ffafced
commit 28f927e153
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
5 changed files with 67 additions and 19 deletions

19
Cargo.lock generated
View file

@ -329,7 +329,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
[[package]] [[package]]
name = "getrandom" name = "getrandom"
version = "0.1.12" version = "0.1.13"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [ dependencies = [
"cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)",
@ -791,7 +791,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
name = "pixels" name = "pixels"
version = "0.0.1" version = "0.0.1"
dependencies = [ dependencies = [
"byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)",
"env_logger 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", "env_logger 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)",
"getrandom 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)",
"gilrs 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)", "gilrs 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)",
"log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)",
"pixels-mocks 0.1.0", "pixels-mocks 0.1.0",
@ -851,12 +853,9 @@ dependencies = [
] ]
[[package]] [[package]]
name = "rand_core" name = "randomize"
version = "0.5.1" version = "3.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
"getrandom 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]] [[package]]
name = "range-alloc" name = "range-alloc"
@ -1047,9 +1046,11 @@ dependencies = [
name = "simple-invaders" name = "simple-invaders"
version = "0.1.0" version = "0.1.0"
dependencies = [ dependencies = [
"byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)",
"getrandom 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)",
"line_drawing 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "line_drawing 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)",
"pcx 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", "pcx 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)",
"rand_core 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "randomize 3.0.1 (registry+https://github.com/rust-lang/crates.io-index)",
] ]
[[package]] [[package]]
@ -1579,7 +1580,7 @@ dependencies = [
"checksum fuchsia-zircon-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "3dcaa9ae7725d12cdb85b3ad99a434db70b468c09ded17e012d86b5c1010f7a7" "checksum fuchsia-zircon-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "3dcaa9ae7725d12cdb85b3ad99a434db70b468c09ded17e012d86b5c1010f7a7"
"checksum fxhash 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "c31b6d751ae2c7f11320402d34e41349dd1016f8d5d45e48c4312bc8625af50c" "checksum fxhash 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "c31b6d751ae2c7f11320402d34e41349dd1016f8d5d45e48c4312bc8625af50c"
"checksum gcc 0.3.55 (registry+https://github.com/rust-lang/crates.io-index)" = "8f5f3913fa0bfe7ee1fd8248b6b9f42a5af4b9d65ec2dd2c3c26132b950ecfc2" "checksum gcc 0.3.55 (registry+https://github.com/rust-lang/crates.io-index)" = "8f5f3913fa0bfe7ee1fd8248b6b9f42a5af4b9d65ec2dd2c3c26132b950ecfc2"
"checksum getrandom 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)" = "473a1265acc8ff1e808cd0a1af8cee3c2ee5200916058a2ca113c29f2d903571" "checksum getrandom 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)" = "e7db7ca94ed4cd01190ceee0d8a8052f08a247aa1b469a7f68c6a3b71afcf407"
"checksum gfx-backend-dx11 0.3.0 (git+https://github.com/gfx-rs/gfx?rev=3d5db15661127c8cad8d85522a68ec36c82f6e69)" = "<none>" "checksum gfx-backend-dx11 0.3.0 (git+https://github.com/gfx-rs/gfx?rev=3d5db15661127c8cad8d85522a68ec36c82f6e69)" = "<none>"
"checksum gfx-backend-dx12 0.3.0 (git+https://github.com/gfx-rs/gfx?rev=3d5db15661127c8cad8d85522a68ec36c82f6e69)" = "<none>" "checksum gfx-backend-dx12 0.3.0 (git+https://github.com/gfx-rs/gfx?rev=3d5db15661127c8cad8d85522a68ec36c82f6e69)" = "<none>"
"checksum gfx-backend-empty 0.3.0 (git+https://github.com/gfx-rs/gfx?rev=3d5db15661127c8cad8d85522a68ec36c82f6e69)" = "<none>" "checksum gfx-backend-empty 0.3.0 (git+https://github.com/gfx-rs/gfx?rev=3d5db15661127c8cad8d85522a68ec36c82f6e69)" = "<none>"
@ -1633,7 +1634,7 @@ dependencies = [
"checksum quick-error 1.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "9274b940887ce9addde99c4eee6b5c44cc494b182b97e73dc8ffdcb3397fd3f0" "checksum quick-error 1.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "9274b940887ce9addde99c4eee6b5c44cc494b182b97e73dc8ffdcb3397fd3f0"
"checksum quote 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)" = "6ce23b6b870e8f94f81fb0a363d65d86675884b34a09043c81e5562f11c1f8e1" "checksum quote 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)" = "6ce23b6b870e8f94f81fb0a363d65d86675884b34a09043c81e5562f11c1f8e1"
"checksum quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "053a8c8bcc71fcce321828dc897a98ab9760bef03a4fc36693c231e5b3216cfe" "checksum quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "053a8c8bcc71fcce321828dc897a98ab9760bef03a4fc36693c231e5b3216cfe"
"checksum rand_core 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" "checksum randomize 3.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "88c38c99b51f33c9fcc655252bf02ac8048eb70f35244e4697b0de9c473e940a"
"checksum range-alloc 0.1.0 (git+https://github.com/gfx-rs/gfx?rev=3d5db15661127c8cad8d85522a68ec36c82f6e69)" = "<none>" "checksum range-alloc 0.1.0 (git+https://github.com/gfx-rs/gfx?rev=3d5db15661127c8cad8d85522a68ec36c82f6e69)" = "<none>"
"checksum raw-window-handle 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2e815b85b31e4d397ca9dd8eb1d692e9cb458b9f6ae8ac2232c995dca8236f87" "checksum raw-window-handle 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2e815b85b31e4d397ca9dd8eb1d692e9cb458b9f6ae8ac2232c995dca8236f87"
"checksum redox_syscall 0.1.56 (registry+https://github.com/rust-lang/crates.io-index)" = "2439c63f3f6139d1b57529d16bc3b8bb855230c8efcc5d3a896c8bea7c3b1e84" "checksum redox_syscall 0.1.56 (registry+https://github.com/rust-lang/crates.io-index)" = "2439c63f3f6139d1b57529d16bc3b8bb855230c8efcc5d3a896c8bea7c3b1e84"

View file

@ -14,7 +14,9 @@ license = "MIT"
wgpu = { git = "https://github.com/gfx-rs/wgpu-rs", rev = "012d08d64de924da93289c2b51fb06b22d7348cf" } wgpu = { git = "https://github.com/gfx-rs/wgpu-rs", rev = "012d08d64de924da93289c2b51fb06b22d7348cf" }
[dev-dependencies] [dev-dependencies]
byteorder = "1.3"
env_logger = "0.7" env_logger = "0.7"
getrandom = "0.1"
gilrs = "0.7" gilrs = "0.7"
log = { version = "0.4", features = ["release_max_level_warn"] } log = { version = "0.4", features = ["release_max_level_warn"] }
pixels-mocks = { path = "pixels-mocks" } pixels-mocks = { path = "pixels-mocks" }

View file

@ -26,7 +26,7 @@ fn main() -> Result<(), Error> {
create_window("pixel invaders", &event_loop); create_window("pixel invaders", &event_loop);
let surface_texture = SurfaceTexture::new(width, height, surface); let surface_texture = SurfaceTexture::new(width, height, surface);
let mut pixels = Pixels::new(SCREEN_WIDTH as u32, SCREEN_HEIGHT as u32, surface_texture)?; let mut pixels = Pixels::new(SCREEN_WIDTH as u32, SCREEN_HEIGHT as u32, surface_texture)?;
let mut invaders = World::new(debug); let mut invaders = World::new(generate_seed(), debug);
let mut time = Instant::now(); let mut time = Instant::now();
let mut gamepad = None; let mut gamepad = None;
@ -169,3 +169,18 @@ fn create_window(
hidpi_factor, hidpi_factor,
) )
} }
/// Generate a pseudorandom seed for the game's PRNG.
fn generate_seed() -> (u64, u64) {
use byteorder::{ByteOrder, NativeEndian};
use getrandom::getrandom;
let mut seed = [0_u8; 16];
getrandom(&mut seed).expect("failed to getrandom");
(
NativeEndian::read_u64(&seed[0..8]),
NativeEndian::read_u64(&seed[8..16]),
)
}

View file

@ -7,4 +7,8 @@ edition = "2018"
[dependencies] [dependencies]
line_drawing = "0.8" line_drawing = "0.8"
pcx = "0.2" pcx = "0.2"
rand_core = { version = "0.5", features = ["std"] } randomize = "3.0"
[dev-dependencies]
byteorder = "1.3"
getrandom = "0.1"

View file

@ -4,14 +4,14 @@
//! this in practice. That said, the game is fully functional, and it should not be too difficult //! this in practice. That said, the game is fully functional, and it should not be too difficult
//! to understand the code. //! to understand the code.
use rand_core::{OsRng, RngCore};
use std::time::Duration; use std::time::Duration;
use crate::collision::Collision;
pub use crate::controls::{Controls, Direction}; pub use crate::controls::{Controls, Direction};
use crate::geo::Point; use crate::geo::Point;
use crate::loader::{load_assets, Assets}; use crate::loader::{load_assets, Assets};
use crate::sprites::{blit, Animation, Drawable, Frame, Sprite, SpriteRef}; use crate::sprites::{blit, Animation, Drawable, Frame, Sprite, SpriteRef};
use collision::Collision; use randomize::PCG32;
mod collision; mod collision;
mod controls; mod controls;
@ -50,7 +50,7 @@ pub struct World {
assets: Assets, assets: Assets,
dt: Duration, dt: Duration,
gameover: bool, gameover: bool,
random: OsRng, prng: PCG32,
debug: bool, debug: bool,
} }
@ -118,7 +118,30 @@ struct Bullet {
impl World { impl World {
/// Create a new simple-invaders `World`. /// Create a new simple-invaders `World`.
pub fn new(debug: bool) -> World { ///
/// # Arguments
///
/// * `debug` - Enable debug visualizations.
/// * `seed` - Inputs for the pseudorandom number generator.
///
/// # Example
///
/// ```
/// use byteorder::{ByteOrder, NativeEndian};
/// use getrandom::getrandom;
/// use simple_invaders::World;
///
/// // Create a seed for the PRNG
/// let mut seed = [0_u8; 16];
/// getrandom(&mut seed).expect("failed to getrandom");
/// let seed = (
/// NativeEndian::read_u64(&seed[0..8]),
/// NativeEndian::read_u64(&seed[8..16]),
/// );
///
/// let world = World::new(seed, false);
/// ```
pub fn new(seed: (u64, u64), debug: bool) -> World {
use Frame::*; use Frame::*;
// Load assets first // Load assets first
@ -150,7 +173,7 @@ impl World {
let dt = Duration::default(); let dt = Duration::default();
let gameover = false; let gameover = false;
let random = OsRng; let prng = PCG32::seed(seed.0, seed.1);
World { World {
invaders, invaders,
@ -163,7 +186,7 @@ impl World {
assets, assets,
dt, dt,
gameover, gameover,
random, prng,
debug, debug,
} }
} }
@ -353,7 +376,7 @@ impl World {
invader.sprite.step_frame(&self.assets); invader.sprite.step_frame(&self.assets);
// They also shoot lasers at random with a 1:50 chance // They also shoot lasers at random with a 1:50 chance
let r = self.random.next_u32() as usize; let r = self.prng.next_u32() as usize;
let chance = r % 50; let chance = r % 50;
if self.lasers.len() < 3 && chance == 0 { if self.lasers.len() < 3 && chance == 0 {
// Pick a random column to begin searching for an invader that can fire a laser // Pick a random column to begin searching for an invader that can fire a laser
@ -400,9 +423,12 @@ impl World {
} }
} }
/// Create a default `World` with a static PRNG seed.
impl Default for World { impl Default for World {
fn default() -> Self { fn default() -> Self {
World::new(false) let seed = (6_364_136_223_846_793_005, 1);
World::new(seed, false)
} }
} }