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::{ use atmega_hal::{
Adc, Usart, Adc, Usart,
adc::AdcSettings, adc::AdcSettings,
delay,
spi::{self, Settings}, spi::{self, Settings},
usart::Baudrate, usart::Baudrate,
}; };
use embedded_hal::delay::DelayNs;
use panic_halt as _; use panic_halt as _;
use crate::{ use crate::{
display::{Display, Rgb565, Vec2}, display::{Display, Rgb565, Vec2},
font::{draw_number, draw_text}, font::{draw_number, draw_text},
graphics::{Image, LARGE_CAT_UNSAFE}, graphics::{Image, LARGE_CAT_UNSAFE, draw_image},
peripherals::{Button, Knob}, peripherals::{Button, Knob},
}; };
@ -84,106 +86,100 @@ fn main() -> ! {
adc, adc,
}; };
let mut idx = 0;
let images = [Image::from(addr_of!(LARGE_CAT_UNSAFE))]; 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 mut position = Vec2 { x: 10, y: 10 };
let original_position = position.clone();
draw_text( draw_text(
&mut display, &mut display,
"button:\n", "dice:\n",
Rgb565::white(), Rgb565::white(),
Rgb565::black(), Rgb565::black(),
&mut position, &mut position,
3, 3,
); );
let button_pos = position.clone(); let number_pos = position.clone();
let mut counter = 0;
draw_number( draw_number(
&mut display, &mut display,
counter, 0,
Rgb565::white(), Rgb565::white(),
Rgb565::black(), Rgb565::black(),
&mut button_pos.clone(), &mut number_pos.clone(),
3, 3,
); );
let mut clock = 0u32;
draw_text( let mut animation = 0;
&mut display, let mut animation_reached = true;
"\nvolume:\n", let mut cat_received = false;
Rgb565::white(), let max_number = 10;
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,
);
loop { loop {
let volume = knob.raw(); clock += 1;
if volume != last_volume { if button.poll() {
if volume == 0 || last_volume == 0 || last_volume.ilog10() > volume.ilog10() { animation = 50;
// Clear previous 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( draw_text(
&mut display, &mut display,
" ", "dice:\n",
Rgb565::white(), Rgb565::white(),
Rgb565::black(), 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, 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( draw_number(
&mut display, &mut display,
volume.into(), dice,
Rgb565::white(), Rgb565::white(),
Rgb565::black(), Rgb565::black(),
&mut volume_pos.clone(), &mut number_pos.clone(),
3, 3,
); );
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;
} }
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;
} }
} }
} }