初学C语言:猜数字
一下是对初学c语言的写代码的一些总结
题目描述:
随机生成没有重复的n个数,用户从键盘输入猜测的数,每猜一次,电脑给出提示,如果用户输入的数跟计算机生成的数,
数值和位置都完全相同,则胜出
√ 1、有操作菜单,能根据不同选择运行不同功能:1.开始游戏! 2、查看成绩!3、输出帮助信息! 4.退出程序 ;5、修改系统设置
√ 2、控制用户的尝试次数为10次
√ 3、
a、修B可以尝试的次数
b、修改要猜的数字的个数n,根据修改后的m值,计算机可随机生成n个数,用户进行n个数的猜测游戏。
√ 4、随机生成没有重复的4个数(每个数字在0-9范围内)
√ 5、 用户从键盘键入4个不重复的数,
√ 6、对用户输入的数字进行检查,如果用户输入重复的数,给出提示,要求重新输入
√ 7、程序能对用户输入的数与随机生成的数进行匹配,并给出提示信息“有x个数数值和位置都相同! 有y个数数值相同,但位置不同”
8、计算、输出并保存用户的得分,计分规则:总分是100分,每失败一次扣10分
分析题目:
①首先创建菜单,其次可以创建变量flag,来scanf判断获取的标签,其中flag为4时退出程序(return)
这一步可以用while循环来完成;
②判断flag,为1时
a、默认尝试次数为10次
b、需要系统生成4位(默认)随机数字
c、需要用户进行输入,并判断用户输入的正确性(是否有重复)
d、将系统生成的数字与用户进行比对,输出结果
其中a可以用for或者while来进行,b中是需要借助time.h模块,srand(clock())来获取随机种子(可能表达有误,具体原理还没有时间学习),然后存入到rangeNumber数组中,c中对用户判断输入,考虑到后面需要的对比数字,我采用的是先将用户输入的数字进行打散存入数组inputNumber,在遍历数组排查(当然,还有其他办法);d中就直接用一个循环判断就行了;
分区代码如下:
部分代码
a、省略
b、需要系统生成4位(默认)随机数字
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>
int main(void)
{
system("chcp 65001 & cls");
// 定义
int nmb = 4, numbers[nmb] = {0},i,runs,n,it,flag;
srand(clock());
runs = nmb;
it = 0;
for(i=0;i<runs;i++)
{
flag = 0;
n = rand()%10;
// printf("\nn:%d\n", n);
// printf("i:%d\n", i);
// printf("it:%d\n", it);
// printf("runs:%d\n", runs);
if (i==0)
{
numbers[i] = n;
it++;
}
else
{
for (int t=0;t<it;t++)
{
if (numbers[t]==n)
{
flag = 1;
runs++;
}
}
printf("flag:%d\n",flag);
if (flag==0)
{
numbers[it] = n;
it++;
}
}
for (int four=0;four<nmb;four++)
{
printf("%d", numbers[four]);
}
printf("\n");
}
}
c、需要用户进行输入,并判断用户输入的正确性(是否有重复)
其中我没有使用到pow()函数来计算10的n次方,原因是pow(10,2)的结果是99.9999999
具体原因没仔细看,虽然不影响结果,但是我还是另外写了一个函数。
# include <stdio.h>
# include <stdlib.h>
# include <time.h>
# include <math.h>
int count10(int xtime);
int main(void)
{
system("chcp 65001 & cls");
int times=10,item=0,nmb[4]={0,1,2,3},inputNumber,input;
while(item<times)
{
item++;
int flag2=0;
while(flag2==0)
{
//初始化数组下标
//初始化flag2
//玩家输入数字存储数组
int xtime=3;
int nmb1[4] = {0};
printf("\n·第%d尝试·\n", item);
printf("请输入4位数字:");
scanf("%d", &inputNumber);
//判断输入的数字是否符合要求
if ((inputNumber<count10(xtime))||(inputNumber>count10(xtime+1)))
{
printf("%d\n", count10(xtime));
printf("输入错误,请重新输入!!!\n");
}
else
{
// 将输入的数字存入数组
for(xtime;xtime>=0;xtime--)
{
// 获取输入的数(从前往后)
input = inputNumber%10;
printf("input:%d\n", input);
inputNumber/=10;
nmb1[xtime]=input;
}
//检验数组
for (int i = 0; i < 4; i++)
{
printf("%d·", nmb1[i]);
}
// 判断数组的元素是否重复
for (int j=0;j<4;j++)
{
for (int j1=j+1;j1<4;j1++)
{
if (nmb1[j]==nmb1[j1])
{
printf("数字重复,请重新输入\n");
flag2=0;
break;
}
else flag2=1;
}
}
}
}
}
}
//计算10的平方
int count10(int xtime)
{
int count=1;
for(int i=1;i<=xtime;i++)
{
count = count*10;
}
// printf("%d\n", count);
return count;
}
d、将系统生成的数字与用户进行比对,输出结果
# include <stdio.h>
# include <stdlib.h>
# include <time.h>
# include <math.h>
int main(void)
{
system("chcp 65001 & cls");
int numbs=4;
//正确的数字 位置和数字都正确
int rightnumb=0,right=0;
//模拟用户输入的数字,进行验证
int nmb[4]={0,1,2,3},nmb1[4]={1,2,4,3},nmb2[4]={0,1,2,3};
int nmb3[4]={3,2,1,0};
for (int i=0;i<numbs;i++)
{
for(int it=0;it<numbs;it++)
{
if ((nmb[i]==nmb2[it])&&(i==it))
{
rightnumb++;
right++;
}
else if(nmb[i]==nmb2[it]) rightnumb++;
}
}
if (right==numbs) printf("YOU WIN!!!\n");
else
{
printf("有%d个数字数值和位置相同\n", right);
printf("有%d个数字数字相同但位置不同\n", rightnumb);
}
}
后面的一些都是比较基础的循环,赋值的操作,代码就不细讲了。。。
其中还有计算数字和查看成绩这两部分,但是最近忙着准备考试,就懒得写了。。。
代码也写的挺烂的,如果有什么好的意见的话,可以评论区留言给一些意见 (_)
全部代码
/*
随机生成没有重复的n个数,用户从键盘输入猜测的数,每猜一次,电脑给出提示,如果用户输入的数跟计算机生成的数,
数值和位置都完全相同,则胜出
√ (3)控制用户的尝试次数为10次
√ (5)有操作菜单,能根据不同选择运行不同功能:1.开始游戏! 2、查看成绩!3、输出帮助信息! 4.退出程序
√ (7) 能对游戏进行设置:在操作菜单中增加相应的选项: 5:系统设置。
√ 1、修改要猜的数字的个数n,根据修改后的m值,计算机可随机生成n个数,用户进行n个数的猜测游戏。
√ 2、修B可以尝试的次数
√ (1)随机生成没有重复的4个数(每个数字在0-9范围内)
√ (2) 用户从键盘键入4个不重复的数,
√ (6)对用户输入的数字进行检查,如果用户输入重复的数,给出提示,要求重新输入
√ (8)程序能对用户输入的数与随机生成的数进行匹配,并给出提示信息“有x个数数值和位置都相同! 有y个数数值相同,但位置不同”
(4) 计算、输出并保存用户的得分,计分规则:总分是100分,每失败一次扣10分
*/
# include <stdio.h>
# include <stdlib.h>
# include <time.h>
# include <math.h>
int count10(int xtime);
int main(void)
{
system("chcp 65001 & cls");
//numbs:默认数字个数; times:默认游戏次数
int numbs=4,times=10;
//flag:游戏指令;
int flag;
// printf("输入123开始游戏:");
// scanf("%d", & flag);
// if (flag!=123) return 0;
while (flag != 4)
{
printf("\n———————");
printf("\n|··菜单··|\n");
printf("|1.开始游戏! |\n");
printf("|2.查看成绩! |\n");
printf("|3.游戏玩法! |\n");
printf("|4.退出程序!|\n");
printf("|5.系统设置!|\n");
printf("———————\n");
printf("请输入序号 (输入其他程序自动退出):");
scanf("%d", &flag);
// printf("flag:%d\n", flag);
//程序变量设置
if (flag==5)
{
while(flag != 3)
{
printf("\n1、修改要猜的数字的个数(默认4个,最大上限9个)\n2、修改可以尝试的次数(默认10次)\n3、返回菜单\n");
printf("请输入序号:");
scanf("%d", &flag);
if (flag == 1)
{
printf("请输入数字的个数:");
scanf("%d", &numbs);
printf("numbs:%d\n", numbs);
}
if (flag == 2)
{
printf("请输入猜测次数:");
scanf("%d", ×);
printf("times:%d\n", times);
}
}
}
// 开始游戏
if (flag==1)
{
//n:随机数值; rangeNmb[numbs]:随机数组; runs:取随机数的循环次数
//it:存储随机数得数组下标; flag1: 判断是否为随机数的变量
int n,rangeNmb[numbs] = {0},runs,flag1,it=0;
//item:猜测次数循环变量; inputNmb[numbs]:猜测数组
//inputNnmber:猜测的数字
int item=0, inputNumber,input;
srand(clock());
runs = numbs;
//创建不重复的随机数,存入随机数数组
for(int i=0;i<runs;i++)
{
flag1 = 0;
n = rand()%10;
// printf("n:%d\n", n);
// printf("it:%d\n", it);
if (i==0)
{
rangeNmb[i] = n;
it++;
}
else
{
for (int t=0;t<it;t++)
{
if(rangeNmb[t]==n)
{
flag1 = 1;
runs++;
}
}
if (flag1==0)
{
rangeNmb[it] = n;
it++;
}
}
}
// 检验随机数数组
printf("rangeNumber:");
for (int four=0;four<numbs;four++)
{
printf("%d", rangeNmb[four]);
}
printf("\n···开始游戏···\n");
//游戏开始
while(item<times)
{
item++;
int flag2=0;
int inputNmb[numbs]={0};
// 输入数字;存入数组;检验数组是否含有相同元素
while(flag2==0)
{
if (flag==0) break;
// 初始化数组下标
// 初始化玩家数字数组
int xtime = numbs-1;
int inputNmb[numbs]={0};
printf("\n·第%d尝试·\n", item);
printf("请输入%d位数字:", numbs);
scanf("%d", &inputNumber);
printf("\n");
//判断输入的数字是否符合要求
if ((inputNumber<count10(xtime))||(inputNumber>count10(xtime+1)))
{
printf("%d\n", count10(xtime));
printf("输入错误,请重新输入!!!\n");
}
else
{
// 将输入的数字存入数组
for(xtime;xtime>=0;xtime--)
{
// 获取输入的数(从后往前)
input = inputNumber%10;
// printf("input:%d\n", input);
inputNumber/=10;
inputNmb[xtime]=input;
}
// //检验数组
// for (int i = 0; i < numbs; i++)
// {
// printf("%d·", inputNmb[i]);
// }
// 判断数组的元素是否重复
for (int j=0;j<numbs;j++)
{
for (int j1=j+1;j1<numbs;j1++)
{
if (inputNmb[j]==inputNmb[j1])
{
printf("数字重复,请重新输入\n");
flag2=0;
break;
}
else flag2=1;
}
}
}
// 将两个数组进行判断并返回结果
int rightNumb=0,right=0;
for (int i=0;i<numbs;i++)
{
for(int it=0;it<numbs;it++)
{
if ((rangeNmb[i]==inputNmb[it])&&(i==it))
{
right++;
}
else if((rangeNmb[i]==inputNmb[it])&&(i!=it)) rightNumb++;
}
}
if (right==numbs)
{
printf("!!!YOU WIN!!!\n");
flag2 = 1;
flag = 0;
}
else
{
printf("有%d个数字数值和位置相同\n", right);
printf("有%d个数字数字相同但位置不同\n", rightNumb);
}
}
}
}
// //查看成绩
// if (flag==2)
// {
// return 0;
// }
//输出帮助信息
if (flag==3)
{
printf("\n从键盘输入猜测的数,如果用户输入的数跟计算机生成的数,数值和位置都完全相同,则胜出\n");
printf("可以键入数字5来更改猜测数字和猜测次数。\n");
}
//退出程序
if (flag==4)
{
printf("\n···已退出···\n");
return 0;
}
}
}
//计算10的平方
int count10(int xtime)
{
int count=1;
for(int i=1;i<=xtime;i++)
{
count = count*10;
}
// printf("%d\n", count);
return count;
}