【C语言】猜数游戏

缺乏、安全感 2022-05-19 04:36 416阅读 0赞

系统随机产生四个不同的有序的数字 (从小到大排列),等待用户输入猜测的结果, 用A来表示数字正确且位置正确的个数 ,用B来表示数字正确但位置不正确的个数,给八次机会,猜中则游戏成功,机会用完则游戏失败

分析:1.需要一个数组存放生成的随机数,保证数据不重复且按从小到大排列

  1. 2.需要另外一个数组存放用户的猜测结果
  2. 3.需要一个变量记录已经猜了多少次
  3. 4.将两个数组进行比较,统计AB的个数并告知用户,方便其继续猜
  4. 5.当用户全部猜中或机会用完时,游戏结束,退出

我第一次得到题目时编写的代码如下:

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <time.h>
  4. int main(void) {
  5. //提示游戏规则
  6. printf("****************************************************\n");
  7. printf("*********************游戏规则***********************\n");
  8. printf("系统将随机生成四个不同的有序数字(按从小到大排列)\n");
  9. printf("请输入您猜测的四个数字\n");
  10. printf("用A表示数字正确且位置正确的个数\n");
  11. printf("用B表示数字正确但位置不正确的个数\n");
  12. printf("一共有八次机会\n");
  13. printf("****************************************************\n");
  14. //产生不同的随机数
  15. srand(time(NULL));
  16. int number[4];
  17. number[0] = rand() %9+1;
  18. number[1] = rand() %9+1;
  19. number[2] = rand() %9+1;
  20. number[3] = rand() %9+1;
  21. while (number[1] == number[0]) {
  22. number[1] = rand() %9+1;
  23. }
  24. while (number[2] == number[1] || number[2] == number [0]) {
  25. number[2] = rand() %9+1;
  26. }
  27. while (number[3] == number[2] || number[3] == number [1] || number[3] ==number[0]) {
  28. number[3] = rand() %9+1;
  29. }
  30. //这一句是为了检查数据是否重复,真正编译时应该删掉
  31. printf("%4d %4d %4d %4d\n",number[0],number[1],number[2],number[3]);
  32. //将随机数按从小到大排列
  33. for(int i = 0; i < 4; i++){
  34. for(int j = 0; j < i; j++)
  35. {
  36. if(number[i] < number[j]){
  37. number[i] = number[i] + number[j];
  38. number[j] = number[i] - number[j];
  39. number[i] = number[i] - number[j];
  40. }
  41. }
  42. }
  43. //这一句是为了检查数据是否正确排列,真正编译时应该删掉
  44. printf("%4d %4d %4d %4d\n",number[0],number[1],number[2],number[3]);
  45. //输入数据并判断
  46. int guess[4];
  47. int count = 8;
  48. do{
  49. int countA = 0;
  50. int countB = 0;
  51. //提示用户输入数据
  52. printf("请输入四个1~9的数字(每输一个按一次回车):\n");
  53. for (int i = 0; i < 4; i++) {
  54. scanf("%d",&guess[i]);
  55. while (guess[i] < 1 || 9 < guess[i]) {
  56. printf("输入数据有误,请重新输入\n");
  57. scanf("%d",&guess[i]);
  58. }
  59. }
  60. printf("%4d %4d %4d %4d\n",guess[0],guess[1],guess[2],guess[3]);
  61. //判断数字、位置是否相同并计数
  62. for ( i = 0; i < 4; i++) {
  63. if (guess[i] == number[i]) {
  64. countA++;
  65. continue;
  66. }
  67. for (int j = 0; j < 4; j++) {
  68. if (i == j) {
  69. continue;
  70. } else if (guess[i] == number[j]){
  71. countB++;
  72. }
  73. }
  74. }
  75. printf("一共有 %dA,%dB\n",countA,countB);
  76. //判断游戏是否应该结束
  77. if (countA == 4) {
  78. printf("恭喜您!游戏成功\n");
  79. getchar();
  80. getchar();
  81. exit(EXIT_SUCCESS);
  82. }
  83. count--;
  84. printf("还有%d次机会\n",count);
  85. printf("*******************************************\n");
  86. }while (count > 0);
  87. printf("次数用完,游戏失败\n");
  88. printf("正确数字为:%4d %4d %4d %4d\n",number[0],number[1],number[2],number[3]);
  89. getchar();
  90. getchar();
  91. return 0 ;
  92. }

这个代码是存在很多不足的,我在经过这两天学习之后,主要进行了四个修改。

1.产生不同的随机数部分

这是整个代码最傻的部分,我第一次编写时考虑使用for循环比较下标来保证数据不重复,但一直没办法实现,所以用了一个很傻的方法来使它不重复,实际上是不可取的。后来发现可以通过与一个临时变量比较来实现,代码如下:

  1. //产生不同的随机数
  2. srand(time(NULL));
  3. int number[4];
  4. for (int i = 0; i < 4; i++) {
  5. //定义一个temp存放随机数
  6. int temp = rand() %9+1;
  7. //判断是否为第一个数
  8. if (i == 0) {
  9. //是第一个数,直接存放
  10. number[i] = temp;
  11. } else {
  12. //不是,将temp与先前的数进行比较
  13. for (int j = 0; j < i; j++) {
  14. if (number[j] == temp ) {
  15. //相同,退出循环,重新生成temp
  16. i--;
  17. break;
  18. } else{
  19. //不同,直接存放
  20. number[i] = temp;
  21. }
  22. }
  23. }
  24. }
  25. printf("%4d %4d %4d %4d\n",number[0],number[1],number[2],number[3]);

用这个方法就不会显得那么傻,而且可以借鉴到其他地方

2.判断数字、位置是否相同并计数部分

这一部分乍一看没问题,其实可以更加简化,也更方便理解,代码如下:

  1. //判断数字、位置是否相同并计数
  2. for (i = 0; i < 4; i++) {
  3. for (int j = 0; j < 4; j++) {
  4. //判断数字是否相同
  5. if (guess[i] == number[j]){
  6. //数字相同,判断位置是否相同
  7. if (i == j) {
  8. //位置相同,A+1
  9. countA++;
  10. } else{
  11. //位置不同,B+1
  12. countB++;
  13. }
  14. }
  15. }
  16. }
  17. printf("一共有 %dA,%dB\n",countA,countB);

3.将随机数按从小到大排列部分

这个部分主要是在两个数据交换位置时,通过两个数据相互加减的方法来交换虽然不需要引入第三个变量,但是增加了运算,使效率变低,也显得不够简单,因此最后改为引入第三个变量进行交换。

4.对countA、countB的定义部分

将 int countA和int countB放进了do…while循环中,造成了重复定义,这实际上是不够严谨的,于是将这两个变量的定义提到外部,并在循环的最后将其清零。

修改后的所有代码如下:

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <time.h>
  4. int main(void) {
  5. //提示游戏规则
  6. printf("****************************************************\n");
  7. printf("*********************游戏规则***********************\n");
  8. printf("系统将随机生成四个不同的有序数字(按从小到大排列)\n");
  9. printf("请输入您猜测的四个数字\n");
  10. printf("用A表示数字正确且位置正确的个数\n");
  11. printf("用B表示数字正确但位置不正确的个数\n");
  12. printf("一共有八次机会\n");
  13. printf("****************************************************\n");
  14. //产生不同的随机数
  15. srand(time(NULL));
  16. int number[4];
  17. for (int i = 0; i < 4; i++) {
  18. //定义一个temp存放随机数
  19. int temp = rand() %9+1;
  20. //判断是否为第一个数
  21. if (i == 0) {
  22. //是第一个数,直接存放
  23. number[i] = temp;
  24. } else {
  25. //不是,将temp与先前的数进行比较
  26. for (int j = 0; j < i; j++) {
  27. if (number[j] == temp ) {
  28. //相同,退出循环,重新生成temp
  29. i--;
  30. break;
  31. } else{
  32. //不同,直接存放
  33. number[i] = temp;
  34. }
  35. }
  36. }
  37. }
  38. //这一句是为了检查数据是否重复,真正编译时应该删掉
  39. printf("%4d %4d %4d %4d\n",number[0],number[1],number[2],number[3]);
  40. //将随机数按从小到大排列
  41. for( i = 0; i < 4; i++){
  42. for(int j = 0; j < i; j++)
  43. {
  44. if(number[i] < number[j]){
  45. //使用第三方变量更方便,也更有效率
  46. int temp = 0;
  47. temp = number[i];
  48. number[i] = number[j];
  49. number[j] = temp;
  50. }
  51. }
  52. }
  53. //这一句是为了检查是否正确排序,真正编译时应该删掉
  54. printf("%4d %4d %4d %4d\n",number[0],number[1],number[2],number[3]);
  55. //输入数据并判断
  56. int guess[4];
  57. int count = 8;
  58. int countA = 0;
  59. int countB = 0;
  60. do{
  61. /*
  62. int countA = 0;
  63. int countB = 0; 定义只定义一次,所以应该在外部定义
  64. */
  65. //提示用户输入数据
  66. printf("请输入四个1~9的数字:\n");
  67. for (int i = 0; i < 4; i++) {
  68. scanf("%d",&guess[i]);
  69. //判断数据是否在1-9区间内
  70. while (guess[i] < 1 || 9 < guess[i]) {
  71. printf("输入数据有误,请重新输入\n");
  72. scanf("%d",&guess[i]);
  73. }
  74. }
  75. printf("%4d %4d %4d %4d\n",guess[0],guess[1],guess[2],guess[3]);
  76. //判断数字、位置是否相同并计数
  77. for (i = 0; i < 4; i++) {
  78. for (int j = 0; j < 4; j++) {
  79. //判断数字是否相同
  80. if (guess[i] == number[j]){
  81. //数字相同,判断位置是否相同
  82. if (i == j) {
  83. //位置相同,A+1
  84. countA++;
  85. } else{
  86. //位置不同,B+1
  87. countB++;
  88. }
  89. }
  90. }
  91. }
  92. printf("一共有 %dA,%dB\n",countA,countB);
  93. //判断是否全部猜中
  94. //全部猜中,游戏结束
  95. if (countA == 4) {
  96. printf("恭喜您!游戏成功\n");
  97. getchar();
  98. getchar();
  99. exit(EXIT_SUCCESS);
  100. }
  101. //没猜中,次数-1,A、B清零
  102. count--;
  103. countA = 0;
  104. countB = 0;
  105. printf("还有%d次机会\n",count);
  106. }while (count > 0);
  107. //机会用完,游戏结束
  108. printf("次数用完,游戏失败。\n");
  109. getchar();
  110. getchar();
  111. return 0 ;
  112. }

其实这个程序还有不完善的地方,比如说没有考虑用户输入相同数字时的处理等,但题目所需要的功能已经实现,玩一玩还是挺有意思的

发表评论

表情:
评论列表 (有 0 条评论,416人围观)

还没有评论,来说两句吧...

相关阅读

    相关 c语言 数字游戏

    猜数字游戏是令游戏机随机产生一个100以内的正整数,用户输入一个数对其进行猜测,需要你编写程序自动对其与随机产生的被猜数进行比较,并提示大了(“Too big”),还是小了(“

    相关 C语言数字游戏

    游戏描述 系统随机产生一个1-100内的随机数,由玩家来猜。玩家输入不重复的1-100内的数字,按回车键后系统给出提示,提示猜的数字是偏大还是偏小,直到猜中系统产生的那个

    相关 C语言游戏

    系统随机产生四个不同的有序的数字 (从小到大排列),等待用户输入猜测的结果, 用A来表示数字正确且位置正确的个数 ,用B来表示数字正确但位置不正确的个数,给八次机会,猜中则游戏