Bit Bang
Ecto has spent their afterlife toying with numbers and showing their findings to the spirit world. The spirit world only knows two numerals, though, so they have to translate the human-readable numbers into a form it can understand.
The goal of each puzzle is to translate the requested decimal number into a binary number in the minimum amount of moves, using the four buttons—increment (add 1), decrement (subtract 1), left shift (multiply by 2), and right shift (divide by 2, rounded down). You might want to bring a calculator.
Controls:
- D-Pad (WASD/arrow keys) — move
- A (Period/X) — press button (hold for auto press)
- B (Comma/Z) — reset puzzle; skip to next puzzle after clear
- Start (Enter) — toggle music
- Select (Space) — toggle sound effects
Assist Mode perks:
- Unlimited moves
- Decimal translation of the current number shown
Stuff used to make this:
- GBDK 2020
- GBTD and GBMB
- hUGETracker and hUGEDriver
- binjgb (web emulator)
Special thanks to alicegaming, bbbbbr, and ethantrithon for playtesting, and to the best way to count for inspiring this game.
For source code and license info, see the "more information" tab.
Updated | 8 hours ago |
Status | Released |
Platforms | HTML5 |
Author | StudioGuma |
Genre | Puzzle |
Tags | 1-bit, 2D, Black and White, Game Boy, Game Boy ROM, Ghosts, Homebrew, Math, Open Source, Pixel Art |
Code license | GNU General Public License v3.0 (GPL) |
Asset license | Creative Commons Attribution_ShareAlike v4.0 International |
Average session | About a half-hour |
Languages | English |
Accessibility | Color-blind friendly, High-contrast |
Links | Source code |
Download
Click download now to get access to the following files:
Development log
- Mod 1Jun 09, 2024
Comments
Log in with itch.io to leave a comment.
passed all levels : ) love the music and SFX
The later levels are too hard so I write this program to calculate them XD
use std::{collections::VecDeque, io};
fn main() {
let target = {
let mut line = String::new();
io::stdin().read_line(&mut line).unwrap();
line.trim().parse::<u8>().unwrap()
};
let mut q: VecDeque<(u8, Vec<char>)> = VecDeque::new();
q.push_back((0, vec![]));
while !q.is_empty() {
let (cur, mut cur_ops) = q.pop_front().unwrap();
if cur == target {
println!("{:?}", cur_ops);
break;
}
cur_ops.push('+');
q.push_back((cur.wrapping_add(1), cur_ops.clone()));
cur_ops.pop();
cur_ops.push('-');
q.push_back((cur.wrapping_sub(1), cur_ops.clone()));
cur_ops.pop();
cur_ops.push('<');
q.push_back((cur.wrapping_shl(1), cur_ops.clone()));
cur_ops.pop();
cur_ops.push('>');
q.push_back((cur.wrapping_shr(1), cur_ops.clone()));
cur_ops.pop();
}
}