c语言_Day13_07_12

1、猜数字游戏

需求:1、生成随机数,用户猜测数字,电脑反馈用户所猜数字大或小或准确

​ 2、菜单界面

我的代码:

int main()
{
	int tarNum = rand();
	int inputNum;
	int playAgain = 'Y';
	printf("欢迎游玩猜数字小游戏\n============================\n");

	while (playAgain == 'Y')
	{
		printf("请输入数字: ");
		scanf("%d", &inputNum);
		if (inputNum == tarNum)
		{
			printf("已猜到,随机数就是%d\n", inputNum);
			while (1)
			{
				printf("是否还要继续游玩?(Y/N)\n");
				while (getchar() != '\n') {}
				scanf("%c", &playAgain);
				if (playAgain == 'Y')
				{
					tarNum = rand();
					break;
				}
				else if (playAgain == 'N')
				{
					printf("游戏结束\n");
					break;
				}
				else
				{
					printf("输入错误,请再次输入\n");
				}
			}
		}
		else if (inputNum > tarNum)
		{
			printf("输入的数字较大\n");
		}
		else
		{
			printf("输入的数字较小\n");
		}
	}

	return 0;
}

问题:

  1. 随机数为伪随机数,应当通过srand函数初始化随机数。然而,srand函数需要接收一个随机整数作为参数,可传入一个时间戳作为参数(使用time函数)

  2. 随机数范围太大,若需生成a~b之间的随机数,则可带入公式

    rand() % a + b

  3. 可以考虑将不同功能的代码封装至不同的函数中调用,逻辑会更清晰

参考代码:

/// <summary>
/// 生成菜单页面
/// </summary>
void menu()
{
	printf("***********************\n");
	printf("****1.play   0.exit****\n");
	printf("***********************\n");
}

/// <summary>
/// 生成1-100之间的随机数
/// </summary>
/// <returns></returns>
int getRandNum()
{
	return rand() % 100 + 1;
}

/// <summary>
/// 进行猜数字游戏
/// </summary>
void game()
{
	int gusNum = 0;
	// 1. 生成随机数
	int randNum = getRandNum();
	// 2. 猜数字
	while (1)
	{
		printf("请猜数字:");
		scanf("%d", &gusNum);
		if (gusNum > randNum)
		{
			printf("大了\n");
		}
		else if (gusNum < randNum)
		{
			printf("小了\n");
		}
		else
		{
			printf("猜中了\n");
			break;
		}
	}
}

int main()
{
	int input = 0;
	// 初始化随机数种子
	srand((unsigned int)time(NULL));
	do
	{
		menu();
		printf("请选择:");
		scanf("%d", &input);
		switch (input)
		{
		case 0:
			printf("退出游戏\n");
			break;
		case 1:
			// 进行游戏
			game();
			break;
		default:
			printf("输入错误\n");
			break;
		}
	} while (input);

	return 0;
}

2、goto语句

goto语句由两部分构成:goto和标签名

goto可跳转至标签名所对应的语句处

int main()
{
again:
	printf("Hello, World!");
	goto again;

	return 0;
}

注:goto语句容易被滥用,导致程序执行顺序混乱

特殊的应用场景:跳出深层嵌套的循环

int main()
{
	for (int i = 0; i < 100; i++)
	{
		for (int k = 0; k < 10; k++)
		{
			if (i == 50)
			{
				goto out;
			}
			else
			{
				printf("%d -- %d\n", k, i);
			}
		}
	}

out:
	printf("I'm out\n");

	return 0;
}

例:关机程序

// 关机程序
int main()
{
	char input[20] = { 0 };
	system("shutdown -s -t 60");
again:
	printf("您的电脑将在60s后关机!\n输入'stop'停止关机\n");
	scanf("%s", input);
	if (strcmp(input, "stop") == 0)
	{
		system("shutdown -a");
		printf("已关闭定时\n");
	}
	else
	{
		goto again;
	}

	return 0;
}

实际上改代码的goto语句部分可使用while语句替代:

while(1)
{
    printf("您的电脑将在60s后关机!\n输入'stop'停止关机\n");
	scanf("%s", input);
	if (strcmp(input, "stop") == 0)
	{
		system("shutdown -a");
		printf("已关闭定时\n");
        break;
	}
}