初学C语言:猜数字

初学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", &times);
					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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值