嵌入式之路 发表于 2024-9-23 02:20:20

51单片机的2048游戏机讨论

前两天看到B站上有人在卖2048游戏机, 后来感觉不是很难, 自己也用C语言成功的实现了(非C51),想着移植到51上就可以了。 需要处理的问题一共有两个



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

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

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











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




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

health 发表于 2024-9-23 08:17:54

啥是2048游戏机?

小涵子爸爸 发表于 2024-9-23 09:08:51

这个游戏机搜了一下,网上卖一百多块钱呢

21cnsound 发表于 2024-9-23 09:39:05

很是期待。

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

soma 发表于 2024-9-23 12:05:35

可以使用一个五项开关来控制吧

墨染 发表于 2024-9-23 16:37:29

这个做出来感觉很有成就感啊好厉害

嵌入式之路 发表于 2024-9-23 19:12:06

soma 发表于 2024-9-23 12:05
可以使用一个五项开关来控制吧

对啊, 五向开关

嵌入式之路 发表于 2024-9-23 22:29:21

health 发表于 2024-9-23 08:17
啥是2048游戏机?

你可以搜一下, 一个小玩具

嵌入式之路 发表于 2024-9-23 22:30:19

小涵子爸爸 发表于 2024-9-23 09:08
这个游戏机搜了一下,网上卖一百多块钱呢

成本其实真的不高, 那个ws2812 如果选好的雾面的一个5毛 16个也就是8元. 我估计成本也就15元左右

嵌入式之路 发表于 2024-9-23 22:31:39

#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
查看完整版本: 51单片机的2048游戏机讨论