一、功能简介
本项目采用STM32F103C8T6单片机控制器,使用IIC OLED模块、按键模块等。
主要功能:
系统运行后,OLED显示2048游戏界面,通过4个按键K1-K4控制游戏的四个方向上下左右。当得到9数字后游戏通关,
当屏幕数字填满或出现无法移动,可按复位键重新开始。
二、软件设计
/*
作者:嗨小易(QQ技术交流群:570487280)
*/
ST_GAME Game;
//---------------------------------------------------------------------------
void GameInit(void)
{
_Memset(&Game, 0x00, sizeof(ST_GAME));
}
//---------------------------------------------------------------------------
void GameLoop(void)
{
switch(Game.act)
{
case GAME_EXEC_RESET: GameExecReset(); break;
case GAME_EXEC_ANIME: GameExecAnime(); break;
case GAME_EXEC_PLAY: GameExecPlay(); break;
case GAME_EXEC_JUDGE: GameExecJudge(); break;
case GAME_EXEC_OVER: GameExecOver(); break;
default:
_SystemError("[Game act=%x]", Game.act);
break;
}
}
//---------------------------------------------------------------------------
void GameExecReset(void)
{
AnimeInit();
PanelInit();
ScoreInit();
SpriteInit();
PanelMakeCell();
PanelMakeCell();
GameSetAct(GAME_EXEC_ANIME);
}
//---------------------------------------------------------------------------
void GameExecAnime(void)
{
PanelDraw();
ScoreDraw();
SpriteDraw();
AnimeExec();
if(AnimeIsEnd() == FALSE)
{
return;
}
if(ScoreIs10() == TRUE || PanelIsGameOver() == TRUE)
{
GameSetAct(GAME_EXEC_OVER);
}
else
{
GameSetAct(GAME_EXEC_PLAY);
}
}
//---------------------------------------------------------------------------
void GameExecPlay(void)
{
PanelDraw();
ScoreDraw();
SpriteDraw();
u8 trg = KeyGetTrg();
u8 cnt = KeyGetCnt();
if(trg & KEY_U)
{
PanelMoveUp();
GameSetAct(GAME_EXEC_JUDGE);
}
else if(trg & KEY_R)
{
PanelMoveRight();
GameSetAct(GAME_EXEC_JUDGE);
}
else if(trg & KEY_D)
{
PanelMoveDown();
GameSetAct(GAME_EXEC_JUDGE);
}
else if(trg & KEY_L)
{
PanelMoveLeft();
GameSetAct(GAME_EXEC_JUDGE);
}
if(cnt & KEY_A && cnt & KEY_B)
{
ScoreSaveBest();
GameSetAct(GAME_EXEC_RESET);
}
}
//---------------------------------------------------------------------------
void GameExecJudge(void)
{
PanelDraw();
ScoreDraw();
SpriteDraw();
if(AnimeIsDispOnly() == FALSE)
{
PanelMakeCell();
}
GameSetAct(GAME_EXEC_ANIME);
}
//---------------------------------------------------------------------------
void GameExecOver(void)
{
PanelDraw();
ScoreDraw();
SpriteDraw();
OLED_ShowString(0, 48, "GAME", OLED_6X8);
if(ScoreIs10() == TRUE)
{
OLED_ShowString(0, 56, "WIN!!", OLED_6X8);
}
else
{
OLED_ShowString(0, 56, "OVER", OLED_6X8);
}
if(KeyGetTrg() & KEY_B)
{
ScoreSaveBest();
GameSetAct(GAME_EXEC_RESET);
}
}
//---------------------------------------------------------------------------
void GameSetAct(u8 act)
{
Game.act = act;
}
三、实验现象
B站演示视频:https://space.bilibili.com/444388619
联系作者
视频地址:https://space.bilibili.com/444388619/video
专注于51单片机、STM32、国产32、DSP、Proteus、arduino、ESP32、物联网软件开发,PCB设计,视频分享,技术交流。