找回密码
 立即注册
查看: 818|回复: 13

51单片机的2048游戏机讨论

[复制链接]
  • 打卡等级:以坛为家II
  • 打卡总天数:450
  • 最近打卡:2025-05-06 04:24:11

17

主题

533

回帖

1330

积分

金牌会员

积分
1330
发表于 2024-9-23 02:20:20 | 显示全部楼层 |阅读模式
前两天看到B站上有人在卖2048游戏机, 后来感觉不是很难, 自己也用C语言成功的实现了(非C51),想着移植到51上就可以了。 需要处理的问题一共有两个



1- ADC读取电压生成随机数

2- 驱动Ws2812 按照颜色代表数字显示

于是便有了第一版的原理图

截图202409230215364546.jpg


截图202409230215529674.jpg


截图202409230216044113.jpg



原本选的是8H8K的LQFP64, 后来感觉根本用不到那么多pin有点浪费。 最多就是额外加4个按键和一个,感觉可以直接换成TSSOP20

截图202409230219343005.jpg


我这两天再更新下,各位大佬看看有没有什么指导性意见

自信就会温和,温和就会坚定!
回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:7
  • 最近打卡:2025-04-01 23:18:33

15

主题

139

回帖

985

积分

高级会员

积分
985
发表于 2024-9-23 08:17:54 | 显示全部楼层
啥是2048游戏机?
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:510
  • 最近打卡:2025-05-09 00:40:40
已绑定手机

1

主题

836

回帖

1529

积分

金牌会员

积分
1529
发表于 2024-9-23 09:08:51 | 显示全部楼层
这个游戏机搜了一下,网上卖一百多块钱呢
靡不有初,鲜克有终
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:460
  • 最近打卡:2025-05-09 08:55:07
已绑定手机

13

主题

1271

回帖

3031

积分

论坛元老

积分
3031
发表于 2024-9-23 09:39:05 | 显示全部楼层
很是期待。

讨论:用颜色代表数字,怕是看起来费劲吧,从2到2048总共要11个数字,11中颜色感觉不太好区分/记忆。楼主怎么规划的颜色?
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:430
  • 最近打卡:2025-05-09 08:24:27
已绑定手机

19

主题

3196

回帖

4960

积分

论坛元老

积分
4960
发表于 2024-9-23 12:05:35 | 显示全部楼层
可以使用一个五项开关来控制吧
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看II
  • 打卡总天数:24
  • 最近打卡:2025-04-25 23:25:07

0

主题

21

回帖

170

积分

注册会员

积分
170
发表于 2024-9-23 16:37:29 | 显示全部楼层
这个做出来感觉很有成就感啊好厉害
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:450
  • 最近打卡:2025-05-06 04:24:11

17

主题

533

回帖

1330

积分

金牌会员

积分
1330
发表于 2024-9-23 19:12:06 | 显示全部楼层
so*** 发表于 2024-9-23 12:05
可以使用一个五项开关来控制吧

对啊, 五向开关
自信就会温和,温和就会坚定!
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:450
  • 最近打卡:2025-05-06 04:24:11

17

主题

533

回帖

1330

积分

金牌会员

积分
1330
发表于 2024-9-23 22:29:21 | 显示全部楼层
hea*** 发表于 2024-9-23 08:17
啥是2048游戏机?

你可以搜一下, 一个小玩具
自信就会温和,温和就会坚定!
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:450
  • 最近打卡:2025-05-06 04:24:11

17

主题

533

回帖

1330

积分

金牌会员

积分
1330
发表于 2024-9-23 22:30:19 | 显示全部楼层
小涵*** 发表于 2024-9-23 09:08
这个游戏机搜了一下,网上卖一百多块钱呢

成本其实真的不高, 那个ws2812 如果选好的雾面的一个5毛 16个也就是8元. 我估计成本也就15元左右
自信就会温和,温和就会坚定!
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:450
  • 最近打卡:2025-05-06 04:24:11

17

主题

533

回帖

1330

积分

金牌会员

积分
1330
发表于 2024-9-23 22:31:39 | 显示全部楼层
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <time.h>
  4. int array[4][4] = {
  5.         {0, 0, 0, 0},
  6.         {0, 0, 0, 0},
  7.         {0, 0, 0, 0},
  8.         {0, 0, 0, 0}
  9. };
  10. // 显示游戏板
  11. void print_board() {
  12.     for (int i = 0; i < 4; i++) {
  13.         for (int j = 0; j < 4; j++) {
  14.             printf("%4d ", array[i][j]);
  15.         }
  16.         printf("\n");
  17.     }
  18.     printf("\n");
  19. }
  20. // 随机在空位置生成2或4
  21. void add_random_tile() {
  22.     int empty_tiles[16][2];
  23.     int empty_count = 0;
  24.     // 找到所有空位置
  25.     for (int i = 0; i < 4; i++) {
  26.         for (int j = 0; j < 4; j++) {
  27.             if (array[i][j] == 0) {
  28.                 empty_tiles[empty_count][0] = i;
  29.                 empty_tiles[empty_count][1] = j;
  30.                 empty_count++;
  31.             }
  32.         }
  33.     }
  34.     // 如果有空位置,随机选择一个并生成2或4
  35.     if (empty_count > 0) {
  36.         int random_index = rand() % empty_count;
  37.         int random_value = (rand() % 2 + 1) * 2;
  38.         array[empty_tiles[random_index][0]][empty_tiles[random_index][1]] = random_value;
  39.     }
  40. }
  41. // 向上移动
  42. void move_up() {
  43.     for (int j = 0; j < 4; j++) {
  44.         int last_merge = -1; // 记录上次合并的位置
  45.         for (int i = 1; i < 4; i++) {
  46.             if (array[i][j] != 0) {
  47.                 int k = i;
  48.                 while (k > 0 && array[k-1][j] == 0) {
  49.                     array[k-1][j] = array[k][j];
  50.                     array[k][j] = 0;
  51.                     k--;
  52.                 }
  53.                 if (k > 0 && array[k-1][j] == array[k][j] && last_merge != k-1) {
  54.                     array[k-1][j] *= 2;
  55.                     array[k][j] = 0;
  56.                     last_merge = k-1;
  57.                 }
  58.             }
  59.         }
  60.     }
  61. }
  62. // 向下移动
  63. void move_down() {
  64.     for (int j = 0; j < 4; j++) {
  65.         int last_merge = -1;
  66.         for (int i = 2; i >= 0; i--) {
  67.             if (array[i][j] != 0) {
  68.                 int k = i;
  69.                 while (k < 3 && array[k+1][j] == 0) {
  70.                     array[k+1][j] = array[k][j];
  71.                     array[k][j] = 0;
  72.                     k++;
  73.                 }
  74.                 if (k < 3 && array[k+1][j] == array[k][j] && last_merge != k+1) {
  75.                     array[k+1][j] *= 2;
  76.                     array[k][j] = 0;
  77.                     last_merge = k+1;
  78.                 }
  79.             }
  80.         }
  81.     }
  82. }
  83. // 向左移动
  84. void move_left() {
  85.     for (int i = 0; i < 4; i++) {
  86.         int last_merge = -1;
  87.         for (int j = 1; j < 4; j++) {
  88.             if (array[i][j] != 0) {
  89.                 int k = j;
  90.                 while (k > 0 && array[i][k-1] == 0) {
  91.                     array[i][k-1] = array[i][k];
  92.                     array[i][k] = 0;
  93.                     k--;
  94.                 }
  95.                 if (k > 0 && array[i][k-1] == array[i][k] && last_merge != k-1) {
  96.                     array[i][k-1] *= 2;
  97.                     array[i][k] = 0;
  98.                     last_merge = k-1;
  99.                 }
  100.             }
  101.         }
  102.     }
  103. }
  104. // 向右移动
  105. void move_right() {
  106.     for (int i = 0; i < 4; i++) {
  107.         int last_merge = -1;
  108.         for (int j = 2; j >= 0; j--) {
  109.             if (array[i][j] != 0) {
  110.                 int k = j;
  111.                 while (k < 3 && array[i][k+1] == 0) {
  112.                     array[i][k+1] = array[i][k];
  113.                     array[i][k] = 0;
  114.                     k++;
  115.                 }
  116.                 if (k < 3 && array[i][k+1] == array[i][k] && last_merge != k+1) {
  117.                     array[i][k+1] *= 2;
  118.                     array[i][k] = 0;
  119.                     last_merge = k+1;
  120.                 }
  121.             }
  122.         }
  123.     }
  124. }
  125. // 检查游戏是否结束
  126. int check_game_over() {
  127.     for (int i = 0; i < 4; i++) {
  128.         for (int j = 0; j < 4; j++) {
  129.             if (array[i][j] == 0) return 0; // 还有空位
  130.             if (i > 0 && array[i][j] == array[i-1][j]) return 0; // 上下相等
  131.             if (j > 0 && array[i][j] == array[i][j-1]) return 0; // 左右相等
  132.         }
  133.     }
  134.     return 1; // 游戏结束
  135. }
  136. int main() {
  137.     srand(time(NULL));
  138.     add_random_tile();
  139.     add_random_tile();
  140.     char command;
  141.     while (1) {
  142.         print_board();
  143.         if (check_game_over()) {
  144.             printf("Game Over!\n");
  145.             break;
  146.         }
  147.         printf("Enter move (w=up, s=down, a=left, d=right): ");
  148.         command = getchar();
  149.         getchar(); // 消耗掉换行符
  150.         switch (command) {
  151.             case 'w': move_up(); break;
  152.             case 's': move_down(); break;
  153.             case 'a': move_left(); break;
  154.             case 'd': move_right(); break;
  155.             default: printf("Invalid move!\n"); continue;
  156.         }
  157.         add_random_tile();
  158.     }
  159.     return 0;
  160. }
复制代码
自信就会温和,温和就会坚定!
回复 支持 反对

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-9 09:01 , Processed in 0.178057 second(s), 120 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表