明解C语言中级篇练习题第五章

练习5-1-a

#include <time.h>
#include <stdio.h>
#include <stdlib.h>

#define MAX_STAGE	10							/* 关卡数 */
/*--- 等待x毫秒 ---*/
int sleep(unsigned long x)
{
	clock_t c1 = clock(), c2;
	do 
	{
		if ((c2 = clock()) == (clock_t)-1)	/* 错误 */
			return 0;
	} while (1000.0 * (c2 - c1) / CLOCKS_PER_SEC < x);
	return 1;
}

int main(void)
{
	int stage;
	int success = 0;						/* 答对数量 */
	clock_t start, end;						/* 开始时间/结束时间 */
	srand(time(NULL));						/* 设定随机数的种子 */
	printf("来记忆一个4位的数值吧。\n");
	start = clock();
	for (stage = 0; stage < MAX_STAGE; stage++) {
		int x;								/* 已读取的值 */
		int no = rand() % 9000 + 1000;		/* 需要记忆的数值 */
		printf("%d", no);
		fflush(stdout);
		sleep(500);	/* 问题只提示0.5秒 */
		printf("\r请按照相反顺序输入:");
		fflush(stdout);
		scanf("%d", &x);
		no = no / 1000 + (no % 1000) / 100 * 10 + (no % 100) / 10 * 100 + (no % 10) * 1000;
		if (x != no)
			printf("\a回答错误。\n");
		else {
			printf("回答正确。\n");
			success++;
		}
	}
	end = clock();
	printf("%d次中答对了%d次。\n", MAX_STAGE, success);
	printf("用时%.1f秒。\n", (double)(end - start) / CLOCKS_PER_SEC);
	return 0;
}
练习5-1-b
#include <time.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAX_STAGE	10					/* 关卡数 */
#define LEVEL_MIN	 3					/* 最低等级(位数)*/
#define LEVEL_MAX	20					/* 最高等级(位数)*/

/*--- 等待x毫秒 ---*/
int sleep(unsigned long x)
{
	clock_t c1 = clock(), c2;

	do {
		if ((c2 = clock()) == (clock_t)-1)	/* 错误 */
			return 0;
	} while (1000.0 * (c2 - c1) / CLOCKS_PER_SEC < x);
	return 1;
}

int main(void)
{
	int i, stage;
	int level;				/* 等级(数值的位数)*/
	int success = 0;		/* 答对数量 */
	clock_t start, end;		/* 开始时间/结束时间 */
	int tmp;
	srand(time(NULL));		/* 设定随机数的种子 */

	printf("数值记忆训练\n");

	do {
		printf("要挑战的等级(%d~%d):", LEVEL_MIN, LEVEL_MAX);
		scanf("%d", &level);
	} while (level < LEVEL_MIN || level > LEVEL_MAX);

	printf("来记忆一个%d位的数值吧。\n", level);

	start = clock();
	for (stage = 0; stage < MAX_STAGE; stage++) {
		char no[LEVEL_MAX + 1];				/* 需要记忆的数字串 */
		char x[LEVEL_MAX * 2];				/* 已读取的数字串 */

		no[0] = '1' + rand() % 9;			/* 开头字符是'1'~'9' */
		for (i = 1; i < level; i++)
			no[i] = '0' + rand() % 10;		/* 之后是'0'~'9' */
		no[level] = '\0';

		printf("%s", no);
		fflush(stdout);
		sleep(125 * level);					/* 问题只提示125 × level毫秒 */

		printf("\r%*s\r请输入:", level, "");
		scanf("%s", x);
		//no[level]反向
		for (i = 0; i < level / 2; i++)
		{
			tmp = no[i];
			no[i] = no[level - i - 1];
			no[level - i - 1] = tmp;
		}
		if (strcmp(no, x) != 0)
			printf("\a回答错误。\n");
		else {
			printf("回答正确。\n");
			success++;
		}
	}
	end = clock();

	printf("%d次中答对了%d次。\n", MAX_STAGE, success);
	printf("用时%.1f秒。\n", (double)(end - start) / CLOCKS_PER_SEC);

	return 0;
}
练习5-2-a
#include <time.h>
#include <stdio.h>
#include <stdlib.h>

#define MAX_STAGE	10							/* 关卡数 */

/*--- 等待x毫秒 ---*/
int sleep(unsigned long x)
{
	clock_t c1 = clock(), c2;

	do {
		if ((c2 = clock()) == (clock_t)-1)	/* 错误 */
			return 0;
	} while (1000.0 * (c2 - c1) / CLOCKS_PER_SEC < x);
	return 1;
}

int main(void)
{
	int digit;
	int stage;
	int success = 0;						/* 答对数量 */
	clock_t start, end;						/* 开始时间/结束时间 */

	srand(time(NULL));						/* 设定随机数的种子 */

	printf("来记忆一个4位的数值吧。\n");

	start = clock();
	for (stage = 0; stage < MAX_STAGE; stage++) {
		int x;								/* 已读取的值 */
		int no = rand() % 9000 + 1000;		/* 需要记忆的数值 */

		printf("%d", no);
		fflush(stdout);
		sleep(500);	/* 问题只提示0.5秒 */

		printf("\r%*s\r", 4, "");
		digit = rand() % 4 + 1;
		printf("\r从左往右数第%d位的数字是什么:", digit);
		//printf("\r请输入:");
		fflush(stdout);
		scanf("%d", &x);
		//第 digit 位数
		switch (digit)
		{
			case 1: no /= 1000; break;
			case 2: no = (no % 1000) / 100; break;
			case 3: no = (no % 100) / 10; break;
			case 4: no = no % 10; break;
		}
		if (x != no)
			printf("\a回答错误。\n");
		else {
			printf("回答正确。\n");
			success++;
		}
	}
	end = clock();

	printf("%d次中答对了%d次。\n", MAX_STAGE, success);
	printf("用时%.1f秒。\n", (double)(end - start) / CLOCKS_PER_SEC);

	return 0;
}
练习5-2-b
/* 单纯记忆训练(记忆数值:设定成“等级=位数”)*/

#include <time.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAX_STAGE	10					/* 关卡数 */
#define LEVEL_MIN	 3					/* 最低等级(位数)*/
#define LEVEL_MAX	20					/* 最高等级(位数)*/

/*--- 等待x毫秒 ---*/
int sleep(unsigned long x)
{
	clock_t c1 = clock(), c2;

	do {
		if ((c2 = clock()) == (clock_t)-1)	/* 错误 */
			return 0;
	} while (1000.0 * (c2 - c1) / CLOCKS_PER_SEC < x);
	return 1;
}

int main(void)
{
	int digit;
	int i, stage;
	int level;				/* 等级(数值的位数)*/
	int success = 0;		/* 答对数量 */
	clock_t start, end;		/* 开始时间/结束时间 */

	srand(time(NULL));		/* 设定随机数的种子 */

	printf("数值记忆训练\n");

	do {
		printf("要挑战的等级(%d~%d):", LEVEL_MIN, LEVEL_MAX);
		scanf("%d", &level);
	} while (level < LEVEL_MIN || level > LEVEL_MAX);

	printf("来记忆一个%d位的数值吧。\n", level);

	start = clock();
	for (stage = 0; stage < MAX_STAGE; stage++) {
		char no[LEVEL_MAX + 1];				/* 需要记忆的数字串 */
		char x[LEVEL_MAX * 2];				/* 已读取的数字串 */

		no[0] = '1' + rand() % 9;			/* 开头字符是'1'~'9' */
		for (i = 1; i < level; i++)
			no[i] = '0' + rand() % 10;		/* 之后是'0'~'9' */
		no[level] = '\0';

		printf("%s", no);
		fflush(stdout);
		sleep(125 * level);					/* 问题只提示125 × level毫秒 */

		digit = rand() % level + 1;
		printf("\r%*s",level,"");
		printf("\r从左往右数第%d位的数字是什么:", digit);
		//printf("\r%*s\r请输入:", level, "");
		scanf("%s", x);
		//if (strcmp(no[digit-1], x) != 0)
		if(no[digit - 1] != x[0])
			printf("\a回答错误。\n");
		else {
			printf("回答正确。\n");
			success++;
		}
	}
	end = clock();

	printf("%d次中答对了%d次。\n", MAX_STAGE, success);
	printf("用时%.1f秒。\n", (double)(end - start) / CLOCKS_PER_SEC);

	return 0;
}
练习5-3
#include <time.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAX_STAGE	10				/* 关卡数 */
#define LEVEL_MIN	 3				/* 最低等级(字母个数)*/
#define LEVEL_MAX	20				/* 最高等级(字母个数)*/

/*--- 等待x毫秒 ---*/
int sleep(unsigned long x)
{
	clock_t c1 = clock(), c2;

	do {
		if ((c2 = clock()) == (clock_t)-1)	/* 错误 */
			return 0;
	} while (1000.0 * (c2 - c1) / CLOCKS_PER_SEC < x);
	return 1;
}

int main(void)
{
	char tmp;
	int i, stage;
	int level;						/* 等级(数值的位数)*/
	int success = 0;				/* 答对数量 */
	clock_t start, end;					/* 开始时间/结束时间 */
	const char ltr[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"		/* 大写英文字母 */
		"abcdefghijklmnopqrstuvwxyz";	/* 小写英文字母 */

	srand(time(NULL));					/* 设定随机数的种子 */

	printf("英文字母记忆训练\n");

	do {
		printf("要挑战的等级(%d~%d):", LEVEL_MIN, LEVEL_MAX);
		scanf("%d", &level);
	} while (level < LEVEL_MIN || level > LEVEL_MAX);

	printf("来记忆%d个英文字母吧。\n", level);

	start = clock();
	for (stage = 0; stage < MAX_STAGE; stage++) {
		char mstr[LEVEL_MAX + 1];			/* 需要记忆的一串英文字母 */
		char x[LEVEL_MAX * 2];				/* 读取到的一串英文字母 */

		for (i = 0; i < level; i++)			/* 生成作为题目的字符串 */
			mstr[i] = ltr[rand() % strlen(ltr)];
		mstr[level] = '\0';

		printf("%s", mstr);
		fflush(stdout);
		sleep(125 * level);					/* 问题提示125 × level毫秒 */

		printf("\r%*s\r请输入:", level, "");
		fflush(stdout);
		scanf("%s", x);

		//颠倒mstr[level]
		for (i = 0; i < level / 2; i++)
		{
			tmp = mstr[i];
			mstr[i] = mstr[level - i - 1];
			mstr[level - i - 1] = tmp;
		}

		if (strcmp(x, mstr) != 0)
			printf("\a回答错误。\n");
		else {
			printf("回答正确。\n");
			success++;
		}
	}
	end = clock();

	printf("%d次中答对了%d次。\n", MAX_STAGE, success);
	printf("用时%.1f秒。\n", (double)(end - start) / CLOCKS_PER_SEC);

	return 0;
}

练习5-4

#include <time.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAX_STAGE	10				/* 关卡数 */
#define LEVEL_MIN	 3				/* 最低等级(字母个数)*/
#define LEVEL_MAX	20				/* 最高等级(字母个数)*/

/*--- 等待x毫秒 ---*/
int sleep(unsigned long x)
{
	clock_t c1 = clock(), c2;

	do {
		if ((c2 = clock()) == (clock_t)-1)	/* 错误 */
			return 0;
	} while (1000.0 * (c2 - c1) / CLOCKS_PER_SEC < x);
	return 1;
}

int main(void)
{
	int digit;
	int i, stage;
	int level;						/* 等级(数值的位数)*/
	int success = 0;				/* 答对数量 */
	clock_t start, end;					/* 开始时间/结束时间 */
	const char ltr[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"		/* 大写英文字母 */
		"abcdefghijklmnopqrstuvwxyz";	/* 小写英文字母 */

	srand(time(NULL));					/* 设定随机数的种子 */

	printf("英文字母记忆训练\n");

	do {
		printf("要挑战的等级(%d~%d):", LEVEL_MIN, LEVEL_MAX);
		scanf("%d", &level);
	} while (level < LEVEL_MIN || level > LEVEL_MAX);

	printf("来记忆%d个英文字母吧。\n", level);

	start = clock();
	for (stage = 0; stage < MAX_STAGE; stage++) {
		char mstr[LEVEL_MAX + 1];			/* 需要记忆的一串英文字母 */
		char x[LEVEL_MAX * 2];				/* 读取到的一串英文字母 */

		for (i = 0; i < level; i++)			/* 生成作为题目的字符串 */
			mstr[i] = ltr[rand() % strlen(ltr)];
		mstr[level] = '\0';

		printf("%s", mstr);
		fflush(stdout);
		sleep(125 * level);					/* 问题提示125 × level毫秒 */

		printf("\r%*s\r", level, "");
		digit = rand() % level + 1;
		printf("从左往右数第%d个字母是:",digit);
		//printf("\r%*s\r请输入:", level, "");
		fflush(stdout);
		scanf("%s", x);
		
		//if (strcmp(x, mstr) != 0)
		if (mstr[digit - 1] != x[0])
			printf("\a回答错误。\n");
		else {
			printf("回答正确。\n");
			success++;
		}
	}
	end = clock();

	printf("%d次中答对了%d次。\n", MAX_STAGE, success);
	printf("用时%.1f秒。\n", (double)(end - start) / CLOCKS_PER_SEC);

	return 0;
}
练习5-5
/* 单纯记忆训练(记忆英文字母·其一:只记忆大写字母)*/

#include <time.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAX_STAGE	10				/* 关卡数 */
#define LEVEL_MIN	 3				/* 最低等级(字母个数)*/
#define LEVEL_MAX	20				/* 最高等级(字母个数)*/

/*--- 等待x毫秒 ---*/
int sleep(unsigned long x)
{
	clock_t c1 = clock(), c2;

	do {
		if ((c2 = clock()) == (clock_t)-1)	/* 错误 */
			return 0;
	} while (1000.0 * (c2 - c1) / CLOCKS_PER_SEC < x);
	return 1;
}

int main(void)
{
	char alpha;
	char tmp;
	int i, j,stage;
	int level;						/* 等级(数值的位数)*/
	int success = 0;				/* 答对数量 */
	clock_t start, end;				/* 开始时间/结束时间 */
	const char ltr[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";	/* 大写的英文字母 */

	srand(time(NULL));				/* 设定随机数的种子 */

	printf("英文字母记忆训练\n");

	do {
		printf("要挑战的等级(%d~%d):", LEVEL_MIN, LEVEL_MAX);
		scanf("%d", &level);
	} while (level < LEVEL_MIN || level > LEVEL_MAX);

	printf("来记忆%d个英文字母吧。\n", level);

	start = clock();
	for (stage = 0; stage < MAX_STAGE; stage++) 
	{
		char mstr[LEVEL_MAX + 1];			/* 需要记忆的一串英文字母 */
		//char x[LEVEL_MAX * 2];				/* 读取到的一串英文字母 */
		int x;
		//for (i = 0; i < level; i++)			/* 生成作为题目的字符串 */
		//	mstr[i] = ltr[rand() % strlen(ltr)];
		//mstr[level] = '\0';
		
		//生成不能重复的字符串 参考list4-1代码
		for (i = 0; i < level; i++)
		{
			do 
			{
				tmp = ltr[rand() % strlen(ltr)];
				for (j = 0; j < i; j++)
				{
					if (tmp == mstr[j])
						break;
				}
			} while (j < i);
			mstr[i] = tmp;
		}
		mstr[level] = '\0';

		printf("%s", mstr);
		fflush(stdout);
		sleep(125 * level);					/* 问题提示125 × level毫秒 */

		printf("\r%*s\r", level, "");
		alpha = mstr[rand() % level];
		printf("%c是第几个字母?", alpha);
		printf("\r\n%*s\r请输入:", level, "");
		fflush(stdout);
		scanf("%d", &x);

		//if (strcmp(x, mstr) != 0)
		if(mstr[x-1]!=alpha)
			printf("\a回答错误。\n");
		else {
			printf("回答正确。\n");
			success++;
		}
	}
	end = clock();

	printf("%d次中答对了%d次。\n", MAX_STAGE, success);
	printf("用时%.1f秒。\n", (double)(end - start) / CLOCKS_PER_SEC);

	return 0;
}
练习5-6
/* 加一训练(其五:记忆多个数值并输入这些数值加1后的值)*/

#include <time.h>
#include <stdio.h>
#include <stdlib.h>

#define LEVEL_MIN	2				/* 最低等级(数值的个数)*/
#define LEVEL_MAX	6				/* 最高等级(数值的个数)*/

/*--- 等待x毫秒 ---*/
int sleep(unsigned long x)
{
	clock_t c1 = clock(), c2;

	do {
		if ((c2 = clock()) == (clock_t)-1)	/* 错误 */
			return 0;
	} while (1000.0 * (c2 - c1) / CLOCKS_PER_SEC < x);
	return 1;
}

int main(void)
{
	int i, stage;
	int max_stage;					/* 关卡数 */
	int level;						/* 等级 */
	int success;					/* 答对数量 */
	int *score;						/* 所有关卡的答对数量 */
	clock_t	start, end;					/* 开始时间/结束时间 */

	srand(time(NULL));					/* 设定随机数的种子 */

	printf("加一训练开始!!\n");
	printf("记忆2位的数值。\n");
	printf("请输入原数值加1后的值。\n");

	do {
		printf("要挑战的等级(%d~%d):", LEVEL_MIN, LEVEL_MAX);
		scanf("%d", &level);
	} while (level < LEVEL_MIN || level > LEVEL_MAX);

	do {
		printf("训练次数:");
		scanf("%d", &max_stage);
	} while (max_stage <= 0);

	score = calloc(max_stage, sizeof(int));

	success = 0;
	start = clock();
	for (stage = 0; stage < max_stage; stage++) {
		int no[LEVEL_MAX];					/* 要记忆的数值 */
		int x[LEVEL_MAX];					/* 已读取的值 */
		int seikai = 0;						/* 本关卡的答对数量 */

		printf("\n第%d关卡开始!!\n", stage + 1);

		for (i = 0; i < level; i++) {		/* 仅level个 */
			no[i] = rand() % 90 + 10;		/* 生成10 ~ 99的随机数 */
			printf("%d ", no[i]);			/* 显示 */
		}
		fflush(stdout);
		sleep(300 * level);					/* 等待0.30 × level秒 */
		printf("\r%*s\r", 3 * level, "");	/* 消除题目 */
		fflush(stdout);

		//for (i = 0; i < level; i++) /* 读取答案 */
		//{		
		//	printf("第%d个数:", i + 1);
		//	scanf("%d", &x[i]);
		//}

	/*	for (i = 0; i < level; i++)
		{
			printf("第%d个数:", i + 1);
			scanf("%d", &x[i]);
			if (x[i] == -1)
				i--;			
		}*/
		i = 0;
		while (i < level)
		{
			printf("第%d个数:", i + 1);
			scanf("%d", &x[i]);
			if (x[i] == -1)
				if (i != 0)
					i -= 2;
				else
					i--;
			i++;
		}

		for (i = 0; i < level; i++) {		/* 判断对错并显示 */
			if (x[i] != no[i] + 1)
				printf("× ");
			else {
				printf("○ ");
				seikai++;
			}
		}
		putchar('\n');

		for (i = 0; i < level; i++)			/* 显示正确答案 */
			printf("%2d ", no[i]);

		printf(" ··· 答对了%d个。\n", seikai);
		score[stage] = seikai;				/* 记录关卡的答对数量 */
		success += seikai;					/* 更新整体的答对数量 */
	}
	end = clock();

	printf("%d个中答对了%d个。\n", level * max_stage, success);

	for (stage = 0; stage < max_stage; stage++)
		printf("第%2d关卡:%d\n", stage + 1, score[stage]);

	printf("用时%.1f秒。\n", (double)(end - start) / CLOCKS_PER_SEC);

	free(score);

	return 0;
}
练习5-7
/* 加一训练(其五:记忆多个数值并输入这些数值加1后的值)*/

#include <time.h>
#include <stdio.h>
#include <stdlib.h>

#define LEVEL_MIN	2				/* 最低等级(数值的个数)*/
#define LEVEL_MAX	6				/* 最高等级(数值的个数)*/

/*--- 等待x毫秒 ---*/
int sleep(unsigned long x)
{
	clock_t c1 = clock(), c2;

	do {
		if ((c2 = clock()) == (clock_t)-1)	/* 错误 */
			return 0;
	} while (1000.0 * (c2 - c1) / CLOCKS_PER_SEC < x);
	return 1;
}

int main(void)
{
	int i, stage;
	int max_stage;					/* 关卡数 */
	int level;						/* 等级 */
	int success;					/* 答对数量 */
	int *score;						/* 所有关卡的答对数量 */
	clock_t	start, end;					/* 开始时间/结束时间 */

	srand(time(NULL));					/* 设定随机数的种子 */

	printf("加一训练开始!!\n");
	printf("记忆2位的数值。\n");
	printf("请输入原数值加1后的值。\n");

	do {
		printf("要挑战的等级(%d~%d):", LEVEL_MIN, LEVEL_MAX);
		scanf("%d", &level);
	} while (level < LEVEL_MIN || level > LEVEL_MAX);

	do {
		printf("训练次数:");
		scanf("%d", &max_stage);
	} while (max_stage <= 0);

	score = calloc(max_stage, sizeof(int));

	success = 0;
	start = clock();
	for (stage = 0; stage < max_stage; stage++) {
		int no[LEVEL_MAX];					/* 要记忆的数值 */
		int x[LEVEL_MAX];					/* 已读取的值 */
		int seikai = 0;						/* 本关卡的答对数量 */

		printf("\n第%d关卡开始!!\n", stage + 1);

		for (i = 0; i < level; i++) {		/* 仅level个 */
			no[i] = rand() % 90 + 10;		/* 生成10 ~ 99的随机数 */
			printf("%d ", no[i]);			/* 显示 */
		}
		fflush(stdout);
		sleep(300 * level);					/* 等待0.30 × level秒 */
		printf("\r%*s\r", 3 * level, "");	/* 消除题目 */
		fflush(stdout);

		//for (i = 0; i < level; i++) /* 读取答案 */
		//{		
		//	printf("第%d个数:", i + 1);
		//	scanf("%d", &x[i]);
		//}

	/*	for (i = 0; i < level; i++)
		{
			printf("第%d个数:", i + 1);
			scanf("%d", &x[i]);
			if (x[i] == -1)
				i--;			
		}*/
		i = 0;
		while (i < level)
		{
			printf("第%d个数:", i + 1);
			scanf("%d", &x[i]);
			if (x[i] == -1)
				if (i != 0)
					i -= 2;
				else
					i--;
			i++;
		}

		for (i = 0; i < level; i++) {		/* 判断对错并显示 */
			if (x[i] != no[i] - 1)
				printf("× ");
			else {
				printf("○ ");
				seikai++;
			}
		}
		putchar('\n');

		for (i = 0; i < level; i++)			/* 显示正确答案 */
			printf("%2d ", no[i]);

		printf(" ··· 答对了%d个。\n", seikai);
		score[stage] = seikai;				/* 记录关卡的答对数量 */
		success += seikai;					/* 更新整体的答对数量 */
	}
	end = clock();

	printf("%d个中答对了%d个。\n", level * max_stage, success);

	for (stage = 0; stage < max_stage; stage++)
		printf("第%2d关卡:%d\n", stage + 1, score[stage]);

	printf("用时%.1f秒。\n", (double)(end - start) / CLOCKS_PER_SEC);

	free(score);

	return 0;
}
练习5-8-a
#include <time.h>
#include <stdio.h>
#include <stdlib.h>

#define MAX_RECORD 10
int human;		/* 玩家的手势 */
int comp;		/* 计算机的手势 */
int win_no;		/* 胜利次数 */
int lose_no;	/* 失败次数 */
int draw_no;	/* 平局次数 */


char *hd[] = { "石头", "剪刀", "布" };		/* 手势 */

										/*--- 初始处理 ---*/
void initialize(void)
{
	win_no = 0;		/* 胜利次数 */
	lose_no = 0;		/* 失败次数 */
	draw_no = 0;		/* 平局次数 */

	srand(time(NULL));	/* 设定随机数种子 */

	printf("猜拳游戏开始!!\n");
}

/*--- 运行猜拳游戏(读取/生成手势)---*/
void jyanken(void)
{
	int i;

	comp = rand() % 3;		/* 用随机数生成计算机的手势(0~2)*/

	do {
		printf("\n\a石头剪刀布 ···");
		for (i = 0; i < 3; i++)
			printf(" (%d)%s", i, hd[i]);
		printf(":");
		scanf("%d", &human);		/* 读取玩家的手势 */
	} while (human < 0 || human > 2);
}

/*--- 更新胜利/失败/平局次数 ---*/
void count_no(int result)
{
	switch (result) {
	case 0: draw_no++;	 break;						/* 平局 */
	case 1: lose_no++;	 break;						/* 失败 */
	case 2: win_no++;   break;						/* 胜利 */
	}
}

/*--- 显示判断结果 ---*/
void disp_result(int result)
{
	switch (result) {
	case 0: puts("平局。");	 break;	 /* 平局 */
	case 1: puts("你输了。");   break;	 /* 失败 */
	case 2: puts("你赢了。");   break;	 /* 胜利 */
	}
}

/*--- 确认是否再次挑战 ---*/
int confirm_retry(void)
{
	int x;

	printf("再来一次吗···(0)否 (1)是:");
	scanf("%d", &x);

	return x;
}

int main(void)
{
	char result[][20] = {"平","负","胜"};
	int i = 0;
	int cnt = 0;
	int success;//胜利次数
	int gameinfo[MAX_RECORD];//最近10场战况
	int judge;				/* 胜负 */
	int retry;				/* 再来一次?*/

	initialize();						/* 初始处理 */
	success = 0;
	do {
		jyanken();						/* 运行猜拳游戏 */

										/* 显示计算机和玩家的手势 */
		printf("我出%s,你出%s。\n", hd[comp], hd[human]);

		judge = (human - comp + 3) % 3;	/* 判断胜负 */

		if (judge == 2)
			success++;
		gameinfo[cnt++ % MAX_RECORD] = judge;
		//i++;

		count_no(judge);				/* 更新胜利/失败/平局次数 */

		disp_result(judge);				/* 显示判断结果 */

		retry = confirm_retry();		/* 确认是否再次挑战 */

	} while (retry == 1);
	i = cnt - MAX_RECORD;
	if (i < 0)i = 0;
	printf("-------------------------------------------");
	printf("最近10次战况\n");
	for (; i < cnt; i++)
	{
		//printf("第%2d次战况:%d",i+1,gameinfo[i%MAX_RECORD]);
		judge = gameinfo[i%MAX_RECORD];
		printf("第%2d次战况:%s\n", i + 1, result[judge]);
	}
	printf("总共%d胜%d负%d平。\n", win_no, lose_no, draw_no);

	return 0;
}
练习5-8-b
#include <time.h>
#include <stdio.h>
#include <stdlib.h>

//#define MAX_RECORD 10
int human;		/* 玩家的手势 */
int comp;		/* 计算机的手势 */
int win_no;		/* 胜利次数 */
int lose_no;	/* 失败次数 */
int draw_no;	/* 平局次数 */


char *hd[] = { "石头", "剪刀", "布" };		/* 手势 */

										/*--- 初始处理 ---*/
void initialize(void)
{
	win_no = 0;		/* 胜利次数 */
	lose_no = 0;		/* 失败次数 */
	draw_no = 0;		/* 平局次数 */

	srand(time(NULL));	/* 设定随机数种子 */

	printf("猜拳游戏开始!!\n");
}

/*--- 运行猜拳游戏(读取/生成手势)---*/
void jyanken(void)
{
	int i;

	comp = rand() % 3;		/* 用随机数生成计算机的手势(0~2)*/

	do {
		printf("\n\a石头剪刀布 ···");
		for (i = 0; i < 3; i++)
			printf(" (%d)%s", i, hd[i]);
		printf(":");
		scanf("%d", &human);		/* 读取玩家的手势 */
	} while (human < 0 || human > 2);
}

/*--- 更新胜利/失败/平局次数 ---*/
void count_no(int result)
{
	switch (result) {
	case 0: draw_no++;	 break;						/* 平局 */
	case 1: lose_no++;	 break;						/* 失败 */
	case 2: win_no++;   break;						/* 胜利 */
	}
}

/*--- 显示判断结果 ---*/
void disp_result(int result)
{
	switch (result) {
	case 0: puts("平局。");	 break;	 /* 平局 */
	case 1: puts("你输了。");   break;	 /* 失败 */
	case 2: puts("你赢了。");   break;	 /* 胜利 */
	}
}

/*--- 确认是否再次挑战 ---*/
int confirm_retry(void)
{
	int x;

	printf("再来一次吗···(0)否 (1)是:");
	scanf("%d", &x);

	return x;
}

int main(void)
{
	int max_record;
	char result[][20] = {"平","负","胜"};
	int i = 0;
	int cnt = 0;
	int success;//胜利次数
	int *gameinfo;//最近战况
	int judge;				/* 胜负 */
	int retry;				/* 再来一次?*/

	initialize();						/* 初始处理 */
	printf("保存多少次记录?\n");
	scanf("%d",&max_record);
	gameinfo = calloc(max_record,sizeof(int));
	success = 0;
	do {
		jyanken();						/* 运行猜拳游戏 */

										/* 显示计算机和玩家的手势 */
		printf("我出%s,你出%s。\n", hd[comp], hd[human]);

		judge = (human - comp + 3) % 3;	/* 判断胜负 */

		if (judge == 2)
			success++;
		gameinfo[cnt++] = judge;
		//i++;

		count_no(judge);				/* 更新胜利/失败/平局次数 */

		disp_result(judge);				/* 显示判断结果 */

		retry = confirm_retry();		/* 确认是否再次挑战 */

	} while (retry == 1);
	i = cnt - max_record;
	if (i < 0)i = 0;
	printf("-------------------------------------------");
	printf("最近%d次战况\n",max_record);
	for (; i < cnt; i++)
	{
		//printf("第%2d次战况:%d",i+1,gameinfo[i%MAX_RECORD]);
		judge = gameinfo[i%max_record];
		printf("第%2d次战况:%s\n", i + 1, result[judge]);
	}
	printf("总共%d胜%d负%d平。\n", win_no, lose_no, draw_no);

	return 0;
}


猜你喜欢

转载自blog.csdn.net/wofreeo/article/details/80779426
今日推荐