国产免费AV|泡泡玛特欧洲总部将设在伦敦|中文天堂网www新版资源在线|一本久道综合在线中文|国精产品一二三产区的使用方法|香蕉鱼在线观看|www.27eee

 找回密碼
 注冊
搜索

51單片機LCD12864液晶貪吃蛇游戲代碼和Proteus仿真

[復制鏈接]
樓主
eng 發表于 2021-6-14 03:42:20 | 只看該作者 |只看大圖 |倒序瀏覽 |閱讀模式
51單片機+12864液晶的貪吃蛇游戲機的詳細資料。仿真實物都做過,效果比較滿意。花的精力也比較多,代碼也全都是自己一行一行的寫下來。所以做完之后想把這些東西都整理一下,方便后面要做這些東西的人。
完整單片機c源碼和proteus仿真文件:
51單片機 12864液晶貪吃蛇游戲機(完美版).zip (170.69 KB, 售價: 5 E幣)
環境: keil V4.02    protues version 7.5
這個東西最主要的幾塊。
1.單片機用的是stc的,51內核,你首先要會這個···
2.用狀態機實現按鍵。這個里面有別人寫的技術帖子··
3.液晶是12864,2種控制器都做過,一個控制器是ST7920帶字庫的,一個控制器是KS0108不帶字庫的。2個的英文資料我都放在里面了。首先得弄懂液晶要怎么樣和單片機連接。
要在液晶上面做游戲,推薦先看英文資料,一定要看英文,研究液晶讀寫時序和初始化方法,然后找別人的程序,實現液晶的基本操作,畫點,寫漢字什么的,讀液晶···然后自己寫程序實現液晶的所有基本操作。這樣才能對液晶有充分的認識,才能開始在上面做游戲。有了這個基礎,以后學別的液晶也會快的多。
4.菜單,游戲少不了要用到菜單,比如選擇難度,選擇地圖什么的。我里面放了一個別人的論文,看了之后應該就會自己寫了。(注意論文里面講的是用函數指針實現菜單,但是KEIL這個環境下用51函數指針會很困難,推薦像我那樣直接傳菜單號)
5.貪吃蛇游戲,推薦先不要看別人的程序,自己在電腦上面下個貪吃蛇游戲,玩的時候就觀察貪吃蛇游戲的特征···比如蛇在怎么動,蛇要怎么描述,是每個點都描述還是只要蛇頭蛇尾···蛇轉彎的時候怎么寫?  對于上面的問題,可以參考別人的程序,然后就開始動手畫圖什么的表示出來這些過程,一個功能一個功能逐一實現。(推薦看帶字庫的那個程序,那個程序代碼是最終優化版本。思路很清晰···)
6.液晶的動畫,動畫實際上就是圖片一張一張的顯示,我在里面放了一個把彩色照片黑白二值化的工具,可以找到自己喜歡的GIF動畫,用提取工具把照片一張一張提取出來,然后黑白二值化,然后取模工具取模,然后實現···雖然過程蠻枯燥,但是效果還不過,也可以學到不少東西。
最后希望大家在看這個的時候,特別是貪吃蛇游戲實現的時候,哪一個方面有更好的辦法一定通知我,因為我覺得我實現貪吃蛇游戲的方法已經很不錯了。如果能有更好的,我會非常希望學習下····

仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
51單片機LCD12864液晶貪吃蛇游戲代碼和Proteus仿真 1.png
部分源碼:完整源碼見附件
  1. struct loop_queue  //利用數組實現循環隊列,拐點不會超過15個。所以大小選15足以。
  2. {   
  3.         unsigned int front;
  4.         unsigned int rear;
  5.         unsigned int count;
  6.         struct she dat[num];
  7. };
  8. //不熟悉數組實現循環隊列的可以在紙上畫一下操作過程

  9. struct she tou,wei,food; //蛇的頭尾節點  和食物點
  10. struct loop_queue queue;//循環隊列  蛇轉彎則形成拐點 將拐點入隊列  尾巴到達拐點則拐點出隊列

  11. unsigned char flag_exit_game; //返回標志  為1時  從貪吃蛇游戲返回菜單
  12. unsigned char flag_game_over; //結束標志  為1時  顯示游戲結束畫面 同時使返回標志為1
  13. unsigned char tcs_key_flag;  //貪吃蛇在一次移動中   只允許捕獲一次按鍵  也就是只能產生一個拐點
  14. unsigned char tcs_key_state; //用于按鍵狀態機的實現
  15. unsigned int  tcs_df;  //貪吃蛇得分
  16. unsigned char tcs_stop;//貪吃蛇暫定功能的實現

  17. unsigned char tcs_nd;  //貪吃蛇難度的選擇
  18. unsigned char tcs_dt;  //貪吃蛇地圖的選擇 這2個是全局變量  在menu里面要用到


  19. void tcs_bianjie(unsigned int he);//貪吃蛇游戲地圖的實現和邊界
  20. void timer0_initial();
  21. void timer1_initial();

  22. //循環隊列的基本操作
  23. void queue_initial(struct loop_queue *q);  
  24. void queue_in(struct loop_queue *q,struct she h)  ;
  25. struct she queue_out(struct loop_queue *q)  ;

  26. void tcs_game_initial();
  27. void food_produce();

  28. void tcs_game()
  29. {
  30.         struct she check;  //用與暫存蛇即將移動的點  從而進行判斷
  31.         unsigned int he;
  32.         unsigned char flag;//flag作為吃到食物的標志

  33.         flag_exit_game=0;
  34.         flag_game_over=0;
  35.         tcs_key_state=0;
  36.         tcs_df=0;
  37.         tcs_stop=1;

  38. //        draw_lcd_picture(&tcs_picture[0]); //貪吃蛇游戲畫面
  39. //        delay_ms(2000);

  40.         tcs_bianjie(tcs_dt); //貪吃蛇游戲邊界
  41.         tcs_game_initial();//貪吃蛇初始化  主要是設定蛇頭蛇尾  并顯示蛇
  42.         timer0_initial(); //定時器0工作在方式2  8位自動裝初值  只計數不中斷 用來產生隨機數
  43.         timer1_initial(); //定時器1工作在方式1        16位     10ms中斷一次掃描鍵盤

  44.         do
  45.         {
  46.                 food_produce();//產生一個隨機數 即隨即產生x y value3個值確定一個點為食物
  47.                 he=test_point_exist(food.x,food.y,food.value);//檢測產生的點的地方是否已經有點存在
  48.         }
  49.         while(he==food.value);//如果隨機數產生在蛇的身體以及邊界上 則重新再產生一個  
  50.         draw_lcd_point(food.x,food.y,food.value);//顯示食物 先讀取這個點所在xy的情況 以免破壞現場
  51.         
  52.         queue_initial(&queue);//初始化循環隊列  使隊列空  front rear 即頭尾指針為0

  53.         while(1)
  54.         {
  55.                 if(flag_exit_game==1)//如果游戲過程中按下返回鍵  則立即結束游戲  返回菜單
  56.                         break;
  57.                 if(flag_game_over==1)//如果游戲過程中蛇死了  則立即結束游戲 顯示結束動畫 按鍵后返回菜單
  58.                         break;
  59.                
  60.                 ET1=1;   //允許掃描按鍵          貪吃蛇游戲難度決定蛇2次移動之間的間隔時間  也就是檢測按鍵的時間
  61.                 tcs_key_flag=0; //允許捕獲按鍵  在檢測按鍵時間內  只允許生產一個拐點  即捕獲到一個有效的
  62.                                                 //按鍵以后  就置一這個變量 不允許再增加拐點
  63.                 while(tcs_stop==0);//暫定鍵按下會取反tcs_stop的值  從而實現暫停功能
  64.                 switch(tcs_nd)
  65.                 {
  66.                         case 0:  {delay_ms(10); break;}//0代表變態難度  蛇的2次移動之間只有10ms的機會檢測鍵盤按下
  67.                         case 1:  {delay_ms(50); break;}//難度減小  2次移動間隔增加
  68.                         case 2:  {delay_ms(100); break;}
  69.                 }
  70.                 ET1=0;

  71.                 switch(tou.direction)//這個switch用來根據蛇頭的x y value值以及當前蛇頭移動的方向
  72.                                                          //取出蛇頭要到達的下一個點  存入check中  來判斷是否撞墻 吃到食物 什么的···
  73.                 {        
  74.                         case 0: {         
  75.                                                 check.y=tou.y;
  76.                                                 if(tou.value==0x0001)//x的值要發生改變
  77.                                                 {
  78.                                                         if(tou.x==3)//蛇碰到上屏幕的右邊界  則回到左邊界
  79.                                                                 check.x=0;
  80.                                                         else if(tou.x==11)//蛇碰到下屏幕的右邊界  則回到左邊界
復制代碼

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

本版積分規則

手機版|小黑屋|ELEOK |網站地圖

GMT+8, 2026-5-26 02:48

Powered by Discuz! X5.0

© 2001-2026 Discuz! Team.

快速回復 返回頂部 返回列表