在线时间7310 小时
UID3426478
注册时间2017-9-25
NXP金币5521
TA的每日心情 | 奋斗 昨天 00:05 |
---|
签到天数: 1884 天 连续签到: 9 天 [LV.Master]伴坛终老
超级版主
 
- 积分
- 112771
- 最后登录
- 2025-9-12
|
本帖最后由 stm1024 于 2021-10-20 16:16 编辑
先做一下背景铺垫吧。响应日天兄弟10月份的主题,和大家分享一个自己以前学习LPC时做的一个小游戏。电竞产品其实是谈不上的,只是一个简单得不能再简单的小游戏,然后用到的硬件也是很简单的,最后,更惭愧的是,这还是一个半成品,只有主要的功能,其实界面显示部分还没开发完成,最大的坑还没有填……
总而言之,言而总之,这是一个入不了大佬法眼的游戏,硬件上没啥技术难度,软件上也没什么技巧可言,写出来作为抛砖引玉的作用。
再说说这个游戏。我还在上高中的时候,那会儿不像现在各种手机平板等,我们用的文曲星这种电子产品很流行,即使不是人手一个吧,至少班上一半的人都是有的。其中有一些小游戏,有个就是猜数字的游戏,就是有一个各位数字不相同的四位数,然后让玩家猜这个数是多少,每次猜测,会给出xAxB的提示,其中A表示你猜测的四位数中,数字和位置都猜对了,B表示数字对了,但是位置错了。例如答案是1234,你输入2564,那么就会给你提示1A1B,其中1A表示4的位置和值都对了,而1B表示有1个数位置不对(这个例子里面是2)。玩家就根据这种信息,构造猜测的数字,并推断出答案是多少。
接下来说说硬件。我这里选用的是LPC54608的板子(OM13092),用这个有点儿大炮打苍蝇的感觉,不过主要用于实现,而且这个芯片有一个很有用的外设,那就是RNG(Random Number Generator),随机数生成,这个可以说是真正意义上的随机数生成器了,C语言的stdlib头文件中的rand函数,那个只是伪随机数。如果要在其他的芯片上实现,可以考虑使用ADC采集的值作为随机数。
用户输入和显示,现在用的是串口与上位机通讯。等等,串口?
没错,就是串口,这也是为什么说我做的只是一个半成品的原因。使用串口有点儿……愚蠢的感觉。都有上位机了,还不如直接在电脑上搞这个游戏?
相信大家一定会有这种感觉,这个我也知道。不过我这里只是想通过串口,客串一下用户界面,毕竟图形界面这种高大上的东西,我一时半会儿还没玩转呢。
好了,不多说,上代码吧,最核心的部分:
- #include "LPC54608.h"
- #include "pin_mux.h"
- #include "board.h"
- #include "fsl_debug_console.h"
- #include "XDRNG.h"
- int ValidNum(int x)
- {
- int p[4],i,j;
- for(i=0;i<4;i++)
- {
- p[i]=x%10;
- x/=10;
- }
- if(p[3]==0)
- return 0;
-
- for(i=0;i<4;i++)
- {
- for(j=i+1;j<4;j++)
- {
- if(p[i]==p[j])
- return 0;
- }
- }
- return 1;
- }
- //generate anaswer
- int GenAns()
- {
- int ret=0;
- do
- {
- ret=XDRNG_GenRange(1000,9999);
- }while(!ValidNum(ret));
- return ret;
- }
- /*
- compare guess number & answer
- */
- void DoComp(int gus,int ans,int* a,int* b)
- {
-
- int p[4],q[4],i,j;
- for(i=0;i<4;i++)
- {
- p[i]=gus%10;
- gus/=10;
- q[i]=ans%10;
- ans/=10;
- }
-
- //统计a
- *a=0;
- for(i=0;i<4;i++)
- {
- if(p[i]==q[i])
- *a=*a+1;
- }
-
- //统计b
- *b=0;
- for(i=0;i<4;i++)
- {
- for(j=0;j<4;j++)
- {
- if(i==j)
- continue;
- if(p[i]==q[j])
- *b=*b+1;
- }
- }
- }
- int main(void)
- {
- int guess,answer,a,b;
- int times=0;
- CLOCK_AttachClk(BOARD_DEBUG_UART_CLK_ATTACH);
- BOARD_InitPins();
- BOARD_InitDebugConsole();
- while(1)
- {
- if(times==0)
- {
- answer=GenAns();
- //DbgConsole_Printf("answer is %d\n",answer);//testing
- do
- {
- DbgConsole_Printf("***************Let'go!****************\n");
- DbgConsole_Printf("Input 4 different digits\n");
- DbgConsole_Scanf("%d",&guess);
- }while(!ValidNum(guess));
- DoComp(guess,answer,&a,&b);
- if(a==4)
- {
- PRINTF("*****You must be Cheating!!!*****\n");
- times=0;
- }
- else
- {
- DbgConsole_Printf("Time %d, You Guess:%d,Result:%dA%dB\n",times+1,guess,a,b);
- times++;
- }
- }
- if((times>0) && (times<9))
- {
- do
- {
- DbgConsole_Printf("Input 4 different digitals\n\n");
- DbgConsole_Scanf("%d",&guess);
- }while(!ValidNum(guess));
- DoComp(guess,answer,&a,&b);
- if(a==4)
- {
- DbgConsole_Printf("Congratulation! you are so smart.\n");
- times=0;
- }
- else
- {
- DbgConsole_Printf("Time %d, You Guess:%d,Result:%dA%dB\n",times+1,guess,a,b);
- times++;
- }
- }
- if(times>=9)
- {
- DbgConsole_Printf("-----Game Over, the answer is:%d-----\n",answer);
- times=0;
- }
- }
- }
复制代码 这就成了。
其中主要用到了随机数生成器,然后就是串口的输入输出功能,这个在fsl_debug_console.h头文件中提供了支持,其中有scanf、printf等,和C语言使用方式相当。
演示测试一把:
完成过程如下:
- [2021-10-20 15:54:02.624]# RECV ASCII>
- ***************Let'go!****************
- Input 4 different digits
- [2021-10-20 15:54:06.847]# SEND ASCII>
- 1234
- [2021-10-20 15:54:06.908]# RECV ASCII>
- Time 1, You Guess:1234,Result:0A2B
- Input 4 different digitals
- [2021-10-20 15:54:11.543]# SEND ASCII>
- 5678
- [2021-10-20 15:54:11.600]# RECV ASCII>
- Time 2, You Guess:5678,Result:0A2B
- Input 4 different digitals
- [2021-10-20 15:54:20.936]# SEND ASCII>
- 7812
- [2021-10-20 15:54:20.993]# RECV ASCII>
- Time 3, You Guess:7812,Result:0A1B
- Input 4 different digitals
- [2021-10-20 15:54:39.647]# SEND ASCII>
- 5623
- [2021-10-20 15:54:39.697]# RECV ASCII>
- Time 4, You Guess:5623,Result:0A2B
- Input 4 different digitals
- [2021-10-20 15:54:52.151]# SEND ASCII>
- 7842
- [2021-10-20 15:54:52.219]# RECV ASCII>
- Time 5, You Guess:7842,Result:1A0B
- Input 4 different digitals
- [2021-10-20 15:57:57.280]# SEND ASCII>
- 4156
- [2021-10-20 15:57:57.336]# RECV ASCII>
- Time 6, You Guess:4156,Result:1A3B
- Input 4 different digitals
- [2021-10-20 15:59:32.527]# SEND ASCII>
- 6145
- [2021-10-20 15:59:32.588]# RECV ASCII>
- Congratulation! you are so smart.
复制代码 权当自娱自乐了。其实生成随机数、校验等逻辑都非常简单,写这些代码,基本上都调用库函数了,加上调试时间也就是一个多小时,至于最关键的输入、输出界面,这一块儿估计得很花点时间,希望有不明真相的同学入坑。
这是源码:
|
|