我们从2011年坚守至今,只想做存粹的技术论坛。  由于网站在外面,点击附件后要很长世间才弹出下载,请耐心等待,勿重复点击不要用Edge和IE浏览器下载,否则提示不安全下载不了

 找回密码
 立即注册
搜索
查看: 802|回复: 1

贪吃蛇游戏STM32F103ZET6

[复制链接]

该用户从未签到

37

主题

176

回帖

381

积分

二级逆天

积分
381

终身成就奖

发表于 2020-12-1 09:32:07 | 显示全部楼层 |阅读模式
[/free][hide=2,money]
#include "snake.h"
#include "tftlcd.h"
#include "picture.h"
#include "ascii.h"

u8 key;


void LCD_ShowPictureEx(u16 x, u16 y, u16 wide, u16 high)
{
    u16 temp = 0;
    long tmp=0,num=0;
    LCD_Set_Window(x, y, x+wide-1, y+high-1);
    num = wide * high*2 ;
    do
    {  
        temp = pic[tmp + 1];
        temp = temp << 8;
        temp = temp | pic[tmp];
        LCD_WriteData_Color(temp);//ÖðµãÏÔʾ
        tmp += 2;
    }
    while(tmp < num);   
}

//ÔÚÖ¸¶¨Î»Öà ÏÔʾ1¸ö16*16µÄºº×Ö
//(x,y):ºº×ÖÏÔʾµÄλÖÃ
//index:tfontÊý×éÀïÃæµÄµÚ¼¸¸öºº×Ö
//color:Õâ¸öºº×ÖµÄÑÕÉ«
void Test_Show_CH_Font16(u16 x,u16 y,u8 index,u16 color)
{                  
    u8 temp,t,t1;
    u16 y0=y;                  
    for(t=0;t<32;t++)//ÿ¸ö16*16µÄºº×ÖµãÕó ÓÐ32¸ö×Ö½Ú
    {   
        if(t<16)temp=tfont16[index*2][t];      //Ç°16¸ö×Ö½Ú
        else temp=tfont16[index*2+1][t-16];    //ºó16¸ö×Ö½Ú                              
        for(t1=0;t1<8;t1++)
        {
            if(temp&0x80)LCD_DrawFRONT_COLOR(x,y,color);//»­ÊµÐĵã
            else LCD_DrawFRONT_COLOR(x,y,GBLUE);   //»­¿Õ°×µã£¨Ê¹Óñ³¾°É«£©
            temp<<=1;
            y++;
            if((y-y0)==16)
            {
                y=y0;
                x++;
                break;
            }
        }      
    }         
}

//ÔÚÖ¸¶¨Î»Öà ÏÔʾ1¸ö24*24µÄºº×Ö
//(x,y):ºº×ÖÏÔʾµÄλÖÃ
//index:tfontÊý×éÀïÃæµÄµÚ¼¸¸öºº×Ö
//color:Õâ¸öºº×ÖµÄÑÕÉ«
void Test_Show_CH_Font24(u16 x,u16 y,u8 index,u16 color)
{                  
    u8 temp,t,t1;
    u16 y0=y;                  
    for(t=0;t<72;t++)//ÿ¸ö24*24µÄºº×ÖµãÕó ÓÐ72¸ö×Ö½Ú
    {   
        if(t<24)temp=tfont24[index*3][t];           //Ç°24¸ö×Ö½Ú
        else if(t<48)temp=tfont24[index*3+1][t-24]; //ÖÐ24¸ö×Ö½Ú                              
        else temp=tfont24[index*3+2][t-48];         //ºó24¸ö×Ö½Ú
        for(t1=0;t1<8;t1++)
        {
            if(temp&0x80)LCD_DrawFRONT_COLOR(x,y,color);//»­ÊµÐĵã
            else LCD_DrawFRONT_COLOR(x,y,GRAY);   //»­¿Õ°×µã£¨Ê¹Óñ³¾°É«£©
            temp<<=1;
            y++;
            if((y-y0)==24)
            {
                y=y0;
                x++;
                break;
            }
        }      
    }         
}


//ÓÎÏ·½çÃæ
//Ò»¹²12¸öºº×Ö£¬³É¼¨£¬¹Ø¿¨£¬ÉÏ£¬Ï£¬×ó£¬ÓÒ£¬¿ªÊ¼£¬ÔÝÍ£
void show(void)
{
    //»­Î§Ç½ ºñ¶ÈΪ5
    //¹¹½¨Ò»¸ö((150/5)*(230/5))=(30*46)µÄÓÎÏ·ÇøÓò ǽ±ÚºñΪ5 ÉßÌåΪ5
      
    LCD_DrawLine_Color(0, 161, 240, 161,BLACK);
    LCD_DrawLine_Color(240, 0, 240, 161,BLACK);

   
    //³É¼¨
    Test_Show_CH_Font16(0,165,0,RED);
    Test_Show_CH_Font16(16,165,1,RED);
    FRONT_COLOR=RED;
    BACK_COLOR=GRAY;
    LCD_ShowString(32,165,tftlcd_data.width,tftlcd_data.height,16,":");
    LCD_ShowString(40,165,tftlcd_data.width,tftlcd_data.height,16,"  0");   
    //ÉúÃü
    Test_Show_CH_Font16(184,165,2,RED);
    Test_Show_CH_Font16(200,165,3,RED);
    LCD_ShowString(216,165,tftlcd_data.width,tftlcd_data.height,16,":");
    LCD_ShowString(224,165,tftlcd_data.width,tftlcd_data.height,16," ");   
   
    //ÓÎÏ·Ãû×Ö
    LCD_ShowString(98,237,tftlcd_data.width,tftlcd_data.height,16,"Snaker");

    LCD_ShowString(10,320,tftlcd_data.width,tftlcd_data.height,16,"K_UP:    UP");
    LCD_ShowString(10,340,tftlcd_data.width,tftlcd_data.height,16,"K_DOWN:  DOWN");
    LCD_ShowString(10,360,tftlcd_data.width,tftlcd_data.height,16,"K_LEFT:  LEFT");
    LCD_ShowString(10,380,tftlcd_data.width,tftlcd_data.height,16,"K_RIGHT: RIGHT");
}




#ifndef __SANKE_H
#define __SANKE_H     
#include "system.h"
#include "SysTick.h"

//Ì°³ÔÉßÖ÷º¯Êý
void show(void);//ÓÎÏ·»­Ãæ
extern u8 key;

#endif





#include "system.h"
#include "SysTick.h"
#include "led.h"
#include "usart.h"
#include "tftlcd.h"
#include "time.h"
#include "key.h"
#include "touch.h"
#include "snake.h"
#include "rtc.h"
#include "stdlib.h"


#define SNAKE_Max_Long 50//ÉßµÄ×î´ó³¤¶È
u8 pause=0;
u8 start=0;

//É߽ṹÌå
struct Snake
{
    s16 X[SNAKE_Max_Long];
    s16 Y[SNAKE_Max_Long];
    u8 Long;//Éߵij¤¶È
    u8 Life;//ÉßµÄÉúÃü 0»î×Å 1ËÀÍö
    u8 Direction;//ÉßÒƶ¯µÄ·½Ïò
}snake;

//ʳÎï½á¹¹Ìå
struct Food
{
    u8 X;//ʳÎïºá×ø±ê
    u8 Y;//ʳÎï×Ý×ø±ê
    u8 Yes;//ÅжÏÊÇ·ñÒª³öÏÖʳÎïµÄ±äÁ¿ 0ÓÐʳÎï 1ÐèÒª³öÏÖʳÎï
}food;

//ÓÎÏ·µÈ¼¶·ÖÊý
struct Game
{
    u16 Score;//·ÖÊý
    u8 Life;//ÓÎÏ·µÈ¼¶   
}game;

void touch(void)
{   
    key=KEY_Scan(0);   
   
    if(key==KEY_UP&&snake.Direction!=4)        //ÉÏ
    {
        snake.Direction=3;
    }
    if(key==KEY_DOWN&&snake.Direction!=3)       //ÏÂ
    {
        snake.Direction=4;
    }
    if(key==KEY_LEFT&&snake.Direction!=1)       //×ó
    {
        snake.Direction=2;
    }
    if(key==KEY_RIGHT&&snake.Direction!=2)      //ÓÒ
    {
        snake.Direction=1;
    }
}
void TIM3_IRQHandler(void)
{
    if(TIM_GetITStatus(TIM3,TIM_IT_Update)!= RESET)
    {
        touch();
        TIM_ClearITPendingBit(TIM3,TIM_IT_Update);   
    }
}  


//ÓÎÏ·½áÊø
void gameover()
{
    start=0;//Í£Ö¹ÓÎÏ·
    Test_Show_CH_Font24(80,65,0,RED);        
    Test_Show_CH_Font24(104,65,1,RED);        
    Test_Show_CH_Font24(128,65,2,RED);        
    Test_Show_CH_Font24(152,65,3,RED);        
    Test_Show_CH_Font24(176,65,4,RED);        
    FRONT_COLOR=BLACK;
    BACK_COLOR=GRAY;
    LCD_ShowString(224,165,tftlcd_data.width,tftlcd_data.height,16,"0");//ÏÔʾÉúÃüÖµ   
}

//ÍæÓÎÏ·
void play()
{
    u16 i,n;//iÉߵĹؽÚÊý nÓÃÀ´ÅжÏʳÎïºÍÉßµÄÉíÌåÊÇ·ñÖغÏ
    u8 life_buf[2];
    u8 socre_buf[4];
    snake.Long=2;//¶¨ÒåÉߵij¤¶È
    snake.Life=0;//Éß»¹»î×Å
    snake.Direction=1;//ÉßµÄÆðʼ·½Ïò¶¨ÒåΪÓÒ
    game.Score=0;//·ÖÊýΪ0
    game.Life=4;//ÉßµÄÉúÃüÖµ
    food.Yes=1;//³öÏÖÐÂʳÎï
    snake.X[0]=12;snake.Y[0]=24;
    snake.X[1]=12;snake.Y[1]=24;

    while(1)
    {
            if(food.Yes==1)//³öÏÖеÄʳÎï
            {
                while(1)
                {
                        //ÔÚÉ趨µÄÇøÓòÄÚÏÔʾʳÎï        
                        //food.X=12+rand()%(240/12)*12;
                        //food.Y=12+rand()%(160/12)*12;
                        srand(calendar.sec);//Ìí¼ÓËæ»úÖÖ×Ó ²ÉÓõÄRTCʱÖÓ
                        food.X=12+rand()%(228/12)*12;
                        food.Y=12+rand()%(148/12)*12;
                        for(n=0;n<snake.Long;n++)
                        {
                            if(food.X==snake.X[n]&&food.Y==snake.Y[n])
                                break;
                        }
                        if(n==snake.Long)
                        food.Yes=0;   
                        break;
                    }
            }
               
                if(food.Yes==0)//ÓÐʳÎï¾ÍÒªÏÔʾ
                {   
                    LCD_Fill(food.X,food.Y,food.X+10,food.Y+10,RED);
                }
                //È¡µÃÐèÒªÖØл­µÄÉߵĽÚÊý
                for(i=snake.Long-1;i>0;i--)
                {
                    snake.X=snake.X[i-1];
                    snake.Y=snake.Y[i-1];
                }
                //ͨ¹ý°´¼üÀ´ÉèÖÃÉßµÄÔ˶¯·½Ïò
                switch(snake.Direction)
                {
                    case 1:snake.X[0]+=12;break;//ÏòÓÒÔ˶¯
                    case 2:snake.X[0]-=12;break;//Ïò×óÔ˶¯
                    case 3:snake.Y[0]-=12;break;//ÏòÉÏÔ˶¯
                    case 4:snake.Y[0]+=12;break;//ÏòÏÂÔ˶¯
                }
                for(i=0;i<snake.Long;i++)//»­³öÉß   
                LCD_Fill(snake.X,snake.Y,snake.X+10,snake.Y+10,BLUE);//»­ÉßÉíÌå
                while(pause==1){};
                delay_ms(500);//ÑÓʱ
                LCD_Fill(snake.X[snake.Long-1],snake.Y[snake.Long-1],snake.X[snake.Long-1]+10,snake.Y[snake.Long-1]+10,GRAY);//Ïû³ýÉßÉí        
                        
                    
                //ÅжÏÊÇ·ñײǽ
                if(snake.X[0]<0||snake.X[0]>240||snake.Y[0]<0||snake.Y[0]>150)
                    snake.Life=1;//ÉßËÀµôÁË
        
                //µ±ÉßµÄÉíÌ峬¹ý3½ÚºóÅжÏÉß×ÔÉíµÄÅöײ
                for(i=3;i<snake.Long;i++)
                {
                    if(snake.X==snake.X[0]&&snake.Y==snake.Y[0])//×ÔÉíµÄÈÎÒ»×ø±êÖµÓëÉßÍ·×ø±êÏàµÈ¾ÍÈÏΪÊÇ×ÔÉíÅöײ
                        game.Life-=1;
                }
                if(snake.Life==1||game.Life==0)//ÒÔÉÏÁ½ÖÖÅжÏÒÔºóÈç¹ûÉßËÀµôÁËÌø³öÄÚÑ­»·£¬ÖØпªÊ¼
                {
                    gameover();
                    break;
                }   
                //ÅжÏÉßÊÇ·ñ³Ôµ½ÁËʳÎï
                if(snake.X[0]==food.X&&snake.Y[0]==food.Y)
                {
                    LCD_Fill(food.X,food.Y,food.X+10,food.Y+10,GRAY);//°Ñ³Ôµ½µÄʳÎïÏû³ý
                    if(!((snake.Long==SNAKE_Max_Long)&&(snake.Long==SNAKE_Max_Long)))
                    snake.Long++;//ÉßµÄÉíÌ峤һ½Ú
                    game.Score+=10;
                    socre_buf[0]=game.Score/100+0x30;
                    socre_buf[1]=game.Score%100/10+0x30;
                    socre_buf[2]=game.Score%100%10+0x30;
                    socre_buf[3]='\0';
                    FRONT_COLOR=BLACK;
                    BACK_COLOR=GRAY;
        
                    LCD_ShowString(40,165,tftlcd_data.width,tftlcd_data.height,16,socre_buf);//ÏÔʾ³É¼¨   
                    food.Yes=1;//ÐèÒªÖØÐÂÏÔʾʳÎï
                }
                life_buf[0]=game.Life%10+0x30;
                life_buf[1]='\0';
            
                LCD_ShowString(224,165,tftlcd_data.width,tftlcd_data.height,16,life_buf);//ÏÔʾÉúÃüÖµ   
        }   
}

int main()
{
    u8 i;
   
    SysTick_Init(72);
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);  //ÖжÏÓÅÏȼ¶·Ö×é ·Ö2×é
    LED_Init();
    USART1_Init(9600);
    TFTLCD_Init();            //LCD³õʼ»¯
    KEY_Init();
   
    TOUCH_Init();
    LCD_ShowPictureEx(0, 0, 240, 320);
    while(TOUCH_Scan() == 0xff); //µÈ´ý°´Ï´¥Ãþ
    TIM3_Init(50,7199);//Æô¶¯¶¨Ê±Æ÷
    RTC_Init();
    LCD_Clear(GRAY);
    show();//»­ÓÎÏ·½çÃæ
    play();//ÍæÓÎÏ·
}



[/hide][free]
购买主题 本主题需向作者支付 2 枚金币 才能浏览
回复

使用道具 举报

该用户从未签到

19

主题

61

回帖

124

积分

二级逆天

积分
124

终身成就奖

发表于 2020-12-1 09:59:30 | 显示全部楼层
牛批,这个用到GUI了吗?
回复

使用道具 举报

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

本版积分规则

每日签到,有金币领取。


Copyright ©2011-2024 NTpcb.com All Right Reserved.  Powered by Discuz! (NTpcb)

本站信息均由会员发表,不代表NTpcb立场,如侵犯了您的权利请发帖投诉

( 闽ICP备2024076463号-1 ) 论坛技术支持QQ群171867948 ,论坛问题,充值问题请联系QQ1308068381

平平安安
TOP
快速回复 返回顶部 返回列表