Add a dice-game with 10-sides and cat-prize for 10

This commit is contained in:
Sofia 2025-09-13 20:17:39 +03:00
parent 0be133e40a
commit ad1941c798

View File

@ -13,15 +13,17 @@ use core::ptr::addr_of;
use atmega_hal::{
Adc, Usart,
adc::AdcSettings,
delay,
spi::{self, Settings},
usart::Baudrate,
};
use embedded_hal::delay::DelayNs;
use panic_halt as _;
use crate::{
display::{Display, Rgb565, Vec2},
font::{draw_number, draw_text},
graphics::{Image, LARGE_CAT_UNSAFE},
graphics::{Image, LARGE_CAT_UNSAFE, draw_image},
peripherals::{Button, Knob},
};
@ -84,106 +86,100 @@ fn main() -> ! {
adc,
};
let mut idx = 0;
let images = [Image::from(addr_of!(LARGE_CAT_UNSAFE))];
let len = images.len();
let mut delay = atmega_hal::delay::Delay::<CoreClock>::new();
let mut position = Vec2 { x: 10, y: 10 };
let original_position = position.clone();
draw_text(
&mut display,
"button:\n",
"dice:\n",
Rgb565::white(),
Rgb565::black(),
&mut position,
3,
);
let button_pos = position.clone();
let mut counter = 0;
let number_pos = position.clone();
draw_number(
&mut display,
counter,
0,
Rgb565::white(),
Rgb565::black(),
&mut button_pos.clone(),
&mut number_pos.clone(),
3,
);
draw_text(
&mut display,
"\nvolume:\n",
Rgb565::white(),
Rgb565::black(),
&mut position,
3,
);
let volume_pos = position.clone();
let mut last_volume = knob.raw();
let mut counter = 0;
draw_number(
&mut display,
last_volume.into(),
Rgb565::white(),
Rgb565::black(),
&mut volume_pos.clone(),
3,
);
let mut clock = 0u32;
let mut animation = 0;
let mut animation_reached = true;
let mut cat_received = false;
let max_number = 10;
loop {
let volume = knob.raw();
if volume != last_volume {
if volume == 0 || last_volume == 0 || last_volume.ilog10() > volume.ilog10() {
// Clear previous
clock += 1;
if button.poll() {
animation = 50;
animation_reached = false;
if cat_received {
display.draw_rect(
Vec2 { x: 0, y: 0 },
Vec2 { x: 240, y: 240 },
Rgb565::black().as_color(),
);
draw_text(
&mut display,
" ",
"dice:\n",
Rgb565::white(),
Rgb565::black(),
&mut volume_pos.clone(),
&mut original_position.clone(),
3,
);
cat_received = false;
}
}
if animation > 0 {
let modulo = match animation {
50..100 => 5,
20..50 => 10,
0..20 => 20,
_ => 10,
};
animation -= 1;
if animation % modulo == 0 {
let random = (((clock * 543_128) ^ 7_643_125) & 0b11111111) as f32 / 255f32;
let dice = (random * max_number as f32) as u32;
draw_number(
&mut display,
dice,
Rgb565::white(),
Rgb565::black(),
&mut number_pos.clone(),
3,
);
}
last_volume = volume;
} else if !animation_reached {
animation_reached = true;
let random = (((clock * 543_128) ^ 7_643_125) & 0b11111111) as f32 / 255f32;
let dice = (random * max_number as f32 + 1f32) as u32;
draw_number(
&mut display,
volume.into(),
dice,
Rgb565::white(),
Rgb565::black(),
&mut volume_pos.clone(),
&mut number_pos.clone(),
3,
);
}
if button.poll() {
counter += 1;
draw_number(
&mut display,
counter,
Rgb565::white(),
Rgb565::black(),
&mut button_pos.clone(),
3,
);
// match draw_image(
// &mut serial,
// &mut images[idx].iter(),
// &mut display,
// Vec2 { x: 0, y: 0 },
// ) {
// Ok(_) => ufmt::uwriteln!(serial, "Successfully read QOI").unwrap(),
// Err(e) => ufmt::uwriteln!(serial, "Error: {:?}", e).unwrap(),
// }
// draw_text(
// &mut display,
// "you just lost the game!",
// Rgb565::white(),
// Rgb565::black(),
// &mut Vec2 { x: 10, y: 10 },
// 3,
// );
// idx = (idx + 1) % len;
if dice == max_number {
delay.delay_ms(1000);
draw_image(
&mut serial,
&mut Image::from(addr_of!(LARGE_CAT_UNSAFE)).iter(),
&mut display,
Vec2 { x: 0, y: 0 },
)
.unwrap();
cat_received = true;
}
}
}
}