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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5513|回復: 5
收起左側

單片機8*8點陣貪吃蛇仿真程序(將要點亮的坐標轉化成碼表教程)

[復制鏈接]
ID:456306 發表于 2019-1-24 22:26 | 顯示全部樓層 |閱讀模式
自己編的貪吃蛇程序,最多就用到了數組,很適合小白,注釋比較全

如何將要點亮的坐標轉化成點陣屏需要的碼表
0.png

紅色的位置坐標為(0,0)
假設我們要點亮藍色的位置,即點亮坐標(2,0)和(2,1),由點陣屏的知識我們知道,我們需要的碼表tabel[8]={
1 1 0 1 1 1 1 1   -->  0xdf
1 1 0 1 1 1 1 1   -->  0xdf
1 1 1 1 1 1 1 1   -->  0xff
1 1 1 1 1 1 1 1   -->  0xff
1 1 1 1 1 1 1 1   -->  0xff
1 1 1 1 1 1 1 1   -->  0xff
1 1 1 1 1 1 1 1   -->  0xff
}
0.png

很容易發現,需要點亮的位置就要置零
所以我們可以先設一個tabel={0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff}
假設我們的坐標存在一個二維數組里snake[20][2]={{2,0},{2,1}}(后面不賦值的就默認為0,0了)
縱坐標正好就表示我們要修改tabel的第幾個數
比如坐標(2,0),我們需要將tabel[0]的0xff的第六位(從右往左數)置零
所以我們可以從這里找到聯系(同標紅和同標藍的數據有聯系),用以下方法
for(i=0;i<n;i++)//這里的n表示要顯示點的個數,此處為n=2
{
tabel[snake[ i][1]]=tabel[snake[ i][1]]^(unsigned char)pow(2,7-snake[ i][0]);
}
其中pow函數是求2的n次方的,包含在頭文件<math.h>里,返回值是double
所以要強制類型轉換成unsigned char,我們拿縱坐標對應的那個tabel的0xff
與  2的(7-橫坐標)次方  按位異或,有點拗口 看例子:
當i=0時,snake[0]={2,0}
pow(2,7-snake[ i][0])=100000
11111111與100000按位異或=11011111即0xdf
當i=2時,snake[1]={2,1}
pow(2,7-snake[ i][0])=100000
11111111與100000按位異或=11011111即0xdf
當i>=2時,tabel為初始值0xff
因此實現了坐標轉碼表

作者:小仙峰

仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
C_8$STR0L`~_(4`5~P6UK49.png

單片機貪吃蛇源程序如下:
  1. #include<reg51.h>
  2. #include<math.h>
  3. #include<intrins.h>
  4. #define max 20//最大蛇長
  5. #define delay 300//delay越小越快
  6. sbit DIO=P3^4;//串行數據口
  7. sbit SHCP=P3^5;//移位寄存器時鐘
  8. sbit STCP=P3^6;//輸出鎖存器時鐘
  9. sbit up=P1^0;//獨立鍵盤上
  10. sbit down=P1^1;//獨立鍵盤下
  11. sbit left=P1^2;//左
  12. sbit right=P1^3;//右
  13. unsigned char n,i,j,ifdie,button,ret;//依次為當前蛇長,通用循環變量(i和j),是否死亡,上下左右命令儲存,果子,eating的返回值
  14. unsigned char snake[max][2]={1,0,0,0};//蛇的每一個點的坐標數組,蛇頭(1,0),第二段為(0,0)
  15. unsigned char tabel[8] ={0};//這個相當于一個8*8矩陣,用于裝坐標轉換成的的74HC595需要的8個16進制碼
  16. unsigned char apple[2]={3,3};//初始果子位置,隨機數有點麻煩
  17. void direction(void);//判斷上下左右函數
  18. void eating(void);//判斷吃果子函數
  19. void die(void);//判斷死亡函數                        
  20. void send_byte(unsigned char byte);//74HC595串入并出要用到的函數
  21. void show(void);//以上都是處理蛇的坐標,這個函數就是將要顯示的坐標轉換成74HC595能識別的16進制碼
  22. void main()
  23. {
  24.         ifdie=1;//先賜死
  25.         while(ifdie)
  26.         {
  27.                 ifdie=0;//然后重生
  28.                 n=2;//初始蛇長為2
  29.                 snake[0][0]=1; snake[0][1]=0;//蛇每次重生在左上角
  30.                 snake[1][0]=0; snake[1][1]=0;//蛇每次重生在左上角
  31.                 apple[0]=3; apple[1]=3;//果子回到初始位置
  32.                 button=0;//重生后要把按鍵賦零
  33.                 while(ifdie!=1)//蛇沒死我們就循環執行
  34.                 {        
  35.                         ret=0;//每一輪開始都設沒吃到果子
  36.                         direction();//判斷方向,改變坐標
  37.                         eating();//判斷如果吃到果子身長+1                                       
  38.                         die();//判斷死沒死
  39.                         show();//將蛇身的坐標轉碼展示到點陣屏上
  40.                         if(n==max)
  41.                                 ifdie=1;//蛇長最大了,賜死吧
  42.                 }
  43.         }
  44. }
  45. void direction(void)//判斷方向
  46. {
  47.         if(button==1&&snake[0][1]!=snake[1][1]+1)//向上
  48.         {
  49.                 for(i=n-1;i>0;i--)//后一個蛇身坐標等于前一個蛇身坐標
  50.                 {
  51.                         for(j=0;j<2;j++)
  52.                         snake[i][j]=snake[i-1][j];
  53.                 }
  54.                 snake[0][1]--;//蛇頭縱坐標減一
  55.         }
  56.         if(button==2&&snake[0][1]!=snake[1][1]-1)//向下
  57.         {
  58.                 for(i=n-1;i>0;i--)
  59.                 {
  60.                         for(j=0;j<2;j++)
  61.                         snake[i][j]=snake[i-1][j];                        
  62.                 }
  63.                 snake[0][1]++;               
  64.         }        
  65.         if(button==3&&snake[0][0]!=snake[1][0]+1)//向左
  66.         {
  67.                 for(i=n-1;i>0;i--)
  68.                 {
  69.                         for(j=0;j<2;j++)
  70.                         snake[i][j]=snake[i-1][j];        
  71.                 }
  72.                 snake[0][0]--;               
  73.         }               
  74.         if(button==4&&snake[0][0]!=snake[1][0]-1)//向右
  75.         {
  76.                 for(i=n-1;i>0;i--)
  77.                 {
  78.                         for(j=0;j<2;j++)
  79.                         snake[i][j]=snake[i-1][j];        
  80.                 }
  81.                 snake[0][0]++;               
  82.         }
  83. }
  84. void eating(void)
  85. {
  86.         if(snake[0][0]==apple[0]&&snake[0][1]==apple[1])//當蛇頭坐標與果子坐標相同時
  87.         {
  88.                 for(j=0;j<2;j++)
  89.                 {
  90.             snake[n][j]=snake[n-1][j];//吃到果子后,蛇的下一節長出來
  91.                         apple[j]=snake[n-1][j];//不會隨機數,所以下一個果子出現在蛇尾
  92.                 }
  93.                 n++;//蛇長加一
  94.                 ret = 1;//告訴下面的步驟:吃到了果子
  95.         }
  96. }
  97. void die(void)
  98. {
  99.         if(snake[0][0]==8||snake[0][0]==255||snake[0][1]==8||snake[0][1]==255)//蛇頭出界
  100.                 ifdie=1;//死掉
  101.         for(i=4;i<n;i++)//因為撞自己蛇長至少要五,所以i從四開始
  102.         {
  103.                         if(snake[0][0]==snake[i][0]&&snake[0][1]==snake[i][1])
  104.                                 ifdie=1;//如果蛇頭和蛇身坐標重合,死掉
  105.         }
  106. }
  107. void send_byte(unsigned char byte)//這是清翔講的8*8點陣屏+74HC595的標配函數
  108. {
  109.         unsigned char dat;
  110.         dat=byte;
  111.         for(j=0;j<8;j++)
  112.         {
  113.                 SHCP=0;
  114.                 STCP=0;
  115.                 if(dat & 0X01)
  116.                         DIO=1;
  117.                 else
  118.                         DIO=0;
  119.                 SHCP=1;
  120.                 dat>>=1;
  121.         }
  122. }
  123. void show(void)//這個比較關鍵,把坐標轉化成8個16進制數
  124. {
  125.         unsigned char lie=0x80;
  126.         unsigned int z;
  127.         unsigned char t;
  128.         for( i=0;i<8;i++)
  129.                 tabel[i]=0xff;//先重置tabel,全都賦值0xff
  130.         if(ret) t=n-1;//如果這一輪吃到了果子,那么蛇長加了一,而實
  131.         else t=n;//   際上這一輪需要顯示的是沒加一的蛇(因為蛇頭和果子重合)
  132.         for(i=0;i<t;i++)//具體思路略
  133.                 tabel[snake[i][1]]=tabel[snake[i][1]]^(unsigned char)pow(2,7-snake[i][0]);
  134.         if(ret==0) tabel[apple[1]]=tabel[apple[1]]^(unsigned char)pow(2,7-apple[0]);
  135.         if(n==max)//如果蛇長達到最大了,我們就讓全屏亮
  136.         {
  137.                 for(i=0;i<8;i++)
  138.                 {
  139.                         tabel[i]=0;
  140.                 }
  141.         }
  142.         for(z=0;z<delay;z++)//這里也是使用74HC595的步驟
  143.         {

  144.                 for(i=0;i<8;i++)
  145.                 {
  146.                         send_byte(tabel[i]);
  147.                         send_byte(lie);
  148.                         STCP=0;
  149.                         STCP=1;
  150.                         lie=_cror_ (lie,1);
  151.                 }
  152.                 if(up==0)//由于需要全程掃描按鍵是否被按下,那就在顯示過程中掃描
  153.                         button=1;
  154. ……………………

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

所有資料51hei提供下載:
貪吃蛇小仙峰版.zip (148.21 KB, 下載次數: 98)


評分

參與人數 1黑幣 +100 收起 理由
admin + 100 共享資料的黑幣獎勵!

查看全部評分

回復

使用道具 舉報

ID:461428 發表于 2019-1-31 10:40 來自手機 | 顯示全部樓層
一點都看不明白。不知道咋轉換的
回復

使用道具 舉報

ID:456306 發表于 2019-2-18 21:30 | 顯示全部樓層
當時寫的時候腦洞開的比較大,再看確實有點復雜,畢竟只是一個小小的實現方式,使用情景并不多,看看就好
回復

使用道具 舉報

ID:617937 發表于 2019-9-29 17:54 | 顯示全部樓層
15621048596 發表于 2019-2-18 21:30
當時寫的時候腦洞開的比較大,再看確實有點復雜,畢竟只是一個小小的實現方式,使用情景并不多,看看就好

你用是共陽的還是共陰的點陣
回復

使用道具 舉報

ID:456306 發表于 2021-3-21 20:19 | 顯示全部樓層
兩年后再看已經一頭霧水了,水平有限,各位看官見諒
回復

使用道具 舉報

ID:456306 發表于 2021-3-21 20:33 | 顯示全部樓層
上面的pow(2,N)可以使用0x01 << N來替代
鬼知道當時為什么用pow來移位...
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 欧美视频三级 | 日韩不卡在线观看 | 2019精品手机国产品在线 | 欧美影院| av在线播放一区二区 | 国产亚洲精品成人av久久ww | 在线播放国产一区二区三区 | 久久夜色精品国产 | 91精品国产一区二区三区 | 91精品久久久久久久久中文字幕 | 午夜视频在线播放 | 黑人成人网 | 亚洲一区二区三区四区在线观看 | 九九九视频在线 | 久久99精品久久久久 | 国产视频中文字幕在线观看 | 自拍在线 | 国产在线不卡 | 日日骚网 | 毛色毛片免费看 | 国产一区视频在线 | 欧美日韩国产在线观看 | 亚洲精品久久久久久久久久久久久 | 天堂av中文在线 | 91成人在线 | 在线视频a | 91精品久久久久久久久99蜜臂 | 免费观看黄 | 欧美精品日韩 | 久久久久久久久久久高潮一区二区 | 午夜视频免费网站 | 免费的av| 国产精品99久久久久久久久 | 在线成人www免费观看视频 | 操久久 | 自拍偷拍第一页 | 久久久久国产精品 | 羞羞视频网站在线观看 | 亚洲精品性视频 | 欧美色综合天天久久综合精品 | 精品国产99 |