硬件需求:4.3寸電容屏TFTLCD,STM32F1精英版使用的是寄存器版本!!!
制作出來的實物圖如下:
IMG_20201126_165218.jpg (5.24 MB, 下載次數: 56)
下載附件
2020-11-26 16:53 上傳
IMG_20201126_165211.jpg (5.88 MB, 下載次數: 50)
下載附件
2020-11-26 16:53 上傳
IMG_20201126_165140.jpg (4.57 MB, 下載次數: 46)
下載附件
2020-11-26 16:53 上傳
IMG_20201126_165132.jpg (5.73 MB, 下載次數: 72)
下載附件
2020-11-26 16:53 上傳
單片機源程序如下:
- #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)
2020-11-26 23:27 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|