找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5887|回复: 9
收起左侧

STM32F103小游戏机源程序 五子棋+贪吃蛇+黄金矿工

  [复制链接]
ID:626321 发表于 2020-11-26 16:54 | 显示全部楼层 |阅读模式
硬件需求:4.3寸电容屏TFTLCD,STM32F1精英版使用的是寄存器版本!!!
制作出来的实物图如下:
IMG_20201126_165218.jpg IMG_20201126_165211.jpg IMG_20201126_165140.jpg IMG_20201126_165132.jpg

单片机源程序如下:
  1. #include "sys.h"
  2. #include "delay.h"
  3. #include "usart.h"                           
  4. #include "lcd.h"
  5. #include "touch.h"
  6. #include "timer.h"
  7. #include "game.h"
  8. #include "beep.h"
  9. #include "led.h"
  10. #include "stdlib.h"





  11. u8 game_switch=0;
  12. u16 random_num=1;

  13. void choose_game(void);

  14. /////////黄金矿工
  15. u8 game_mode=0;
  16. u8 game_grade=1;
  17. u16 target_score[5]={650,1295,2010,3095,4450};
  18. u16 your_score=0;
  19. u8 game_time=60;
  20. u8 hook_down_sign=0;
  21. void golden_miner(void);

  22. ////////////五子棋
  23. void gobang(void);
  24. u8 key_sign=0;
  25. u8 go_bang[16][16]={0};
  26. u8 key_do_sign=0;
  27. void go_check(u8 x,u8 y);
  28. void gobang_win(u8 x,u8 y);
  29. u8 gobang_color=0;
  30. u8 b1,b2;

  31. /////////////////贪吃蛇
  32. void greedy_snake(void);
  33. u8 direction=0;  // 0上  1左 2下 3右
  34. u8 center_x=240,center_y=240;
  35. u8 length=0;
  36. u16 snake[100][2]={0};
  37. u8 change_sign=0;
  38. u8 food_x,food_y;
  39. u8 snake_result=0;


  40. //           lcddev.width  800    lcddev.height 480
  41. int main(void)
  42. {               
  43.         Stm32_Clock_Init(9);        //系统时钟设置
  44.         uart_init(72,115200);        //串口初始化为115200
  45.         delay_init(72);                            //延时初始化
  46.         LED_Init();                                  //初始化与LED连接的硬件接口
  47.         LCD_Init();                                   //初始化LCD         
  48.         BEEP_Init(); ////初始化蜂鸣器
  49.        
  50.        
  51.         LCD_Display_Dir(1);//横屏       
  52.         tp_dev.init();                        //触摸屏初始化
  53.         POINT_COLOR=RED;//设置字体为红色

  54.         if(tp_dev.touchtype&0X80)
  55.         {
  56.                 while(1)
  57.                 {
  58.                         while(tp_dev.x[0]!=65535&&tp_dev.x[0]!=0);
  59.                         switch(game_switch)
  60.                         {
  61.                                 case 0:
  62.                                         choose_game();
  63.                                         break;
  64.                                 case 1:
  65.                                         golden_miner();
  66.                                         break;
  67.                                 case 2:
  68.                                         gobang();
  69.                                         break;
  70.                                 case 3:
  71.                                         greedy_snake();
  72.                                         break;
  73.                         }
  74.                 }
  75.         }
  76.         else
  77.                 while(1)
  78.                 {
  79.                         LCD_ShowString(30,130,200,16,16," Please use a 4.3 inch");//电阻屏才显示
  80.                         LCD_ShowString(30,160,200,16,16,"   capacitive screen");       
  81.                 }
  82. }


  83. void golden_miner()
  84. {
  85.         u8 clear_sign=0;
  86.         TIM3->CR1&=0; ///////关闭定时器
  87.         game_start();//绘制开始界面
  88.         TIM3_Int_Init(99,7199);//10Khz的计数频率,计数100次10ms
  89.         while(game_switch==1)
  90.         {
  91.                 static u16 coordinate[2];//////////存放松开前的触摸坐标
  92.                 switch(game_mode)
  93.                 {
  94.                         case(0):
  95.                                         if(tp_dev.x[0]>306&&tp_dev.y[0]>176&&tp_dev.x[0]<486&&tp_dev.y[0]<286&&clear_sign==0)//////判断是否触摸到开始按钮
  96.                                         {
  97.                                                 LCD_Fill(296,166,496,296,GLOD);/////////////开始按钮放大处理
  98.                                                 POINT_COLOR=RED;
  99.                                                 LCD_ShowString(356,216,200,24,32,"start");
  100.                                                 clear_sign=1;
  101.                                         }
  102.                                         if(clear_sign==1&&(tp_dev.sta&0x80)==0)//////////判断是否已经放大且是否已经触摸完毕
  103.                                         {
  104.                                                 clear_sign=0;
  105.                                                 if(coordinate[0]>296&&coordinate[1]>166&&coordinate[0]<496&&coordinate[1]<296)//判断触摸完毕前是否停留在开始按钮范围内
  106.                                                 {
  107.                                                         game_mode=1;/////////进入下一个状态
  108.                                                 }
  109.                                                 else
  110.                                                 {
  111.                                                         game_start();///////////重新绘制开始界面
  112.                                                 }
  113.                                         }
  114.                                         else
  115.                                         {
  116.                                                 coordinate[0]=tp_dev.x[0];coordinate[1]=tp_dev.y[0];///////////记录当前按下的坐标
  117.                                         }
  118.                                         break;
  119.                         case(1):
  120.                                         game_transition();/////////////////绘制过渡界面
  121.                                         TIM3->CR1&=0;//关闭定时器
  122.                                         delay_ms(1000);delay_ms(1000);delay_ms(1000);//等待3s
  123.                                         TIM3->CR1|=0x01;//打开定时器
  124.                                         game_set();/////////////绘制关卡界面
  125.                                         POINT_COLOR=BLACK;
  126.                                         game_mode=2;///////////进入下一个状态
  127.                                         break;
  128.                         case(2):
  129.                                         break;
  130.                 }
  131.         }       
  132. }


  133. void gobang()
  134. {
  135.         u8 go_x,go_y,i,j;
  136.         u8 last_x,last_y;

  137.         TIM3->CR1&=0; ///////关闭定时器
  138.         gobang_start();//////绘制初始界面
  139.         TIM3_Int_Init(99,7199);//10Khz的计数频率,计数100次10ms
  140.         while(game_switch==2)
  141.         {
  142.                 if(key_sign==1&&key_do_sign==0&&tp_dev.x[0]<480&&tp_dev.y[0]<480)
  143.                 {
  144.                         key_do_sign=1;
  145.                         key_sign=0;
  146.                         go_x=(tp_dev.x[0]-15)/30+((tp_dev.x[0]-15)%30)/15;
  147.                         go_y=(tp_dev.y[0]-15)/30+((tp_dev.y[0]-15)%30)/15;
  148.                         if(go_bang[go_x][go_y]==0)
  149.                         {
  150.                                 if(gobang_color==0)/////////黑色
  151.                                 {
  152.                                         gobang_color=1;
  153.                                         go_bang[go_x][go_y]=1;
  154.                                         gui_fill_circle(go_x*30+15,go_y*30+15,10,BLACK);
  155.                                         b1++;
  156.                                         LCD_ShowxNum(660,100,b1,2,32,0);
  157.                                 }
  158.                                 else/////////白色
  159.                                 {
  160.                                         gobang_color=0;
  161.                                         go_bang[go_x][go_y]=2;
  162.                                         gui_fill_circle(go_x*30+15,go_y*30+15,10,WHITE);
  163.                                         b2++;
  164.                                         LCD_ShowxNum(660,150,b2,2,32,0);
  165.                                 }
  166.                                 go_check(go_x,go_y);
  167.                                 last_x=go_x;last_y=go_y;
  168.                         }
  169.                 }
  170.                 else
  171.                 {
  172.                         if(key_sign==1)
  173.                         {
  174.                                 key_sign=0;
  175.                                 if(tp_dev.x[0]>480&&tp_dev.x[0]<640&&tp_dev.y[0]>345)///////////按下悔棋
  176.                                 {
  177.                                         while(tp_dev.x[0]!=65535);//////////等待抬起
  178.                                         gui_fill_circle(last_x*30+15,last_y*30+15,10,BROWN);
  179.                                        
  180.                                         if(last_x>0&&last_x<15)lcd_draw_bline(last_x*30,15+last_y*30,30+last_x*30,15+last_y*30,1,BLACK);
  181.                                         else
  182.                                                 if(last_x==0)lcd_draw_bline(15+last_x*30,15+last_y*30,30+last_x*30,15+last_y*30,1,BLACK);
  183.                                                 else lcd_draw_bline(last_x*30,15+last_y*30,15+last_x*30,15+last_y*30,1,BLACK);
  184.                                         if(last_y>0&&last_y<15)lcd_draw_bline(15+last_x*30,last_y*30,15+last_x*30,30+last_y*30,1,BLACK);
  185.                                         else
  186.                                                 if(last_y==0)lcd_draw_bline(15+last_x*30,last_y*30+15,15+last_x*30,30+last_y*30,1,BLACK);
  187.                                                 else lcd_draw_bline(15+last_x*30,last_y*30,15+last_x*30,15+last_y*30,1,BLACK);
  188.                                        
  189.                                        
  190.                                         if(go_bang[last_x][last_y]==1){b1--;LCD_ShowxNum(660,100,b1,2,32,0);gobang_color=0;go_bang[last_x][last_y]=0;}
  191.                                         else if(go_bang[last_x][last_y]==2){b2--;LCD_ShowxNum(660,150,b2,2,32,0);gobang_color=1;go_bang[last_x][last_y]=0;}
  192.                                 }
  193.                                 else
  194.                                 {
  195.                                         if(tp_dev.x[0]>640&&tp_dev.x[0]<800&&tp_dev.y[0]>345)/////////////跳到选择游戏界面
  196.                                         {
  197.                                                 while(tp_dev.x[0]!=65535);//////////等待抬起
  198.                                                 game_switch=0;
  199.                                                         //////////////数值初始化
  200.                                                 for(i=0;i<17;i++)
  201.                                                 {
  202.                                                         for(j=0;j<17;j++)go_bang[i][j]=0;
  203.                                                 }
  204.                                                 key_sign=0;
  205.                                                 key_do_sign=1;
  206.                                                 gobang_color=0;
  207.                                                 b1=0;b2=0;
  208.                                         }
  209.                                 }
  210.                         }
  211.                 }
  212.         }
  213. }


  214. void go_check(u8 x,u8 y)
  215. {
  216.         u8 l_x=x,l_y=y;
  217.         u8 num=1;
  218.         u8 sign=0;
  219.        
  220.         //////////横
  221.         while(1)
  222.         {
  223.                 if(sign==0)
  224.                 {
  225.                         if(l_x>0)
  226.                         {
  227.                                 l_x=l_x-1;
  228.                                 if(go_bang[l_x][y]==go_bang[x][y])
  229.                                 {
  230.                                         num++;
  231.                                         if(num>=5)
  232.                                         {
  233.                                                 gobang_win(x,y);
  234.                                                 break;
  235.                                         }
  236.                                 }///////胜利                       
  237.                                 else {sign=1;l_x=x;}
  238.                         }
  239.                         else {sign=1;l_x=x;}
  240.                 }
  241.                 else
  242.                 {
  243.                         if(l_x<15)
  244.                         {
  245.                                 l_x=l_x+1;
  246.                                 if(go_bang[l_x][y]==go_bang[x][y])
  247.                                 {
  248.                                         num++;
  249.                                         if(num>=5)
  250.                                         {
  251.                                                 gobang_win(x,y);
  252.                                                 break;
  253.                                         }
  254.                                 }///////胜利       
  255.                                 else {num=1;break;}
  256.                         }
  257.                         else {num=1;break;}
  258.                 }
  259.         }
  260.        
  261.         ///////竖
  262.         l_x=x;
  263.         l_y=y;
  264.         sign=0;
  265.        
  266.         if(num==1)
  267.         {
  268.                 while(1)
  269.                 {
  270.                         if(sign==0)
  271.                         {
  272.                                 if(l_y>0)
  273.                                 {
  274.                                         l_y=l_y-1;
  275.                                         if(go_bang[x][l_y]==go_bang[x][y])
  276.                                         {
  277.                                                 num++;
  278.                                                 if(num>=5)
  279.                                                 {
  280.                                                         gobang_win(x,y);
  281.                                                         break;
  282.                                                 }
  283.                                         }///////胜利       
  284.                                         else {sign=1;l_y=y;}
  285.                                 }
  286.                                 else {sign=1;l_y=y;}
  287.                         }
  288.                         else
  289.                         {
  290.                                 if(l_y<15)
  291.                                 {
  292.                                         l_y=l_y+1;
  293.                                         if(go_bang[x][l_y]==go_bang[x][y])
  294.                                         {
  295.                                                 num++;
  296.                                                 if(num>=5)
  297.                                                 {
  298.                                                         gobang_win(x,y);
  299.                                                         break;
  300.                                                 }
  301.                                         }///////胜利       
  302.                                         else {num=1;break;}
  303.                                 }
  304.                                 else {num=1;break;}
  305.                         }
  306.                 }
  307.         }
  308.         //////////////斜着   左上 右下
  309.         l_x=x;
  310.         l_y=y;
  311.         sign=0;
  312.        
  313.         if(num==1)
  314.         {
  315.                 while(1)
  316.                 {
  317.                         if(sign==0)
  318.                         {
  319.                                 if(l_y>0)
  320.                                 {
  321.                                         l_x=l_x-1;
  322.                                         l_y=l_y-1;
  323.                                         if(go_bang[l_x][l_y]==go_bang[x][y])
  324.                                         {
  325.                                                 num++;
  326.                                                 if(num>=5)
  327.                                                 {
  328.                                                         gobang_win(x,y);
  329.                                                         break;
  330.                                                 }
  331.                                         }///////胜利       
  332.                                         else {sign=1;l_x=x;l_y=y;}
  333.                                 }
  334.                                 else {sign=1;l_x=x;l_y=y;}
  335.                         }
  336.                         else
  337.                         {
  338.                                 if(l_y<15)
  339.                                 {
  340.                                         l_x=l_x+1;
  341.                                         l_y=l_y+1;
  342.                                         if(go_bang[l_x][l_y]==go_bang[x][y])
  343.                                         {
  344.                                                 num++;
  345.                                                 if(num>=5)
  346.                                                 {
  347.                                                         gobang_win(x,y);
  348.                                                         break;
  349.                                                 }
  350.                                         }///////胜利       
  351.                                         else {num=1;break;}
  352.                                 }
  353.                                 else {num=1;break;}
  354.                         }
  355.                 }
  356.         }
  357.                 //////////////斜着   左下右上
  358.         l_x=x;
  359.         l_y=y;
  360.         sign=0;
  361.        
  362.         if(num==1)
  363.         {
  364.                 while(1)
  365.                 {
  366.                         if(sign==0)
  367.                         {
  368.                                 if(l_x>0&&l_y<15)
  369.                                 {
  370.                                         l_x=l_x-1;
  371.                                         l_y=l_y+1;
  372.                                         if(go_bang[l_x][l_y]==go_bang[x][y])
  373.                                         {
  374.                                                 num++;
  375.                                                 if(num>=5)
  376.                                                 {
  377.                                                         gobang_win(x,y);
  378.                                                         break;
  379.                                                 }
  380.                                         }///////胜利       
  381.                                         else {sign=1;l_x=x;l_y=y;}
  382.                                 }
  383.                                 else {sign=1;l_x=x;l_y=y;}
  384.                         }
  385.                         else
  386.                         {
  387.                                 if(l_x<15&&l_y>0)
  388.                                 {
  389.                                         l_x=l_x+1;
  390.                                         l_y=l_y-1;
  391.                                         if(go_bang[l_x][l_y]==go_bang[x][y])
  392.                                         {
  393.                                                 num++;
  394.                                                 if(num>=5)
  395.                                                 {
  396.                                                         gobang_win(x,y);
  397.                                                         break;
  398.                                                 }
  399.                                         }///////胜利       
  400.                                         else {num=1;break;}
  401.                                 }
  402.                                 else {num=1;break;}
  403.                         }
  404.                 }
  405.         }
  406. }

  407. //////胜利
  408. void gobang_win(u8 x,u8 y)
  409. {
  410.         u8 i,j;
  411.         TIM3->CR1&=0; ///////关闭定时器
  412.         POINT_COLOR=RED;
  413.         LCD_Fill(135,135,345,285,WHITE);
  414.         if(go_bang[x][y]==1)LCD_ShowString(165,195,200,24,32,"black");
  415.         else LCD_ShowString(165,195,200,24,32,"white");
  416.         LCD_ShowString(280,195,200,24,32,"win");

  417.        
  418.         delay_ms(1000);delay_ms(1000);delay_ms(1000);//等待3s
  419.        
  420.         //////////////数值初始化
  421.         for(i=0;i<17;i++)
  422.         {
  423.                 for(j=0;j<17;j++)go_bang[i][j]=0;
  424.         }
  425.         key_sign=0;
  426.         key_do_sign=1;
  427.         gobang_color=0;
  428.         b1=0;b2=0;
  429.        
  430.         gobang_start();//////绘制初始界面
  431.        
  432.         TIM3_Int_Init(99,7199);//10Khz的计数频率,计数100次10ms
  433. }

  434. ……………………

  435. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
小游戏机.7z (180.79 KB, 下载次数: 228)

评分

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

查看全部评分

回复

使用道具 举报

ID:91165 发表于 2020-11-27 12:53 | 显示全部楼层
下载了谢谢楼主分享,好资料,51黑有你更精彩!!!
回复

使用道具 举报

ID:878553 发表于 2021-1-18 19:02 | 显示全部楼层
我这个为什么选择游戏进不去呀点了整个屏幕了都进不去游戏界面
回复

使用道具 举报

ID:893490 发表于 2021-3-19 17:51 | 显示全部楼层
有这个做跳棋的吗
回复

使用道具 举报

ID:626321 发表于 2021-6-2 17:09 | 显示全部楼层
1509498776 发表于 2021-1-18 19:02
我这个为什么选择游戏进不去呀点了整个屏幕了都进不去游戏界面

屏幕型号的原因吧
回复

使用道具 举报

ID:980597 发表于 2021-11-13 14:06 | 显示全部楼层
HWL0541 发表于 2020-11-27 12:53
下载了谢谢楼主分享,好资料,51黑有你更精彩!!!

请问还要什么部件才能操作?
回复

使用道具 举报

ID:91165 发表于 2021-11-15 07:09 | 显示全部楼层
2538931280 发表于 2021-11-13 14:06
请问还要什么部件才能操作?

原子STM32F1精英版开发板就行
回复

使用道具 举报

ID:987794 发表于 2022-3-23 18:02 | 显示全部楼层
这个五子棋是人人对战吗
回复

使用道具 举报

ID:626321 发表于 2022-3-25 13:27 | 显示全部楼层
秋qiu 发表于 2022-3-23 18:02
这个五子棋是人人对战吗

是的,,,,,,,
回复

使用道具 举报

ID:138664 发表于 2022-4-8 22:57 | 显示全部楼层
感谢楼主分享,正好想学习黄金矿工程序
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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