硬件需求:4.3寸电容屏TFTLCD,STM32F1精英版使用的是寄存器版本!!!
制作出来的实物图如下:
单片机源程序如下:
- #include "sys.h"
- #include "delay.h"
- #include "usart.h"
- #include "lcd.h"
- #include "touch.h"
- #include "timer.h"
- #include "game.h"
- #include "beep.h"
- #include "led.h"
- #include "stdlib.h"
- u8 game_switch=0;
- u16 random_num=1;
- void choose_game(void);
- /////////黄金矿工
- u8 game_mode=0;
- u8 game_grade=1;
- u16 target_score[5]={650,1295,2010,3095,4450};
- u16 your_score=0;
- u8 game_time=60;
- u8 hook_down_sign=0;
- void golden_miner(void);
- ////////////五子棋
- void gobang(void);
- u8 key_sign=0;
- u8 go_bang[16][16]={0};
- u8 key_do_sign=0;
- void go_check(u8 x,u8 y);
- void gobang_win(u8 x,u8 y);
- u8 gobang_color=0;
- u8 b1,b2;
- /////////////////贪吃蛇
- void greedy_snake(void);
- u8 direction=0; // 0上 1左 2下 3右
- u8 center_x=240,center_y=240;
- u8 length=0;
- u16 snake[100][2]={0};
- u8 change_sign=0;
- u8 food_x,food_y;
- u8 snake_result=0;
- // lcddev.width 800 lcddev.height 480
- int main(void)
- {
- Stm32_Clock_Init(9); //系统时钟设置
- uart_init(72,115200); //串口初始化为115200
- delay_init(72); //延时初始化
- LED_Init(); //初始化与LED连接的硬件接口
- LCD_Init(); //初始化LCD
- BEEP_Init(); ////初始化蜂鸣器
-
-
- LCD_Display_Dir(1);//横屏
- tp_dev.init(); //触摸屏初始化
- POINT_COLOR=RED;//设置字体为红色
-
- if(tp_dev.touchtype&0X80)
- {
- while(1)
- {
- while(tp_dev.x[0]!=65535&&tp_dev.x[0]!=0);
- switch(game_switch)
- {
- case 0:
- choose_game();
- break;
- case 1:
- golden_miner();
- break;
- case 2:
- gobang();
- break;
- case 3:
- greedy_snake();
- break;
- }
- }
- }
- else
- while(1)
- {
- LCD_ShowString(30,130,200,16,16," Please use a 4.3 inch");//电阻屏才显示
- LCD_ShowString(30,160,200,16,16," capacitive screen");
- }
- }
- void golden_miner()
- {
- u8 clear_sign=0;
- TIM3->CR1&=0; ///////关闭定时器
- game_start();//绘制开始界面
- TIM3_Int_Init(99,7199);//10Khz的计数频率,计数100次10ms
- while(game_switch==1)
- {
- static u16 coordinate[2];//////////存放松开前的触摸坐标
- switch(game_mode)
- {
- case(0):
- if(tp_dev.x[0]>306&&tp_dev.y[0]>176&&tp_dev.x[0]<486&&tp_dev.y[0]<286&&clear_sign==0)//////判断是否触摸到开始按钮
- {
- LCD_Fill(296,166,496,296,GLOD);/////////////开始按钮放大处理
- POINT_COLOR=RED;
- LCD_ShowString(356,216,200,24,32,"start");
- clear_sign=1;
- }
- if(clear_sign==1&&(tp_dev.sta&0x80)==0)//////////判断是否已经放大且是否已经触摸完毕
- {
- clear_sign=0;
- if(coordinate[0]>296&&coordinate[1]>166&&coordinate[0]<496&&coordinate[1]<296)//判断触摸完毕前是否停留在开始按钮范围内
- {
- game_mode=1;/////////进入下一个状态
- }
- else
- {
- game_start();///////////重新绘制开始界面
- }
- }
- else
- {
- coordinate[0]=tp_dev.x[0];coordinate[1]=tp_dev.y[0];///////////记录当前按下的坐标
- }
- break;
- case(1):
- game_transition();/////////////////绘制过渡界面
- TIM3->CR1&=0;//关闭定时器
- delay_ms(1000);delay_ms(1000);delay_ms(1000);//等待3s
- TIM3->CR1|=0x01;//打开定时器
- game_set();/////////////绘制关卡界面
- POINT_COLOR=BLACK;
- game_mode=2;///////////进入下一个状态
- break;
- case(2):
- break;
- }
- }
- }
- void gobang()
- {
- u8 go_x,go_y,i,j;
- u8 last_x,last_y;
- TIM3->CR1&=0; ///////关闭定时器
- gobang_start();//////绘制初始界面
- TIM3_Int_Init(99,7199);//10Khz的计数频率,计数100次10ms
- while(game_switch==2)
- {
- if(key_sign==1&&key_do_sign==0&&tp_dev.x[0]<480&&tp_dev.y[0]<480)
- {
- key_do_sign=1;
- key_sign=0;
- go_x=(tp_dev.x[0]-15)/30+((tp_dev.x[0]-15)%30)/15;
- go_y=(tp_dev.y[0]-15)/30+((tp_dev.y[0]-15)%30)/15;
- if(go_bang[go_x][go_y]==0)
- {
- if(gobang_color==0)/////////黑色
- {
- gobang_color=1;
- go_bang[go_x][go_y]=1;
- gui_fill_circle(go_x*30+15,go_y*30+15,10,BLACK);
- b1++;
- LCD_ShowxNum(660,100,b1,2,32,0);
- }
- else/////////白色
- {
- gobang_color=0;
- go_bang[go_x][go_y]=2;
- gui_fill_circle(go_x*30+15,go_y*30+15,10,WHITE);
- b2++;
- LCD_ShowxNum(660,150,b2,2,32,0);
- }
- go_check(go_x,go_y);
- last_x=go_x;last_y=go_y;
- }
- }
- else
- {
- if(key_sign==1)
- {
- key_sign=0;
- if(tp_dev.x[0]>480&&tp_dev.x[0]<640&&tp_dev.y[0]>345)///////////按下悔棋
- {
- while(tp_dev.x[0]!=65535);//////////等待抬起
- gui_fill_circle(last_x*30+15,last_y*30+15,10,BROWN);
-
- 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);
- else
- 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);
- else lcd_draw_bline(last_x*30,15+last_y*30,15+last_x*30,15+last_y*30,1,BLACK);
- 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);
- else
- 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);
- else lcd_draw_bline(15+last_x*30,last_y*30,15+last_x*30,15+last_y*30,1,BLACK);
-
-
- 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;}
- 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;}
- }
- else
- {
- if(tp_dev.x[0]>640&&tp_dev.x[0]<800&&tp_dev.y[0]>345)/////////////跳到选择游戏界面
- {
- while(tp_dev.x[0]!=65535);//////////等待抬起
- game_switch=0;
- //////////////数值初始化
- for(i=0;i<17;i++)
- {
- for(j=0;j<17;j++)go_bang[i][j]=0;
- }
- key_sign=0;
- key_do_sign=1;
- gobang_color=0;
- b1=0;b2=0;
- }
- }
- }
- }
- }
- }
- void go_check(u8 x,u8 y)
- {
- u8 l_x=x,l_y=y;
- u8 num=1;
- u8 sign=0;
-
- //////////横
- while(1)
- {
- if(sign==0)
- {
- if(l_x>0)
- {
- l_x=l_x-1;
- if(go_bang[l_x][y]==go_bang[x][y])
- {
- num++;
- if(num>=5)
- {
- gobang_win(x,y);
- break;
- }
- }///////胜利
- else {sign=1;l_x=x;}
- }
- else {sign=1;l_x=x;}
- }
- else
- {
- if(l_x<15)
- {
- l_x=l_x+1;
- if(go_bang[l_x][y]==go_bang[x][y])
- {
- num++;
- if(num>=5)
- {
- gobang_win(x,y);
- break;
- }
- }///////胜利
- else {num=1;break;}
- }
- else {num=1;break;}
- }
- }
-
- ///////竖
- l_x=x;
- l_y=y;
- sign=0;
-
- if(num==1)
- {
- while(1)
- {
- if(sign==0)
- {
- if(l_y>0)
- {
- l_y=l_y-1;
- if(go_bang[x][l_y]==go_bang[x][y])
- {
- num++;
- if(num>=5)
- {
- gobang_win(x,y);
- break;
- }
- }///////胜利
- else {sign=1;l_y=y;}
- }
- else {sign=1;l_y=y;}
- }
- else
- {
- if(l_y<15)
- {
- l_y=l_y+1;
- if(go_bang[x][l_y]==go_bang[x][y])
- {
- num++;
- if(num>=5)
- {
- gobang_win(x,y);
- break;
- }
- }///////胜利
- else {num=1;break;}
- }
- else {num=1;break;}
- }
- }
- }
- //////////////斜着 左上 右下
- l_x=x;
- l_y=y;
- sign=0;
-
- if(num==1)
- {
- while(1)
- {
- if(sign==0)
- {
- if(l_y>0)
- {
- l_x=l_x-1;
- l_y=l_y-1;
- if(go_bang[l_x][l_y]==go_bang[x][y])
- {
- num++;
- if(num>=5)
- {
- gobang_win(x,y);
- break;
- }
- }///////胜利
- else {sign=1;l_x=x;l_y=y;}
- }
- else {sign=1;l_x=x;l_y=y;}
- }
- else
- {
- if(l_y<15)
- {
- l_x=l_x+1;
- l_y=l_y+1;
- if(go_bang[l_x][l_y]==go_bang[x][y])
- {
- num++;
- if(num>=5)
- {
- gobang_win(x,y);
- break;
- }
- }///////胜利
- else {num=1;break;}
- }
- else {num=1;break;}
- }
- }
- }
- //////////////斜着 左下右上
- l_x=x;
- l_y=y;
- sign=0;
-
- if(num==1)
- {
- while(1)
- {
- if(sign==0)
- {
- if(l_x>0&&l_y<15)
- {
- l_x=l_x-1;
- l_y=l_y+1;
- if(go_bang[l_x][l_y]==go_bang[x][y])
- {
- num++;
- if(num>=5)
- {
- gobang_win(x,y);
- break;
- }
- }///////胜利
- else {sign=1;l_x=x;l_y=y;}
- }
- else {sign=1;l_x=x;l_y=y;}
- }
- else
- {
- if(l_x<15&&l_y>0)
- {
- l_x=l_x+1;
- l_y=l_y-1;
- if(go_bang[l_x][l_y]==go_bang[x][y])
- {
- num++;
- if(num>=5)
- {
- gobang_win(x,y);
- break;
- }
- }///////胜利
- else {num=1;break;}
- }
- else {num=1;break;}
- }
- }
- }
- }
- //////胜利
- void gobang_win(u8 x,u8 y)
- {
- u8 i,j;
- TIM3->CR1&=0; ///////关闭定时器
- POINT_COLOR=RED;
- LCD_Fill(135,135,345,285,WHITE);
- if(go_bang[x][y]==1)LCD_ShowString(165,195,200,24,32,"black");
- else LCD_ShowString(165,195,200,24,32,"white");
- LCD_ShowString(280,195,200,24,32,"win");
-
- delay_ms(1000);delay_ms(1000);delay_ms(1000);//等待3s
-
- //////////////数值初始化
- for(i=0;i<17;i++)
- {
- for(j=0;j<17;j++)go_bang[i][j]=0;
- }
- key_sign=0;
- key_do_sign=1;
- gobang_color=0;
- b1=0;b2=0;
-
- gobang_start();//////绘制初始界面
-
- TIM3_Int_Init(99,7199);//10Khz的计数频率,计数100次10ms
- }
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
小游戏机.7z
(180.79 KB, 下载次数: 239)
|