基於正點原子SRM32F103ZET6精英板(戰艦板)的貪吃蛇小遊戲(附原始碼)

時分の發表於2020-12-25

基於正點原子SRM32F103ZET6精英板(戰艦板)的貪吃蛇小遊戲

簡介:這個貪吃蛇小遊戲是我嵌入式實訓自選的課題設計,本人也是初學,所以做出來的東西也不算複雜,話不多說,先看看成品(由於放不進去視訊,所以放的截圖)

在這裡插入圖片描述
在這裡插入圖片描述

在這裡插入圖片描述
在這裡插入圖片描述所以,本設計大概實現了傳統貪吃蛇遊戲的功能:
1、用的螢幕是精英板自帶的4.3寸(480800)LCD屏,所以為了維持正方形,分成8048等分;
2、預設小蛇初始長度、速度、方向,以及小蛇的長度上限值;
3、每吃到食物小蛇長度+1,每吃到兩個食物小蛇速度+1;
4、當小蛇頭部座標與螢幕邊界或自身重合則死亡,或者長度達到上限則遊戲結束。
遊戲規則可以根據個人喜好進行更改。

主函式部分程式碼

#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "stdio.h"
#include "stdlib.h"
#include "math.h"
#include "beep.h"
//內部驅動
#include "rand.h"
//外圍電路
#include "led.h"
#include "key.h"
#include "lcd_4_3.h"
//使用者演算法
#include "my_task.h"

#define GAME_WIDTH	480	//設定螢幕解析度為800*480,為了維持正方形,分成80*48等分
#define GAME_HEIGHT	800
#define GAME_XPART  48
#define GAME_YPART  80

enum sta //列舉狀態
{ 
	OFF,//0
	ON	//1
} station;

enum dir //列舉貪吃蛇方向
{
	UP,		//上
	DOWN,	//下
	LEFT,	//左
	RIGHT	//右
}direction;

typedef struct  //貪吃蛇重要引數集
{										    
	u16 speed;		//速度
	u16 length;     //長度
	u16 energybuf;  //能量快取
	u16 width;      //蛇寬	
	u16 life;       //生命數	
	u16 firstx;     //蛇頭座標x
	u16 firsty;     //蛇頭座標y
	u16 lastx;      //蛇尾座標x
	u16 lasty;      //蛇尾座標y
	u16 color;      //蛇顏色	
}snakes; 
snakes snake;//此時snake符合snakes結構體中得所有引數

void Snake_Init(snakes * snake)//貪吃蛇引數初始化
{
	snake->speed=5;
	snake->length=10;
	snake->energybuf=0;
	snake->width=1;
	snake->life=3;
	snake->firstx=4;
	snake->firsty=5;
	snake->lastx=0;
	snake->lasty=0;
	snake->color=BLUE;
}

typedef struct  //食物重要引數集
{										    
	u16  energy ;//食物能量
	u16  x ;	//食物座標x
	u16  y ;	//食物座標y
}apples; 
apples apple;

void Apple_Init(apples * apple)//食物引數初始化
{
	apple->energy=1;
//	apple->x=24;	//座標由隨機數計算出來
//	apple->y=40;
}

typedef struct  //事件重要引數集
{										    
	u16  Process ;//是否遊戲暫停
	u16  GameSta ;//是否遊戲結束
	u16  AppleSta;//食物狀態 
	u16  Direction;//蛇前進方向
}events; 
events event;

void Event_Init(events * event)//事件引數初始化
{
	event->Process=ON;//沒有暫停
	event->GameSta=ON;//沒有結束
	event->AppleSta=ON;
	event->Direction=DOWN;//初始方向向下
}
typedef struct  //貪吃蛇座標引數
{
	u16 x;
	u16 y;
}axiss;
axiss snake_axis[100];  //設蛇身最大長度可以達到100

void Display(u16 x,u16 y,u16 color)//按照80*48的座標對映到800*480的螢幕上
{
	LCD_Fill(GAME_WIDTH/GAME_XPART*x,GAME_HEIGHT/GAME_YPART*y,GAME_WIDTH/GAME_XPART*(x+1),GAME_HEIGHT/GAME_YPART*(y+1),color);
}

void DisplayInit(void) //蛇身初始化,預設在該位置,並蛇頭向下
{
	u16 i;
	for(i=0;i<5;i++)//將初始座標存入蛇身座標內
	{
		snake_axis[i].x=i;
		snake_axis[i].y=0;
	}
		for(i=5;i<10;i++)
	{
		snake_axis[i].x=4;
		snake_axis[i].y=i-4;
	}
	LCD_Clear(WHITE);
	for(i=0;i<10;i++)
	{
		Display(snake_axis[i].x,snake_axis[i].y,BLUE);//按照初始座標列印出蛇身
	}
}

void GameOver(void)//遊戲結束函式,列印"GAME OVER",蜂鳴器響,掛起核心資料處理函式
{
	
	LCD_ShowString(180,388,200,24,24,"GAME OVER !"); 
  BEEP=1;  
	delay_ms(500);
	BEEP=0;
	vTaskSuspend(EVENTTask_Handler);//掛起事件任務函式,核心資料處理函式event_task
}

原始碼:https://download.csdn.net/download/mj19981206/13719253

相關文章