久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 7402|回復: 12
打印 上一主題 下一主題
收起左側

單片機貪吃蛇程序Lcd12864顯示

  [復制鏈接]
跳轉到指定樓層
樓主
ID:244223 發表于 2017-10-30 15:25 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
貪吃蛇的單片機源程序如下:
  1. /***********************************************************
  2. 功能說明:貪吃蛇
  3. 編譯環境:keil4
  4. MCU     :STC89C52RC
  5. 時鐘頻率: 22.1184MHz

  6. 注意:該例程中“過關”不能在keil4編譯環境中正常顯示
  7. ************************************************************/
  8. /*****************************************************************
  9.                     /^\/^\
  10.                   _|__|  O|
  11.          \/     /~     \_/ \
  12.           \____|__________/  \
  13.                  \_______      \
  14.                          `\     \                 \
  15.                            |     |                  \
  16.                           /      /                    \
  17.                          /     /                       \\
  18.                        /      /                         \ \
  19.                       /     /                            \  \
  20.                     /     /             _----_            \   \
  21.                    /     /           _-~      ~-_         |   |
  22.                  (      (        _-~    _--_    ~-_     _/   |
  23.                    \      ~-____-~    _-~    ~-_    ~-_-~    /
  24.                      ~-_           _-~          ~-_       _-~   
  25.                         ~--______-~                ~-___-~  
  26. *****************************************************************/
  27. #include "stc.h"
  28. #include "Lcd12864.h"
  29. #include "Key.h"
  30. #define uchar unsigned char
  31. #define uint unsigned int

  32. static unsigned long Seed = 1;
  33. #define A 48271L
  34. #define M 2147483647L
  35. #define Q (M / A)
  36. #define R (M % A)
  37. /************************************
  38. 偽隨機數發生器
  39. *************************************/
  40. double Random(void)
  41. {
  42.         long TmpSeed;
  43.         TmpSeed=A*(Seed%Q)-R*(Seed/Q);
  44.         if(TmpSeed>=0)
  45.                 Seed=TmpSeed;
  46.         else
  47.                 Seed=TmpSeed+M;
  48.         return (double)Seed/M;
  49. }

  50. /**************************************
  51. 為偽隨機數發生器播種
  52. ***************************************/
  53. void InitRandom(unsigned long InitVal)
  54. {
  55.         Seed=InitVal;
  56. }

  57. //延時子程序
  58. void delay(unsigned int t)
  59. {  
  60.         unsigned int i,j;
  61.         for(i=0;i<t;i++)
  62.                 for(j=0;j<10;j++);   
  63. }

  64. /*********************************
  65. 初始化MPU
  66. **********************************/
  67. void InitCpu(void)
  68. {
  69.         TMOD=0x01;
  70.         TH0=0;
  71.         TL0=0;
  72.         TR0=1;
  73.         ET0=1;
  74.         EA=1;
  75. }

  76. #define N 25
  77. struct Food
  78. {
  79.         unsigned char x;
  80.         unsigned char y;
  81.         unsigned char yes;
  82. }food;//食物結構體
  83. struct Snake
  84. {
  85.         unsigned char x[N];
  86.         unsigned char y[N];
  87.         unsigned char node;
  88.         unsigned char direction;
  89.         unsigned char life;
  90. }snake;//蛇結構體

  91. unsigned char Flag=0;
  92. unsigned char Score=0;
  93. unsigned char Speed=5;                   //speed越大,速度越慢
  94. unsigned char KeyBuffer=0;
  95. #define FUNC 1                                   //(P3^1)表示級別
  96. #define UP 2                                   //(P3^3)表示左
  97. #define DOWN 3                                   //(P3^5)表示右
  98. #define LEFT 4                                   //(P3^4)表示下
  99. #define RIGHT 5                                   //(P3^2)表示上
  100. #define PASSSCORE 20                   //預定義過關成績
  101. void Timer0Int(void) interrupt 1
  102. {
  103.         switch(OSReadKey())
  104.         {
  105.                 case 5:
  106.                                 KeyBuffer=FUNC;                                                  //表示級別
  107.                                 /*if(++Speed>=10)
  108.                                         Speed=1;
  109.                                    Flag|=1<<1;//速度變化標志置1*/
  110.                                 break;
  111.                 case 21:
  112.                                 KeyBuffer=DOWN;                                                 //表示右
  113.                                 /*if(snake.direction!=2)
  114.                                         snake.direction=1;*/
  115.                                 break;
  116.                 case 13:
  117.                                 KeyBuffer=UP;                                                 //表示左
  118.                                 /*if(snake.direction!=1)
  119.                                         snake.direction=2;*/
  120.                                 break;
  121.                 case 9:
  122.                                 KeyBuffer=RIGHT;                                         //表示上
  123.                                 /*if(snake.direction!=4)
  124.                                         snake.direction=3;*/
  125.                                 break;
  126.                    case 17:
  127.                                 KeyBuffer=LEFT;                                                 //表示下
  128.                                 /*if(snake.direction!=3)
  129.                                         snake.direction=4;*/
  130.                                 break;
  131.                 default:
  132.                                 break;
  133.         }
  134. }

  135. /******************************
  136. 畫墻壁,初始化界面
  137. *******************************/
  138. void DrawBoard(void)
  139. {
  140.         unsigned char n;
  141.         for(n=0;n<31;n++)
  142.         {
  143.                 Lcd_Rectangle(3*n,0,3*n+2,2,1);
  144.                 Lcd_Rectangle(3*n,60,3*n+2,62,1);
  145.         }
  146.         for(n=0;n<21;n++)
  147.         {
  148.                 Lcd_Rectangle(0,3*n,2,3*n+2,1);
  149.                 Lcd_Rectangle(90,3*n,92,3*n+2,1);               
  150.         }
  151.         Lcd_HoriLine(93,31,35,1);
  152.         Lcd_HoriLine(93,63,35,1);
  153. }

  154. /***************************
  155. 打印成績
  156. ****************************/
  157. void PrintScore(void)
  158. {
  159.         unsigned char Str[3];
  160.         Lcd_WriteStr(6,0,"成績");
  161.         Str[0]=(Score/10)|0x30;//十位
  162.         Str[1]=(Score%10)|0x30;//個位
  163.         Str[2]=0;
  164.         Lcd_WriteStr(7,1,Str);
  165. }

  166. /********************************
  167. 打印速度級別
  168. *********************************/
  169. void PrintSpeed(void)
  170. {
  171.         unsigned char Str[2];
  172.         Lcd_WriteStr(6,2,"級別");
  173.         Str[0]=Speed|0x30;
  174.         Str[1]=0;
  175.         Lcd_WriteStr(7,3,Str);
  176. }

  177. /***********************************
  178. 游戲結束處理
  179. ************************************/
  180. void GameOver(void)
  181. {
  182.         unsigned char n;
  183.         Lcd_Rectangle(food.x,food.y,food.x+2,food.y+2,0);//消隱出食物
  184.         for(n=1;n<snake.node;n++)
  185.         {
  186.                 Lcd_Rectangle(snake.x[n],snake.y[n],snake.x[n]+2,snake.y[n]+2,0);//消隱食物,蛇頭已到墻壁內,故不用消去               
  187.         }
  188.         if(snake.life==0)//如果蛇還活著
  189.                 Lcd_WriteStr(2,1,"過關");
  190.         else             //如果蛇死了
  191.                 Lcd_WriteStr(2,1,"輸了");
  192.         Lcd_WriteStr(1,2,"游戲結束");
  193. }

  194. /********************************
  195. 游戲的具體過程,也是貪吃蛇算法的關鍵部分
  196. *********************************/
  197. void GamePlay(void)
  198. {
  199.         unsigned char n;
  200.         InitRandom(TL0);
  201.         food.yes=1;//1表示需要出現新事物,0表示已經存在食物尚未吃掉
  202.         snake.life=0;//表示蛇還活著
  203.         snake.direction=DOWN;
  204.         snake.x[0]=6;snake.y[0]=6;
  205.         snake.x[1]=3;snake.y[1]=6;
  206.         snake.node=2;
  207.         PrintScore();
  208.         PrintSpeed();
  209.         while(1)
  210.         {
  211.                 if(food.yes==1)
  212.                 {
  213.                         while(1)
  214.                         {
  215.                                 food.x=Random()*85+3;
  216.                                 food.y=Random()*55+3;//獲得隨機數
  217.         
  218.                                 while(food.x%3!=0)
  219.                                         food.x++;
  220.                                 while(food.y%3!=0)
  221.                                         food.y++;
  222.                             for(n=0;n<snake.node;n++)//判斷產生的食物坐標是否和蛇身重合
  223.                                 {
  224.                                         if((food.x==snake.x[n])&&(food.y==snake.y[n]))
  225.                                                 break;
  226.                                 }
  227.                                 if(n==snake.node)
  228.                                 {
  229.                                         food.yes=0;
  230.                                         break;//產生有效的食物坐標
  231.                                 }
  232.                         }
  233.                 }
  234.                 if(food.yes==0)
  235.                 {
  236.                         Lcd_Rectangle(food.x,food.y,food.x+2,food.y+2,1);
  237.                 }        
  238.                 for(n=snake.node-1;n>0;n--)
  239.                 {
  240.                         snake.x[n]=snake.x[n-1];
  241.                         snake.y[n]=snake.y[n-1];
  242.                 }
  243.                 switch(snake.direction)
  244.                 {
  245.                         case DOWN:snake.x[0]+=3;break;
  246.                         case UP:snake.x[0]-=3;break;
  247.                         case RIGHT:snake.y[0]-=3;break;
  248.                         case LEFT:snake.y[0]+=3;break;
  249.                         default:break;
  250.                 }
  251.                 for(n=3;n<snake.node;n++)//從第三節開始判斷蛇頭是否咬到自己
  252.                 {
  253.                         if(snake.x[n]==snake.x[0]&&snake.y[n]==snake.y[0])
  254.                         {
  255.                                 GameOver();
  256.                                 snake.life=1;
  257.                                 break;
  258.                         }
  259.                 }
  260.                 if(snake.x[0]<3||snake.x[0]>=90||snake.y[0]<3||snake.y[0]>=60)//判蛇頭是否撞到墻壁
  261.                 {
  262.                         GameOver();
  263.                         snake.life=1;
  264.                 }
  265.                 if(snake.life==1)
  266.                         break;//蛇死,則跳出while(1)循環
  267.                 if(snake.x[0]==food.x&&snake.y[0]==food.y)//判蛇是否吃到食物
  268.                 {
  269.                         Lcd_Rectangle(food.x,food.y,food.x+2,food.y+2,0);//消隱食物
  270.                         snake.x[snake.node]=200;
  271.                         snake.y[snake.node]=200;//產生蛇新的節坐標先放在看不見的位置
  272.                         snake.node++;//蛇節數加1
  273.                         food.yes=1;//食物標志置1
  274.                         if(++Score>=PASSSCORE)
  275.                         {
  276.                                 PrintScore();
  277.                                 GameOver();
  278.                                 break;
  279.                         }
  280.                         PrintScore();
  281.                 }
  282.                 for(n=0;n<snake.node;n++)
  283.                 {
  284.                         Lcd_Rectangle(snake.x[n],snake.y[n],snake.x[n]+2,snake.y[n]+2,1);
  285.                 }//根據蛇的節數畫出蛇
  286.                 delay(Speed*1000);          //調速
  287.                 delay(Speed*1000);
  288.                 Lcd_Rectangle(snake.x[snake.node-1],snake.y[snake.node-1],snake.x[snake.node-1]+2,snake.y[snake.node-1]+2,0);
  289.                 switch(KeyBuffer)
  290.                 {
  291.                         case FUNC:
  292.                                         KeyBuffer=0;
  293.                                         if(++Speed>=10)
  294.                                                 Speed=1;
  295.                                            PrintSpeed();
  296.                                         break;
  297.                         case DOWN:
  298.                                         KeyBuffer=0;
  299.                                         if(snake.direction!=UP)
  300.                                                 snake.direction=DOWN;
  301. ……………………

  302. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼

所有資料51hei提供下載:
貪吃蛇(HC6800-ES V2.0).rar (124.1 KB, 下載次數: 178)


評分

參與人數 2黑幣 +10 收起 理由
zjj59 + 5 共享資料的黑幣獎勵!
hahahahh + 5 贊一個!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏3 分享淘帖 頂3 踩
回復

使用道具 舉報

沙發
ID:244366 發表于 2017-10-30 21:22 | 只看該作者
謝謝分享,學習學習
回復

使用道具 舉報

板凳
ID:304001 發表于 2018-4-8 21:12 | 只看該作者
感謝分享,學習一下。
回復

使用道具 舉報

地板
ID:107424 發表于 2018-4-10 12:58 | 只看該作者
完全可以試試
回復

使用道具 舉報

5#
ID:304261 發表于 2018-4-12 12:57 | 只看該作者
為什么下載不了
回復

使用道具 舉報

6#
ID:306629 發表于 2018-4-12 15:22 | 只看該作者
謝謝分享
回復

使用道具 舉報

7#
ID:357173 發表于 2018-6-23 13:02 | 只看該作者
為什么下載不了?
回復

使用道具 舉報

8#
ID:76696 發表于 2018-8-1 18:57 | 只看該作者
謝謝了正好需要已經下載!!
回復

使用道具 舉報

9#
ID:394548 發表于 2018-9-6 14:39 | 只看該作者
謝謝了
回復

使用道具 舉報

10#
ID:415175 發表于 2018-10-25 13:15 | 只看該作者
贊一個!!!
回復

使用道具 舉報

11#
ID:413916 發表于 2018-10-25 14:21 | 只看該作者
  秀啊。贊一個
回復

使用道具 舉報

12#
ID:428688 發表于 2018-11-18 15:05 | 只看該作者
感覺很穩,謝謝分享~~
回復

使用道具 舉報

13#
ID:619861 發表于 2019-12-31 13:11 | 只看該作者
沒有仿真圖,不建議下載
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产高清免费 | 亚洲欧美日韩激情 | 给我免费的视频在线观看 | 久久久av | 成人一区二区在线 | 国产精品成人一区二区三区夜夜夜 | 91精品久久久久久久久中文字幕 | 天天色图 | 国产精品久久久99 | 成人亚洲 | 国产 欧美 日韩 一区 | 久久电影一区 | 国产成人精品区一区二区不卡 | 亚洲一区二区国产 | 日韩在线小视频 | 在线国产一区 | 91精品国产91久久久久久最新 | 亚洲欧美日韩中文在线 | 亚洲精品欧美 | 免费观看一区二区三区毛片 | 亚洲国产成人精品女人 | 中文字幕一区二区三区日韩精品 | 亚洲 91| 欧美影院 | 五月天国产 | 搞黄视频免费看 | 欧美在线 | 精品国产精品三级精品av网址 | 亚洲欧美国产毛片在线 | 日韩在线观看 | 99亚洲精品视频 | 欧美精品一区二区免费 | 三级成人在线 | 亚洲欧美自拍偷拍视频 | 久久久久久黄 | 四虎海外 | 国产高清一区二区三区 | 男女羞羞的网站 | 婷婷丁香在线视频 | 亚洲国产精品久久 | 色综合欧美 |