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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

51單片機俄羅斯方塊代碼 12864液晶顯示

[復制鏈接]
跳轉到指定樓層
樓主
用51單片機和12864顯示屏,60s2芯片,獨立按鍵做的俄羅斯方塊程序,用的話改一下端口即可。


單片機源程序:
  1. //說明******************************
  2. //此程序包含一個俄羅斯方塊.c 文件和一個12864.h 文件
  3. //********************俄羅斯方塊.c文件**************************
  4. //
  5. #include <reg51.h>        
  6. #include "12864.h"
  7. static unsigned long Seed = 1;
  8. #define A 48271L
  9. #define M 2147483647L
  10. #define Q (M / A)//44488
  11. #define R (M % A)//3399

  12. sbit K1=P3^5;
  13. sbit K2=P3^4;
  14. sbit K3=P3^3;
  15. sbit K4=P3^2;
  16. unsigned int idata num[19+2]={
  17. 0xfff,//第1行,最下面
  18. 0x801,0x801,0x801,0x801,0x801,0x801,0x801,0x801,0x801,0x801,
  19. 0x801,0x801,0x801,0x801,0x801,0x801,0x801,0x801,0x801,//第2行到第20行共19行
  20. 0xfff//第21行,最上面

  21. };



  22. //定義共21行,其中num[0]為下墻壁行,num[20]為上墻壁行,每行12格,最左一格為左墻壁列,最右一格為右墻壁列
  23. /*
  24.                         0 1        2 3        4 5        6 7 8 9        10 11
  25.         0   ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■
  26.                 1   ■ □ □ □ □ □ □ □ □ □ □ ■
  27.                 2   ■ □ □ □ □ □ □ □ □ □ □ ■
  28.                 3   ■ □ □ □ □ □ □ □ □ □ □ ■
  29.                 4   ■ □ □ □ □ □ □ □ □ □ □ ■
  30.                 5   ■ □ □ □ □ □ □ □ □ □ □ ■
  31.                 6   ■ □ □ □ □ □ □ □ □ □ □ ■
  32.                 7   ■ □ □ □ □ □ □ □ □ □ □ ■
  33.                 8   ■ □ □ □ □ □ □ □ □ □ □ ■                  
  34.                 9   ■ □ □ □ □ □ □ □ □ □ □ ■
  35.             10  ■ □ □ □ □ □ □ □ □ □ □ ■
  36.             11  ■ □ □ □ □ □ □ □ □ □ □ ■
  37.             12  ■ □ □ □ □ □ □ □ □ □ □ ■
  38.              13        ■ □ □ □ □ □ □ □ □ □ □ ■
  39.         14        ■ □ □ □ □ □ □ □ □ □ □ ■
  40.             15        ■ □ □ □ □ □ □ □ □ □ □ ■
  41.             16        ■ □ □ □ □ □ □ □ □ □ □ ■
  42.             17        ■ □ □ □ □ □ □ □ □ □ □ ■
  43.             18        ■ □ □ □ □ □ □ □ □ □ □ ■
  44.             19        ■ □ □ □ □ □ □ □ □ □ □ ■
  45.             20        ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■


  46. */
  47. unsigned char code Block[28][2]={
  48. /*
  49. *   口     口口口   口口
  50. *   口     口         口      口
  51. *   口口              口  口口口      
  52. */
  53. {0x88,0xc0},{0xe8,0x00},{0x62,0x20},{0x02,0xe0},
  54. /*
  55. *   口        口口 口口口
  56. *   口 口     口       口
  57. * 口口 口口口 口   
  58. */
  59. {0x22,0x60},{0x08,0xe0},{0xc8,0x80},{0xe2,0x00},  
  60. /*
  61. *   口
  62. *   口口         口口
  63. *     口       口口
  64. */
  65. {0x8c,0x40},{0x6c,0x00},{0x8c,0x40},{0x6c,0x00},
  66. /*
  67. *   口        口口
  68. * 口口          口口
  69. * 口
  70. */
  71. {0x4c,0x80},{0xc6,0x00},{0x4c,0x80},{0xc6,0x00},  
  72. /*
  73. *          口                口
  74. *   口     口口   口口口   口口
  75. * 口口口   口       口       口
  76. */
  77. {0x04,0xe0},{0x8c,0x80},{0xe4,0x00},{0x26,0x20},
  78. /*口
  79. * 口
  80. * 口       口口口口
  81. * 口
  82. */
  83. {0x44,0x44},{0x0f,0x00},{0x44,0x44},{0x0f,0x00},  
  84. /*
  85. * 口口
  86. * 口口
  87. */  
  88. {0x06,0x60},{0x06,0x60},{0x06,0x60},{0x06,0x60}
  89. };

  90. #define PASSSCORE 20


  91. struct Jimu
  92. {
  93.         unsigned int dat;
  94.          char x;
  95.         unsigned char y;
  96.         unsigned char type;
  97.         unsigned char change;
  98. }Sign[3];//積木結構體

  99. unsigned char SysFlag=0;
  100. #define NEWSIGNFLAG 0
  101. #define DEADFLAG 1
  102. #define PAUSEFLAG 2

  103. unsigned char Score=0;
  104. unsigned char Level=1;
  105. unsigned char DelayCnt=5;


  106. /*********************************************************/
  107. #define N 25
  108. /************************************
  109. 偽隨機數發生器
  110. *************************************/
  111. double Random(void)
  112. {
  113.         long TmpSeed;
  114.         TmpSeed=A*(Seed%Q)-R*(Seed/Q);
  115.         if(TmpSeed>=0)
  116.                 Seed=TmpSeed;
  117.         else
  118.                 Seed=TmpSeed+M ;
  119.         return (double)Seed/M;
  120. }

  121. /**************************************
  122. 為偽隨機數發生器播種
  123. ***************************************/
  124. void InitRandom(unsigned long InitVal)
  125. {
  126.         Seed=InitVal;
  127. }

  128. //延時子程序
  129. void Delay(unsigned int t)
  130. {  
  131.         unsigned int i,j;
  132.         for(i=0;i<t;i++)
  133.                 for(j=0;j<10;j++);   
  134. }
  135. /*********************************
  136. 初始化MPU
  137. **********************************/
  138. void InitCpu(void)
  139. {
  140.          TMOD=0x0;
  141.         TH0=0;
  142.         TL0=0;
  143.         TR0=1;
  144.         ET0=1;               
  145.         EX1=1;
  146.         EA=1;
  147.     TCON|=0x04;
  148. }
  149. /****************************
  150. welcome          游戲選擇界面
  151. /**********************/
  152. void welcome()
  153. {
  154.         Lcd_WriteStr(0,0,"歡迎來玩");
  155.         Lcd_WriteStr(0,1,"俄羅斯方塊 ");
  156.         Lcd_WriteStr(0,2,"設置按K1");
  157.         Lcd_WriteStr(0,2,"開玩按K2");
  158.         
  159. }
  160. /**************************************************俄羅斯方塊部分******************************************************8**********/



  161. /******************************畫墻壁,初始化界面*******************************/
  162. void DrawBoard(void)
  163. {
  164.         unsigned char n;
  165.         for(n=0;n<12;n++)
  166.         {
  167.                 Lcd_Rectangle(3*n,0,3*n+2,2,1);
  168.                 Lcd_Rectangle(3*n,60,3*n+2,62,1);
  169.         }
  170.         for(n=0;n<20;n++)
  171.         {
  172.                 Lcd_Rectangle(0,3*n,2,3*n+2,1);
  173.                 Lcd_Rectangle(33,3*n,35,3*n+2,1);               
  174.         }
  175.         Lcd_WriteStr(4,0,"經典游戲");
  176.         Lcd_WriteStr(3,2,"Score:");
  177.         Lcd_WriteStr(3,3,"Level:");
  178. }

  179. /***********************************
  180. 游戲結束處理
  181. ************************************/
  182. void GameOver(void)
  183. {
  184.         if((SysFlag&(1<<DEADFLAG))!=0)
  185.                 Lcd_WriteStr(3,1,"You Fail");
  186.         else
  187.                 Lcd_WriteStr(3,1,"You Pass");
  188. }

  189. unsigned int code MaskTab[16]={
  190. 0x0001,0x0002,0x0004,0x0008,0x0010,0x0020,0x0040,0x0080,
  191. 0x0100,0x0200,0x0400,0x0800,0x1000,0x2000,0x4000,0x8000
  192. };

  193. /**********************************
  194. 根據積木圖標左下坐標X,Y來畫出積木圖標
  195. ***********************************/
  196. void DrawSign(struct Jimu Temp,unsigned char DrawMode)
  197. {
  198.         unsigned char m,n;
  199.         for(m=0;m<4;m++)
  200.                 for(n=0;n<4;n++)
  201.                 {
  202.                         if((Temp.dat&MaskTab[4*m+n])!=0)
  203.                                 Lcd_Rectangle(Temp.x+n*3,Temp.y-2-3*m,Temp.x+n*3+2,Temp.y-3*m,DrawMode);
  204.                 }
  205. }

  206. /********************************
  207. 將積木圖標值融入num數據中
  208. 也即把積木圖標固定,無法再下降
  209. *********************************/
  210. void FixSign(void)
  211. {
  212.         unsigned char m,n;
  213.         for(m=0;m<4;m++)//行循環
  214.                 for(n=0;n<4;n++)//列循環
  215.                 {
  216.                         if((Sign[0].dat&MaskTab[4*m+n])!=0)
  217.                         {
  218.                                 num[20-(Sign[0].y-2)/3+m]|=MaskTab[11-Sign[0].x/3-n];
  219.                         }
  220.                 }
  221. }

  222. /********************************
  223. 判斷積木圖標中方塊是否與障礙方塊重合
  224. *********************************/
  225. unsigned char CheckIf(void)
  226. {
  227.         unsigned char m,n;
  228.         for(m=0;m<4;m++)//行循環
  229.                 for(n=0;n<4;n++)//列循環
  230.                 {
  231.                         if((Sign[1].dat&MaskTab[4*m+n])!=0)
  232.                         {
  233.                                 if((num[20-(Sign[1].y-2)/3+m]&MaskTab[11-Sign[1].x/3-n])!=0)
  234.                                         return 0;
  235.                         }
  236.                 }
  237.         return 1;
  238. }

  239. /********************************
  240. 判斷積木圖標是否可以繼續下降一格
  241. ********************************/
  242. unsigned char CheckIfDown(void)
  243. {
  244.         Sign[1]=Sign[0];//
  245.         Sign[1].y+=3;//假設下降一格        
  246.         return CheckIf();
  247.         
  248. }

  249. /********************************
  250. 判斷積木圖標是否可以向左移動
  251. *********************************/
  252. unsigned char CheckIfLeft(void)
  253. {
  254.         Sign[1]=Sign[0];
  255.         Sign[1].x-=3;        
  256.         return CheckIf();
  257. }

  258. /********************************
  259. 判斷積木圖標是否可以向右移動
  260. *********************************/
  261. unsigned char CheckIfRight(void)
  262. {
  263.         Sign[1]=Sign[0];
  264.         Sign[1].x+=3;        
  265.         return CheckIf();
  266. }

  267. /********************************
  268. 判斷是否可以旋轉
  269. *********************************/
  270. unsigned char CheckIfRoll(void)
  271. {
  272.         unsigned char i;
  273.         unsigned int Temp;
  274.         Sign[1]=Sign[0];
  275.         if(++Sign[1].change>3)                                 
  276.                 Sign[1].change=0;
  277.            i=Sign[1].type*4+Sign[1].change;
  278.         Temp=(unsigned int)Block[i][0]<<8;
  279.         Temp=Temp|Block[i][1];
  280.         Sign[1].dat=Temp;
  281.         
  282.         return CheckIf();
  283. }

  284. /********************************
  285. 尋找滿格的行并做消除處理
  286. 最多尋找4個滿行并做消除
  287. *********************************/
  288. void DelFull(void)
  289. {
  290.         unsigned char m,n;
  291.         unsigned char Temp;
  292.         unsigned char Flag=0;
  293.         Temp=(Sign[0].y-2)/3;
  294.         if(Temp>=20)//防止越過了下邊界
  295.                 Temp=1;
  296.         else
  297.                 Temp=20-Temp;
  298.         for(n=Temp+3;n>=Temp;n--)//積木圖標的最頂行開始尋找滿行比較有利于運算
  299.         {
  300.                 if(num[n]==0xfff)
  301.                 {
  302.                         Flag=1;
  303.                         for(m=n+1;m<=19;m++)
  304.                         {
  305.                                 num[m-1]=num[m];
  306.                         }
  307.                         num[m]=0x801;
  308.                         Score++;//每找到一個滿行,則分數加1
  309.                 }
  310.         }
  311.         if(Flag)//為加速而設置并判斷的標志,有已固定的積木有滿格消行變化則重畫積木界面
  312.         {
  313.                 for(m=Temp;m<=19;m++)//為加速,不必要重第一行重畫起,只需要從積木圖標最下行開始往上的重畫
  314.                         for(n=1;n<=10;n++)
  315.                         {
  316.                                 if((num[m]&MaskTab[n])==0)
  317.                                 {        
  318.                                         if(Lcd_ReadPixel(30-(n-1)*3,57-(m-1)*3)!=0)//為加速而做的讀象素操作
  319.                                         {
  320.                                                 Lcd_Rectangle(30-(n-1)*3,57-(m-1)*3,30-(n-1)*3+2,57-(m-1)*3+2,0);
  321.                                         }
  322.                                 }
  323.                                    else
  324.                                 {
  325.                                         if(Lcd_ReadPixel(30-(n-1)*3,57-(m-1)*3)==0)//為加速而做的讀象素操作
  326.                                         {
  327.                                                 Lcd_Rectangle(30-(n-1)*3,57-(m-1)*3,30-(n-1)*3+2,57-(m-1)*3+2,1);
  328.                                         }
  329.                                 }
  330.                         }
  331.         }
  332. }


  333. /*******************************
  334. 隨機產生一個積木圖標放到預產生區域并顯示出來
  335. ********************************/
  336. void CreatSign(void)
  337. {
  338.         unsigned char n;
  339.         unsigned int Temp;

  340.         DrawSign(Sign[2],0);//先清除

  341.         n=Random()*28;
  342.         Temp=(unsigned int)Block[n][0]<<8;
  343.         Temp=Temp|Block[n][1];
  344.         Sign[2].dat=Temp;
  345.         Sign[2].x=45;
  346.         Sign[2].y=4*3+2;
  347.         Sign[2].type=n/4;
  348.         Sign[2].change=n%4;
  349.         DrawSign(Sign[2],1);//后畫出
  350. }

  351. void PrintScore(void)
  352. {
  353.         unsigned char Str[3];
  354.         Str[0]=(Score/10)|0x30;
  355.         Str[1]=(Score%10)|0x30;
  356.         Str[2]=0;
  357.         Lcd_WriteStr(6,2,Str);
  358. }
復制代碼


全部資料51hei下載地址:
參考代碼--俄羅斯游戲代碼.zip (62.52 KB, 下載次數: 76)


評分

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

查看全部評分

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

使用道具 舉報

沙發
ID:402815 發表于 2018-9-26 19:25 | 只看該作者
12864,俄羅斯方塊
回復

使用道具 舉報

板凳
ID:282941 發表于 2018-11-26 20:55 | 只看該作者
樓主,有對應的電路圖。
回復

使用道具 舉報

地板
ID:435181 發表于 2018-11-28 19:47 | 只看該作者
有電路圖嗎?樓主
回復

使用道具 舉報

5#
ID:375381 發表于 2018-12-10 16:14 來自手機 | 只看該作者
八個數據傳輸口是哪個?p1還是p2
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 刘亦菲国产毛片bd | 国产一区二区三区在线 | 午夜精品一区二区三区在线视频 | 国产一区二区三区四区五区3d | 日韩一级二级片 | 久久成人激情 | 日韩一级不卡 | 欧美日韩在线电影 | 中国美女av | 日本精品一区二区三区在线观看视频 | 亚洲国产精久久久久久久 | 亚洲区在线 | 亚洲二区在线 | japan21xxxxhd美女 日本欧美国产在线 | cao在线| 国产精品色 | 欧美成人a∨高清免费观看 老司机午夜性大片 | 国产成人免费视频网站视频社区 | 国产日韩视频在线 | 欧美成人免费在线视频 | 精品国产18久久久久久二百 | 国产高清精品在线 | 精品欧美乱码久久久久久 | 欧美精品一区二区三区在线 | 久久久久久久久久久高潮一区二区 | 日韩欧美专区 | 免费看a | 日本不卡一区 | 精品九九在线 | 天天艹日日干 | 四虎影院在线观看免费视频 | 国产精品2 | 精品一区二区三区在线观看 | 中文字幕一区二区三区四区五区 | 四虎国产 | 一区二区免费在线 | 91看片网址| 国产精品久久久久久 | 二区中文| 欧美日韩亚洲系列 | 日韩第一夜 |