查看: 3894|回复: 4

[原创] 10月主题月活动:猜数字游戏

[复制链接]
  • TA的每日心情
    奋斗
    昨天 00:05
  • 签到天数: 1884 天

    连续签到: 9 天

    [LV.Master]伴坛终老

    203

    主题

    3万

    帖子

    64

    超级版主

    Rank: 8Rank: 8

    积分
    112771
    最后登录
    2025-9-12
    发表于 2021-10-20 16:13:29 | 显示全部楼层 |阅读模式
    本帖最后由 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采集的值作为随机数。

    用户输入和显示,现在用的是串口与上位机通讯。等等,串口?
    2.jpg


    没错,就是串口,这也是为什么说我做的只是一个半成品的原因。使用串口有点儿……愚蠢的感觉。都有上位机了,还不如直接在电脑上搞这个游戏?
    1.jpg

    相信大家一定会有这种感觉,这个我也知道。不过我这里只是想通过串口,客串一下用户界面,毕竟图形界面这种高大上的东西,我一时半会儿还没玩转呢。

    好了,不多说,上代码吧,最核心的部分:
    1. #include "LPC54608.h"
    2. #include "pin_mux.h"
    3. #include "board.h"
    4. #include "fsl_debug_console.h"
    5. #include "XDRNG.h"


    6. int ValidNum(int x)
    7. {
    8.         int p[4],i,j;
    9.         for(i=0;i<4;i++)
    10.         {
    11.                 p[i]=x%10;
    12.                 x/=10;
    13.         }
    14.         if(p[3]==0)
    15.                 return 0;
    16.         
    17.         for(i=0;i<4;i++)
    18.         {
    19.                 for(j=i+1;j<4;j++)
    20.                 {
    21.                         if(p[i]==p[j])
    22.                                 return 0;
    23.                 }
    24.         }
    25.         return 1;
    26. }

    27. //generate anaswer
    28. int GenAns()
    29. {
    30.         int ret=0;
    31.         do
    32.         {
    33.                 ret=XDRNG_GenRange(1000,9999);
    34.         }while(!ValidNum(ret));
    35.         return ret;
    36. }

    37. /*
    38.         compare guess number & answer
    39. */
    40. void DoComp(int gus,int ans,int* a,int* b)
    41. {
    42.         
    43.         int p[4],q[4],i,j;
    44.         for(i=0;i<4;i++)
    45.         {
    46.                 p[i]=gus%10;
    47.                 gus/=10;
    48.                 q[i]=ans%10;
    49.                 ans/=10;
    50.         }
    51.         
    52.         //统计a
    53.         *a=0;
    54.         for(i=0;i<4;i++)
    55.         {
    56.                 if(p[i]==q[i])
    57.                         *a=*a+1;
    58.         }
    59.         
    60.         //统计b
    61.         *b=0;
    62.         for(i=0;i<4;i++)
    63.         {
    64.                 for(j=0;j<4;j++)
    65.                 {
    66.                         if(i==j)
    67.                                 continue;
    68.                         if(p[i]==q[j])
    69.                                 *b=*b+1;
    70.                 }
    71.         }
    72. }

    73. int main(void)
    74. {
    75.         int guess,answer,a,b;
    76.         int times=0;
    77.     CLOCK_AttachClk(BOARD_DEBUG_UART_CLK_ATTACH);
    78.     BOARD_InitPins();
    79.     BOARD_InitDebugConsole();
    80.     while(1)
    81.     {
    82.                 if(times==0)
    83.                 {
    84.                         answer=GenAns();
    85. //DbgConsole_Printf("answer is %d\n",answer);//testing
    86.                         do
    87.                         {
    88.                                 DbgConsole_Printf("***************Let'go!****************\n");
    89.                                 DbgConsole_Printf("Input 4 different digits\n");
    90.                                 DbgConsole_Scanf("%d",&guess);
    91.                         }while(!ValidNum(guess));
    92.                         DoComp(guess,answer,&a,&b);
    93.                         if(a==4)
    94.                         {
    95.                                 PRINTF("*****You must be Cheating!!!*****\n");
    96.                                 times=0;
    97.                         }
    98.                         else
    99.                         {
    100.                                 DbgConsole_Printf("Time %d, You Guess:%d,Result:%dA%dB\n",times+1,guess,a,b);
    101.                                 times++;
    102.                         }
    103.                 }
    104.                 if((times>0) && (times<9))
    105.                 {
    106.                         do
    107.                         {
    108.                                 DbgConsole_Printf("Input 4 different digitals\n\n");
    109.                                 DbgConsole_Scanf("%d",&guess);
    110.                         }while(!ValidNum(guess));
    111.                         DoComp(guess,answer,&a,&b);
    112.                         if(a==4)
    113.                         {
    114.                                 DbgConsole_Printf("Congratulation! you are so smart.\n");
    115.                                 times=0;
    116.                         }
    117.                         else
    118.                         {
    119.                                 DbgConsole_Printf("Time %d, You Guess:%d,Result:%dA%dB\n",times+1,guess,a,b);
    120.                                 times++;
    121.                         }
    122.                 }
    123.                 if(times>=9)
    124.                 {
    125.                         DbgConsole_Printf("-----Game Over, the answer is:%d-----\n",answer);
    126.                         times=0;
    127.                 }               
    128.     }
    129. }
    复制代码
    这就成了。
    其中主要用到了随机数生成器,然后就是串口的输入输出功能,这个在fsl_debug_console.h头文件中提供了支持,其中有scanf、printf等,和C语言使用方式相当。

    演示测试一把:
    2021-10-20_155956.jpg

    完成过程如下:
    1. [2021-10-20 15:54:02.624]# RECV ASCII>
    2. ***************Let'go!****************
    3. Input 4 different digits

    4. [2021-10-20 15:54:06.847]# SEND ASCII>
    5. 1234

    6. [2021-10-20 15:54:06.908]# RECV ASCII>
    7. Time 1, You Guess:1234,Result:0A2B
    8. Input 4 different digitals


    9. [2021-10-20 15:54:11.543]# SEND ASCII>
    10. 5678

    11. [2021-10-20 15:54:11.600]# RECV ASCII>
    12. Time 2, You Guess:5678,Result:0A2B
    13. Input 4 different digitals


    14. [2021-10-20 15:54:20.936]# SEND ASCII>
    15. 7812

    16. [2021-10-20 15:54:20.993]# RECV ASCII>
    17. Time 3, You Guess:7812,Result:0A1B
    18. Input 4 different digitals


    19. [2021-10-20 15:54:39.647]# SEND ASCII>
    20. 5623

    21. [2021-10-20 15:54:39.697]# RECV ASCII>
    22. Time 4, You Guess:5623,Result:0A2B
    23. Input 4 different digitals


    24. [2021-10-20 15:54:52.151]# SEND ASCII>
    25. 7842

    26. [2021-10-20 15:54:52.219]# RECV ASCII>
    27. Time 5, You Guess:7842,Result:1A0B
    28. Input 4 different digitals


    29. [2021-10-20 15:57:57.280]# SEND ASCII>
    30. 4156

    31. [2021-10-20 15:57:57.336]# RECV ASCII>
    32. Time 6, You Guess:4156,Result:1A3B
    33. Input 4 different digitals


    34. [2021-10-20 15:59:32.527]# SEND ASCII>
    35. 6145

    36. [2021-10-20 15:59:32.588]# RECV ASCII>
    37. Congratulation! you are so smart.
    复制代码
    权当自娱自乐了。其实生成随机数、校验等逻辑都非常简单,写这些代码,基本上都调用库函数了,加上调试时间也就是一个多小时,至于最关键的输入、输出界面,这一块儿估计得很花点时间,希望有不明真相的同学入坑。
    333.gif

    这是源码:

    Guess4.zip (89.28 KB, 下载次数: 4)
    该会员没有填写今日想说内容.
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2025-7-11 08:53
  • 签到天数: 301 天

    连续签到: 2 天

    [LV.8]以坛为家I

    3946

    主题

    7567

    帖子

    0

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    40297
    最后登录
    2025-9-12
    发表于 2021-10-20 17:05:11 | 显示全部楼层
    14.png
    qiandao qiandao
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2025-8-8 16:43
  • 签到天数: 1504 天

    连续签到: 1 天

    [LV.Master]伴坛终老

    97

    主题

    4693

    帖子

    12

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    10105
    最后登录
    2025-9-11
    发表于 2021-10-20 17:25:47 | 显示全部楼层
    楼主这个帖子
    给想参加活动,但还在迷茫的人一个方向。

    谢谢楼主了
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    昨天 00:05
  • 签到天数: 1884 天

    连续签到: 9 天

    [LV.Master]伴坛终老

    203

    主题

    3万

    帖子

    64

    超级版主

    Rank: 8Rank: 8

    积分
    112771
    最后登录
    2025-9-12
     楼主| 发表于 2021-10-20 19:18:40 来自手机 | 显示全部楼层
    jobszheng5 发表于 2021-10-20 17:25
    楼主这个帖子
    给想参加活动,但还在迷茫的人一个方向。


    接下来就看你们的表演了
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2025-7-11 08:53
  • 签到天数: 301 天

    连续签到: 2 天

    [LV.8]以坛为家I

    3946

    主题

    7567

    帖子

    0

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    40297
    最后登录
    2025-9-12
    发表于 2021-10-21 12:37:33 | 显示全部楼层
    有没有效果展示
    qiandao qiandao
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /3 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2025-9-13 03:11 , Processed in 0.090309 second(s), 23 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

    快速回复 返回顶部 返回列表