【STM32单片机】2048游戏-OLED


一、功能简介

本项目采用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设计,视频分享,技术交流。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值