C语言实践——数三十(人机博弈)

本文介绍了使用C语言实现的数三十游戏,包括创建数字数组、电脑先数和用户先数的逻辑,以及游戏源代码和测试结果展示。通过合理计策,玩家可以掌控游戏的胜负。
摘要由CSDN通过智能技术生成


前言

 什么是“数三十”呢?“数三十”是两个人玩的数字游戏,从1开始数数最后谁数到三十谁就输啦。每人每次数数可以数1个数、数两个数、数三个数。今天我们就用while循环语句、printf函数、if判断语句来设计一个简单的人机对战“数三十”小游戏。文章最后附带源代码。


一、创建数字数组

创建一些数组来存放可能说到数,如果一个数字一个数字地数,那么可能数到的数有30个:
char str_1[] = “1”;char str_2[] = “2”;char str_3[] = “3”;char str_4[] = “4”; char str_5[] = “5”;
char str_6[] = “6”;char str_7[] = “7”;char str_8[] = “8”;char str_9[] = “9”;char str_10[] = “10”;
char str_11[] = “11”;char str_12[] = “12”;char str_13[] = “13”;char str_14[] = “14”;char str_15[] = “15”;
char str_16[] = “16”;char str_17[] = “17”;char str_18[] = “18”;char str_19[] = “19”;char str_20[] = “20”;
char str_21[] = “21”; char str_22[] = “22”;char str_23[] = “23”;char str_24[] = “24”;char str_25[] = “25”;
char str_26[] = “26”;char str_27[] = “27”;char str_28[] = “28”;char str_29[] = “29”;char str_30[] = “30”;
如果两个数字两个数字地数,那么可能数到的数字组有29组:
char sstr_12[] = “1,2”;char sstr_23[] = “2,3”; char str_34[] = “3,4”;
char str_45[] = “4,5”;char str_56[] = “5,6”; char str_67[] = “6,7”;
char str_78[] = “7,8”;char str_89[] = “8,9”; char str_910[] = “9,10”;
char str_1011[] = “10,11”; char str_1112[] = “11,12”; char str_1213[] = “12,13”;
char str_1314[] = “13,14”; char str_1415[] = “14,15”; char str_1516[] = “15,16”;
char str_1617[] = “16,17”; char str_1718[] = “17,18”; char str_1819[] = “18,19”;
char str_1920[] = “19,20”; char str_2021[] = “20,21”; char str_2122[] = “21,22”;
char str_2223[] = “22,23”; char str_2324[] = “23,24”; char str_2425[] = “24,25”;
char str_2526[] = “25,26”; char str_2627[] = “26,27”; char str_2728[] = “27,28”;
char str_2829[] = “28,29”; char str_2930[] = “29,30”;
如果三个数字三个数字地数,那么可能数到的数字组有个28组:
char str_123[] = “1,2,3”; char str_234[] = “2,3,4”; char str_345[] = “3,4,5”;
char str_456[] = “4,5,6”; char str_567[] = “5,6,7”; char str_678[] = “6,7,8”;
char str_789[] = “7,8,9”; char str_8910[] = “8,9,10”; char str_91011[] = “9,10,11”;
char str_101112[] = “10,11,12”; char str_111213[] = “11,12,13”; char str_121314[] = “12,13,14”;
char str_131415[] = “13,14,15”; char str_141516[] = “14,15,16”; char str_151617[] = “15,16,17”;
char str_161718[] = “16,17,18”; char str_171819[] = “17,18,19”; char str_181920[] = “18,19,20”;
char str_192021[] = “19,20,21”; char str_202122[] = “20,21,22”; char str_212223[] = “21,22,23”;
char str_222324[] = “22,23,24”; char str_232425[] = “23,24,25”; char str_242526[] = “24,25,26”;
char str_252627[] = “25,26,27”; char str_262728[] = “26,27,28”; char str_272829[] = “27,28,29”;
char str_282930[] = “28,29,30”;
数字数组代码如下:

    char password[10];
	char str_0[] = "0";char str_1[] = "1";char str_2[] = "2";
	char str_3[] = "3";char str_4[] = "4";char str_5[] = "5";
    char str_6[] = "6";char str_7[] = "7";char str_8[] = "8";
	char str_9[] = "9";char str_10[] = "10";char str_11[] = "11";
	char str_12[] = "12";char str_13[] = "13";char str_14[] = "14";
	char str_15[] = "15";char str_16[] = "16";char str_17[] = "17";
	char str_18[] = "18";char str_19[] = "19";char str_20[] = "20";
	char str_21[] = "21";char str_22[] = "22";char str_23[] = "23";
	char str_24[] = "24";char str_25[] = "25";char str_26[] = "26";
	char str_27[] = "27";char str_28[] = "28";char str_29[] = "29";
	char str_30[] = "30";
	char sstr_12[] = "1,2";char sstr_23[] = "2,3"; char str_34[] = "3,4";
	char str_45[] = "4,5";char str_56[] = "5,6"; char str_67[] = "6,7";
	char str_78[] = "7,8";char str_89[] = "8,9"; char str_910[] = "9,10";
	char str_1011[] = "10,11"; char str_1112[] = "11,12"; char str_1213[] = "12,13";
	char str_1314[] = "13,14"; char str_1415[] = "14,15"; char str_1516[] = "15,16";
	char str_1617[] = "16,17"; char str_1718[] = "17,18"; char str_1819[] = "18,19";
	char str_1920[] = "19,20"; char str_2021[] = "20,21"; char str_2122[] = "21,22";
	char str_2223[] = "22,23"; char str_2324[] = "23,24"; char str_2425[] = "24,25";
	char str_2526[] = "25,26"; char str_2627[] = "26,27"; char str_2728[] = "27,28";
	char str_2829[] = "28,29"; char str_2930[] = "29,30";
	char str_123[] = "1,2,3"; char str_234[] = "2,3,4"; char str_345[] = "3,4,5";
	char str_456[] = "4,5,6"; char str_567[] = "5,6,7"; char str_678[] = "6,7,8";
	char str_789[] = "7,8,9"; char str_8910[] = "8,9,10"; char str_91011[] = "9,10,11";
	char str_101112[] = "10,11,12"; char str_111213[] = "11,12,13"; char str_121314[] = "12,13,14";
	char str_131415[] = "13,14,15"; char str_141516[] = "14,15,16"; char str_151617[] = "15,16,17";
	char str_161718[] = "16,17,18"; char str_171819[] = "17,18,19"; char str_181920[] = "18,19,20";
	char str_192021[] = "19,20,21"; char str_202122[] = "20,21,22"; char str_212223[] = "21,22,23";
	char str_222324[] = "22,23,24"; char str_232425[] = "23,24,25"; char str_242526[] = "24,25,26";
	char str_252627[] = "25,26,27"; char str_262728[] = "26,27,28"; char str_272829[] = "27,28,29";
	char str_282930[] = "28,29,30";

二、电脑先数

 设置两种模式,一种是电脑先数的模式,另一种是人先数的模式。这里简单介绍一下“数三十”必胜的技巧。首先直接给结论——谁先数谁就可以掌控这局游戏的胜负。原因如下:
假如甲先数:1,不管乙数什么,甲只需要数到5,例如①乙数:2,3,那么甲就数:4,5;②乙数:2,3,4,那么甲就数:5;③乙数:2,那么甲就数:3,4,5。后面以此类推,形成四个数一组的局面,那么七轮过后甲必数到29,1 + 4 * 7 = 29;那么乙便输了。
 当然代码里面加入了防输入错误或者作弊的代码,如果输错了或者输入已经说过的数,就会提示“输入错误”并且让用户重新输入。
电脑先数代码如下:

printf("欢迎来到数30!你先说请扣1,我先说请扣0\n");
	printf("请输入:");
	while (1)
	{
   

		scanf("%s", password);
		if (strcmp(str_0, password) == 0)
		{
   
			printf("那我先说啦!\n");
			printf("我:1\n");
			printf("该你说啦:");
			while (1)
			{
   
				scanf("%s", password);
				if ((strcmp(str_2, password) == 0) || (strcmp(sstr_23, password) == 0) || (strcmp(str_234, password) == 0))
				{
   
					Sleep(3000);
					if (strcmp(str_2, password) == 0)printf("我:3,4,5\n");
					if (strcmp(sstr_23, password) == 0)printf("我:4,5\n");
					if (strcmp(str_234, password) == 0)printf("我:5\n");
					break;
				}
				printf("输入错误!\n");
				printf("请重新输入:");
			}

			printf("该你说啦:");
			while (1)
			{
   
				scanf("%s", password);
				if ((strcmp(str_6, password) == 0) || (strcmp(str_67, password) == 0) || (strcmp(str_678, password) == 0))
				{
   
					Sleep(3000);
					if (strcmp(str_6, password) == 0)printf("我:7,8,9\n");
					if (strcmp(str_67, password) == 0)printf("我:8,9\n");
					if (strcmp(str_678, password) == 0)printf("我:9\n");
					break;
				}
				printf("不要耍赖哦!\n");
				printf("请重新输入:");
			}
			printf("该你说啦:");
			while (1)
			{
   
				scanf("%s", password);
				if ((strcmp(str_10, password) == 0) || (strcmp(str_1011, password) == 0) || (strcmp(str_101112, password) == 0))
				{
   
					Sleep(3000);
					if (strcmp(str_10, password) == 0)printf("我:11,12,13\n");
					if (strcmp(str_1011, password) == 0)printf("我:12,13\n");
					if (strcmp(str_101112, password) == 0)printf("我:13\n");
					break;
				}
				printf("不要耍赖哦!\n");
				printf("请重新输入:");

			}

			printf("该你说啦:");
			while (1)
			{
   
				scanf("%s", password);
				if ((strcmp(str_14, password) == 0) || (strcmp(str_1415, password) == 0) || (strcmp(str_141516, password) == 0))
				{
   
					Sleep(3000);
					if (strcmp(str_14, password) == 0)printf("我:15,16,17\n");
					if (strcmp(str_1415, password) == 0)printf("我:16,17\n");
					if (strcmp(str_141516, password) == 0)printf("我:17\n");
					break;
				}
				printf("输入错误!\n");
				printf("请重新输入:");
			}

			printf("该你说啦:");
			while (1)
			{
   
				scanf("%s", password);
				if ((strcmp(str_18, password) == 0) || (strcmp(str_1819, password) == 0) || (strcmp(str_181920, password) == 0))
				{
   
					Sleep(3000);
					if (strcmp(str_18, password) == 0)printf("我:19,20,21\n");
					if (strcmp(str_1819, password) == 0)printf("我:20,21\n");
					if (strcmp(str_181920, password) == 0)printf("我:21\n");
					break;
				}
				printf("输入错误!\n");
				printf("请重新输入:");
			}

			printf("该你说啦:");
			while (1)
			{
   
				scanf("%s", password);
				if ((strcmp(str_22, password) == 0) || (strcmp(str_222324, password) == 0) || (strcmp(str_2223, password) == 0))
				{
   
					Sleep(3000);
					if (strcmp(str_22, password) == 0)printf("我:23,24,25\n");
					if (strcmp(str_2223, password) == 0)printf("我:24,25\n");
					if (strcmp(str_222324, password) == 0)printf("我:25\n");
					break;
				}
				printf("不要耍赖哦!\n");
				printf("请重新输入:");
			}


			printf("该你说啦:");

			while (1)
			{
   
				scanf("%s", password);
				if ((strcmp(str_26, password) == 0) || (strcmp(str_2627, password) == 0) || (strcmp(str_262728, password) == 0))
				{
   
					Sleep(3000);
					if (strcmp(str_26, password) == 0)printf("我:27,28,29\n");
					if (strcmp(str_2627, password) == 0)printf("我:28,29\n");
					if (strcmp(str_262728, password) == 0)printf("我:29\n");
					break;
				}
				printf("输入错误!\n");
				printf("请重新输入:");
			}


			printf("该你说啦:");
			while (1)
			{
   
				scanf("%s", password);
				if ((strcmp(str_30, password) == 0))
				{
   
					Sleep(3000);
					printf("我赢啦!\n");
					break;
				}
				printf("输入错误!\n");
				printf("请重新输入:");
			}


			return 0;
		}

三、用户先数

 用户先数的程序设计和电脑先数的思路差不多,考虑到了用户如果先数,但不小心失去了“胜利的数字”的情况,那么电脑就会抢占“胜利的数字”。“胜利的数字”包括以下数字“1”、“5”、“9”、“13”、“17”、“21”、“25”、“29”。
用户先数代码如下:

else if (strcmp(str_1, password) == 0)
		{
   
			printf("你先说吧:")
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值