51单片机的2048游戏机讨论
前两天看到B站上有人在卖2048游戏机, 后来感觉不是很难, 自己也用C语言成功的实现了(非C51),想着移植到51上就可以了。 需要处理的问题一共有两个1- ADC读取电压生成随机数
2- 驱动Ws2812 按照颜色代表数字显示
于是便有了第一版的原理图
原本选的是8H8K的LQFP64, 后来感觉根本用不到那么多pin有点浪费。 最多就是额外加4个按键和一个,感觉可以直接换成TSSOP20
我这两天再更新下,各位大佬看看有没有什么指导性意见
啥是2048游戏机? 这个游戏机搜了一下,网上卖一百多块钱呢 很是期待。
讨论:用颜色代表数字,怕是看起来费劲吧,从2到2048总共要11个数字,11中颜色感觉不太好区分/记忆。楼主怎么规划的颜色? 可以使用一个五项开关来控制吧 这个做出来感觉很有成就感啊好厉害
soma 发表于 2024-9-23 12:05
可以使用一个五项开关来控制吧
对啊, 五向开关 health 发表于 2024-9-23 08:17
啥是2048游戏机?
你可以搜一下, 一个小玩具 小涵子爸爸 发表于 2024-9-23 09:08
这个游戏机搜了一下,网上卖一百多块钱呢
成本其实真的不高, 那个ws2812 如果选好的雾面的一个5毛 16个也就是8元. 我估计成本也就15元左右 #include <stdio.h>
#include <stdlib.h>
#include <time.h>
int array = {
{0, 0, 0, 0},
{0, 0, 0, 0},
{0, 0, 0, 0},
{0, 0, 0, 0}
};
// 显示游戏板
void print_board() {
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 4; j++) {
printf("%4d ", array);
}
printf("\n");
}
printf("\n");
}
// 随机在空位置生成2或4
void add_random_tile() {
int empty_tiles;
int empty_count = 0;
// 找到所有空位置
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 4; j++) {
if (array == 0) {
empty_tiles = i;
empty_tiles = j;
empty_count++;
}
}
}
// 如果有空位置,随机选择一个并生成2或4
if (empty_count > 0) {
int random_index = rand() % empty_count;
int random_value = (rand() % 2 + 1) * 2;
array]] = random_value;
}
}
// 向上移动
void move_up() {
for (int j = 0; j < 4; j++) {
int last_merge = -1; // 记录上次合并的位置
for (int i = 1; i < 4; i++) {
if (array != 0) {
int k = i;
while (k > 0 && array == 0) {
array = array;
array = 0;
k--;
}
if (k > 0 && array == array && last_merge != k-1) {
array *= 2;
array = 0;
last_merge = k-1;
}
}
}
}
}
// 向下移动
void move_down() {
for (int j = 0; j < 4; j++) {
int last_merge = -1;
for (int i = 2; i >= 0; i--) {
if (array != 0) {
int k = i;
while (k < 3 && array == 0) {
array = array;
array = 0;
k++;
}
if (k < 3 && array == array && last_merge != k+1) {
array *= 2;
array = 0;
last_merge = k+1;
}
}
}
}
}
// 向左移动
void move_left() {
for (int i = 0; i < 4; i++) {
int last_merge = -1;
for (int j = 1; j < 4; j++) {
if (array != 0) {
int k = j;
while (k > 0 && array == 0) {
array = array;
array = 0;
k--;
}
if (k > 0 && array == array && last_merge != k-1) {
array *= 2;
array = 0;
last_merge = k-1;
}
}
}
}
}
// 向右移动
void move_right() {
for (int i = 0; i < 4; i++) {
int last_merge = -1;
for (int j = 2; j >= 0; j--) {
if (array != 0) {
int k = j;
while (k < 3 && array == 0) {
array = array;
array = 0;
k++;
}
if (k < 3 && array == array && last_merge != k+1) {
array *= 2;
array = 0;
last_merge = k+1;
}
}
}
}
}
// 检查游戏是否结束
int check_game_over() {
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 4; j++) {
if (array == 0) return 0; // 还有空位
if (i > 0 && array == array) return 0; // 上下相等
if (j > 0 && array == array) return 0; // 左右相等
}
}
return 1; // 游戏结束
}
int main() {
srand(time(NULL));
add_random_tile();
add_random_tile();
char command;
while (1) {
print_board();
if (check_game_over()) {
printf("Game Over!\n");
break;
}
printf("Enter move (w=up, s=down, a=left, d=right): ");
command = getchar();
getchar(); // 消耗掉换行符
switch (command) {
case 'w': move_up(); break;
case 's': move_down(); break;
case 'a': move_left(); break;
case 'd': move_right(); break;
default: printf("Invalid move!\n"); continue;
}
add_random_tile();
}
return 0;
}
页:
[1]
2