用STM32实现的一个打字游戏(通过串口在超级终端上显示)

2020-01-01 17:55发布

本帖最后由 Robin_King 于 2012-11-14 19:13 编辑

112.gif (938.06 KB, 下载次数: 6) 下载附件 2012-11-14 12:39 上传
先上图,GIF格式

做了一个打字游戏,只用到了串口这一外围资源(led可选),移植性好,移植到了STM32上,晒出来让大家指点一下,以便一块学习交流。

如果觉得上面图片不清楚,就看这个视频:http://v.youku.com/v_show/id_XNDc0MzM0NjYw.html

****************************************************************************************************************

游戏特点:


1.本游戏在STM32F103上实现,使用的软件平台是IAR 6.4。

    利用串口,在超级终端上显示,通过PC键盘获取输入。

    串口参数设置:57600 , 8 ,NONE , 1 。

2.以守阵地的地对空作战模式展现游戏形式,趣味性强。


3.游戏难度等级有7级,可以自行设定当前游戏等级。


4.游戏分有生存模式和正常模式,可以自由设定。


5.代码的可移植性高。可移植到许多平台上,已经在AVR32UC3A0512和STM32上实现移植。


6.游戏源代码开放,我会在后面根据大家要求放上下载源代码的链接,以方便一起学习交流!


**************************************************************************************************************


下面简单描述一下游戏设计思路:


这个游戏以防空作战的模式来增加游戏的趣味性。用从屏幕最上方出现的单个字符来表示伞兵,

以一个字符串来表示横向飞过的轰炸机,轰炸机在飞过的过程中投下用单个字符表示的炸弹。玩

家可通过键盘输入代表伞兵或炸弹的字符来击中目标,如果击中,就会从阵地上发射出用特殊

符号(如*)表示的炮弹来消灭目标。玩家也可通过连续输入轰炸机上的字符串来消灭轰炸机。

如果伞兵或飞机炸弹落在阵地上,那块阵地会被攻克而消失,如果所有阵地被攻克,则游戏结束。

每消灭一个敌方目标,会增加相应的分值,消灭轰炸机时,会得到较高的分值奖励。



**************************************************源代码下载链接*******************************************



不好意思,先前忘记clean工程了,所以有点大,现在把STM32的工程clean了一下,可以上传成附件了:

STM32源码: TypingGameV1.0.zip (3.39 MB, 下载次数: 302) 2012-11-14 14:43 上传 点击文件名下载附件
stm32源码



**************************************************************************************************************************


跨平台上具体移植方法及更新的软件,我会在本帖的后续更新中给出。

有不少BUG,还望大家多多批评指正!


友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
41条回答
Robin_King
1楼-- · 2020-01-03 09:01
本帖最后由 Robin_King 于 2012-11-19 17:23 编辑

现在发布一下帖子的更新

更新的内容包括:

1.最新、最全的源代码
2.代码的详细移植方法

*****************************源代码更新内容及下载链接*********************************************
最新代码下载链接,解决了上一版本的几个错误。并将我使用的三个平台(ATmega32、AVR32UC3A0512和
STM32F103)的代码全放在了一起,以供大家学习交流。

TypingGameScr.zip (7.01 MB, 下载次数: 183) 2012-11-19 16:41 上传 点击文件名下载附件
更新后的程序


文件中包括了移植本游戏所需要的全部文件,但底层的接口需要移植者根据自己的平台添加。

文件夹内容介绍:

在application中,包含了实现这个游戏的一些基本模块,但不包括底层的接口。
app_cfg.h中包含了整个项目中通用的一个配置。
main.c中,包含了游戏的主要控制函数,通过控制台进入游戏(输入game后回车)。
Examples中包含了笔者在学习中用到的三个平台的底层接口的例子及相应平台完整的工程包,相应的软硬件
信息都在里面有说明。

*******************************详细移植步骤****************************************************

移植方法:
1.在application中,自建led模块(建立方法以你所采用的编译器工程要求为准),模块中的led.h向外提供
LED1_ON(),LED1_OFF(),LED2_ON(),LED2_OFF()个接口。
2.在application中,自建serial模块,serial.h向外提供serial_in(char)和serial_out(char*)和uart_init()三个接口
,uart_init()完成系统波特率的设定等。
3.在顶层的app_cfg.h中,配置相应的文件,本示例的app_cfg.h中,提供了__MCU_AVR_32__,
__MCU_AVR_UC_3A__,__MCU_STM32_F103__三个用户定义标识,分别对应mega32、AVR32UC3A0512和
STM32F103三款芯片的配置。移植时根据自己的软硬件环境,修改或增加所需要的宏或头文件。
4.在项目中添加好这些文件,在编译器的工程配置中,加入经第3步配置后的合适自定义标识,之后编译、
调试、下载验证。

注意:硬件平台要保证有2K(含2K)以上的SRAM,20K以上的flash.



**************************************The end****************************************************************
Robin_King
2楼-- · 2020-01-03 14:03
 精彩回答 2  元偷偷看……
xyz2008
3楼-- · 2020-01-03 18:19
能否传一个MDK的工程呀,楼主
qzxy0927
4楼-- · 2020-01-03 18:57
Robin_King 发表于 2012-11-19 17:16
游戏的操作方法:

1.通过串口连接好硬件后,用超级终端打开相应的端口。

楼主,想做一个MDK工程,不知道是否有难度,要怎么样移植 呢?
meme1oo
5楼-- · 2020-01-03 21:02
这个有意思
Robin_King
6楼-- · 2020-01-03 22:29
qzxy0927 发表于 2012-11-30 15:45
楼主,想做一个MDK工程,不知道是否有难度,要怎么样移植 呢?

应该没难度,这是在裸机上的程序。我MDK以前用过一次,不太熟悉。但这没关系,只要你熟悉就行。

你打开代码包,在把main.c中的内容做为你的主程序。之后把application中的所有模块都添加上,还有
别忘了各级的APP_CFG.H这个文件也都包含上。但在application中,没有led模块和serial模块,这两个算
作时这个游戏的驱动吧,对这两个模块要提供的接口是要根据你的平台自己写的。LED在这个游戏中其
实只是在MAIN.C中一个呼吸灯上用到,这是为了检查我的程序有没有堵塞(我的程序没用中断),
SERIAL就是提供基本的串口发送或接收字节的及初始化接口,但系统时钟和波特率的设定也在这个
模块中完成。你可以参看下我在Examples中给得三个平台的驱动例子。

之后就是你看下最顶层的APP_CFG.H,就是和MAIN.C在同一个文件夹下的那个,这个配置头文件中
的后面部分是条件编译,依据你平台的特殊性,增加或修改相应的内容,之后在你的项目属性设置
中的编译选项中添加上相应的宏。

如我以下代码:
#if defined (__MCU_AVR_32__)
#include<avr/io.h>
#include<avr/pgmspace.h>
#define MOVE_TIME_LONG            0x3FFF
#define MOVE_TIME_DEC             0x8EF
#define CONFIG_INIT()    do{ }while(0)

#define FLASH   PROGMEM

#elif defined (__MCU_AVR_UC_3A__)
#include <asf.h>
#include<avr32/io.h>
////***********************************************************
//// user define
////***********************************************************
#define MOVE_TIME_LONG            0x3FFF
#define MOVE_TIME_DEC             0x8EF

#define FLASH   const

#define prog_uint8_t      const uint8_t

#define memcpy_P(__p_chDes,__p_chSorc,__size_t)  memcpy((__p_chDes),(__p_chSorc),(__size_t))
#define CONFIG_INIT()    do{board_init();
                            led_init();
                            pm_switch_to_osc0(&AVR32_PM, FOSC0, OSC0_STARTUP);}while(0)


如我在MEGA32平台上运行时,考虑到我用的编译器是AVR studio4,为了将一些字符串放到falsh里,
我要用到pgmspace.h中的一些函数,我便在__MCU_AVR_32__宏控制的条件编译下加入相应的一些
不同的配置,而共用的配置就在条件编译之外。

类似地设计其他编译条件。这样,我把程序移植到MEGA32上是,只要在项目属性的预编译设置中加
入__MCU_AVR_32__便可。

仿照上面的例子,你可以增加你自己平台的预编译宏,来添加你平台上所需要的信息。

我在另一个帖子中对这些内容也做了更新,如果有不相同的,可以参看以下帖子中的代码,或者回复一下,共同探讨。
另一个帖子:http://www.amobbs.com/thread-5509217-1-1.html

一周热门 更多>