找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5602|回复: 2
收起左侧

c51单片机自制贪吃蛇游戏机 含程序代码

[复制链接]
ID:671091 发表于 2019-12-23 14:54 | 显示全部楼层 |阅读模式
制作出来的贪吃蛇游戏机实物图如下:
IMG_20190420_175150.jpg

原理图

原理图


单片机源程序如下:
  1. #include"snake.h"
  2. #include<stdlib.h>
  3. #include"key.h"
  4. #include"display.h"
  5. #include"main.h"
  6. #include"delay.h"
  7. ///////////////////////////////////////////////
  8. ///////////////     贪吃蛇     ////////////////
  9. ///////////////////////////////////////////////


  10. void setDir(u8 *dir_1,u8 *dir_2,u8 value){
  11.         *dir_1 = 0;
  12.         *dir_2 = value;
  13. }

  14. void setHead(u8 *z,u8 dir){
  15.         *z+=dir;
  16.         if(*z == -1)*z = 7;
  17.         else if(*z == 8)*z = 0;
  18. }

  19. void moveSnakeXY(u8 *snakeXY,const u8 num,const u8 XY){
  20.         u8 i = 0;
  21.         while(i<num-1){
  22.                 snakeXY[i] = snakeXY[i+1];
  23.                 i++;
  24.         }
  25.         snakeXY[i] = XY;
  26. }

  27. void changeLED(u8 (*led)[LED_WIDTH],const u8 *x,const u8 *y,u8 num,u8 apx,u8 apy){
  28.         int i = 0;
  29.         cleanLED(led);
  30.         while(i < num){
  31.                  led[y[i]][x[i]] = 1;
  32.                 i++;
  33.         }
  34.         led[apy][apx] = 1;                                                                                                                                                 
  35. }

  36. void randXY(u8 *x,u8 *y,u8 (*led)[LED_WIDTH],u8 t){
  37.         srand(t);
  38.         do{
  39.                  *x = rand()%8;
  40.                 *y = rand()%8;
  41.         }while(led[*y][*x]); //若这个点上面为1,则继续,直到这个点上面为空
  42.         led[*y][*x] = 1;
  43. }
  44. void showDegree(u8 degree){
  45.         u8 i,j;
  46.         for(i = 0;i<LED_HEIGHT;i++)
  47.                 for(j = 0;j<=degree;j++)
  48.                         setPoint(j,i);       
  49. }
  50. u8 Snake(void){
  51.         #define BLOCKNUM 64        //蛇身数组大小
  52.         u8 degree = 0,snakeNum = 1,dirX = 1,dirY = 0,dirOX,dirOY; //难度等级,当前蛇身长度,方向变量
  53.         u8 LED[LED_HEIGHT][LED_WIDTH];//界面显示矩阵
  54.         u8 headX = 0,headY = 0,appleX,appleY;        //蛇头位置变量   食物位置变量
  55.         u8 t,time; //移动速度控制变量
  56.         u8 r = 0;
  57.         //蛇身位置数组
  58.         u8 snakeX[BLOCKNUM];
  59.         u8 snakeY[BLOCKNUM];
  60.         while(1){ //难度选择
  61.                 showDegree(degree);
  62.                 if(keySelect())
  63.                         if(degree<7)degree++;
  64.                         else degree = 0;
  65.                 else if(keyStart())break;
  66.         }       
  67.         time = 100-degree*10;//延时长度
  68.         cleanLED(LED);//清屏
  69.         LED[headY][headX] = 1;//显示蛇头
  70.         //将蛇头保存到数组第一位
  71.         snakeX[0] = headX;
  72.         snakeY[0] = headY;
  73.         //运动方向初始化
  74.         dirOX = dirX;
  75.         dirOY = dirY;
  76.         //随机食物出现的位置
  77.         randXY(&appleX,&appleY,LED,t);
  78.         t = 0;
  79.         while(1){
  80.                 /*
  81.                   游戏主循环
  82.                 */
  83.                 display(LED);//显示       
  84. //                //按键操作检测,防止多余的按键判断,获取最近一次的方向               
  85.                 if(dirY!=-1 && (keyUP()||keyY()))setDir(&dirX,&dirY,-1);
  86.                 else if(dirY!=1 &&(keyDOWN()||keyA()))setDir(&dirX,&dirY,1);
  87.                 else if(dirX!=-1 &&(keyLEFT()||keyX()))setDir(&dirY,&dirX,-1);
  88.                 else if(dirX!=1 &&(keyRIGHT()||keyB()))setDir(&dirY,&dirX,1);
  89.                
  90.                 //暂停
  91.                 if(keyStart())
  92.                         while(!keyStart())
  93.                                 display(LED);
  94.                                                                 
  95.                 /*
  96.                         每隔一定时间进行移动
  97.                         以下代码功能为移动判断与移动操作
  98.                 */
  99.                 r++;//时间种子
  100.                 if(t++ >time){         //间隔性的移动
  101.                         t = 0;
  102.                         if((dirX!=0 && dirOX ==0)||(dirY!=0 && dirOY==0)){//合法方向输入引用
  103.                                  dirOX = dirX;
  104.                                 dirOY = dirY;
  105.                         }                               
  106.                         setHead(&headX,dirOX);        //按照合法的输入方向提前运动一次
  107.                         setHead(&headY,dirOY);                       
  108.                         if(headY == appleY && headX == appleX){                //若蛇头运行的下一位是食物
  109.                                         //数组加长
  110.                                         snakeNum++;
  111.                                          snakeX[snakeNum-1] = appleX;
  112.                                         snakeY[snakeNum-1] = appleY;
  113.                                         //下一个苹果
  114.                                         randXY(&appleX,&appleY,LED,r);
  115.                         }else if(!LED[headY][headX]){                                //若前方为无障碍物
  116.                                  //前方无障碍
  117.                                 moveSnakeXY(snakeX,snakeNum,headX);
  118.                                 moveSnakeXY(snakeY,snakeNum,headY);
  119.                         }else if(headX == snakeX[0]&& headY == snakeY[0]){//
  120.                                 moveSnakeXY(snakeX,snakeNum,headX);
  121.                                 moveSnakeXY(snakeY,snakeNum,headY);
  122.                         }else {                                //若前方有障碍物体,则触发蜂鸣器并返回错误值                       
  123.                                 return GAMEOVER;
  124.                         }
  125.                         changeLED(LED,snakeX,snakeY,snakeNum,appleX,appleY);//显示矩阵刷新
  126.                 }
  127.         }
  128.         return GAMEOVER;//游戏结束,返回错误信息
  129. }                                                                                                        
复制代码

所有资料51hei提供下载:
自制贪吃蛇游戏机资料.7z (80.24 KB, 下载次数: 38)
1555753858494.jpeg
1555753874610.jpeg
1555753868443.jpeg
1555753883588.jpeg
Screenshot_20180517-123331.png
Screenshot_20180517-123316.JPG
Screenshot_20180517-122805.png
接线图.jpg

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:1013589 发表于 2022-3-28 08:22 | 显示全部楼层
天!死亡走线!
(但是还是好强)
回复

使用道具 举报

ID:977804 发表于 2022-3-28 21:08 来自手机 | 显示全部楼层
方格点阵感觉比圆点舒服
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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