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

练习3-1

#include <time.h>
#include <stdio.h>
#include <stdlib.h>
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;	 /* 胜利 */
//	}
//}
void count_no_disp_result(int result)
{
	switch (result) 
	{
		case 0: draw_no++; puts("平局。");	 break;						/* 平局 */
		case 1: lose_no++; puts("你输了。"); break;						/* 失败 */
		case 2: win_no++;  puts("你赢了。");  break;						/* 胜利 */
	}
	return;
}
/*--- 确认是否再次挑战 ---*/
int confirm_retry(void)
{
	int x;
	printf("再来一次吗···(0)否 (1)是:");
	scanf("%d", &x);
	return x;
}
int main(void)
{
	int judge;				/* 胜负 */
	int retry;				/* 再来一次?*/
	initialize();						/* 初始处理 */
	do 
	{
		jyanken();						/* 运行猜拳游戏 */								
		printf("我出%s,你出%s。\n", hd[comp], hd[human]);/* 显示计算机和玩家的手势 */
		judge = (human - comp + 3) % 3;	/* 判断胜负 */
		//count_no(judge);				/* 更新胜利/失败/平局次数 */
		//disp_result(judge);				/* 显示判断结果 */
		count_no_disp_result(judge);//count_no和disp_result整合成一个函数
		retry = confirm_retry();		/* 确认是否再次挑战 */
	} while (retry == 1);
	printf("%d胜%d负%d平。\n", win_no, lose_no, draw_no);
	return 0;
}
练习3-2
#include <time.h>
#include <stdio.h>
#include <stdlib.h>
int human;		/* 玩家的手势 */
int comp;		/* 计算机的手势 */
int win_no;		/* 胜利次数 */
int lose_no;	/* 失败次数 */
int draw_no;	/* 平局次数 */
char *hd[] = { "石头", "剪刀", "布" };		/* 手势 */
int gamenumber;/*游戏次数*/
/*--- 初始处理 ---*/
void initialize(void)
{
	win_no = 0;		/* 胜利次数 */
	lose_no = 0;		/* 失败次数 */
	draw_no = 0;		/* 平局次数 */
	srand(time(NULL));	/* 设定随机数种子 */
	printf("猜拳游戏开始!!\n");
	printf("要猜赢几次?");
	scanf("%d",&gamenumber);
}
/*--- 运行猜拳游戏(读取/生成手势) ---*/
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 main(void)
{
	int judge;				/* 胜负 */
	initialize();						/* 初始处理 */
	do {
		jyanken();						/* 运行猜拳游戏 */							
		printf("我出%s,你出%s。\n", hd[comp], hd[human]);/* 显示计算机和玩家的手势 */
		judge = (human - comp + 3) % 3;	/* 判断胜负 */
		count_no(judge);				/* 更新胜利/失败/平局次数 */
		disp_result(judge);				/* 显示判断结果 */
	} while (win_no < gamenumber && lose_no < gamenumber);
	printf(win_no == 3 ? "\n□你赢了。\n" : "\n■我赢了。\n");
	printf("%d胜%d负%d平。\n", win_no, lose_no, draw_no);
	return 0;
}
练习3-3
#include <time.h>
#include <stdio.h>
#include <stdlib.h>
int human;		/* 玩家的手势 */
int comp;		/* 计算机的手势 */
int win_no;		/* 胜利次数 */
int lose_no;	/* 失败次数 */
int draw_no;	/* 平局次数 */
char *hd[] = { "石头", "剪刀", "布" };		/* 手势 */
int gamenumber;/*游戏次数*/
/*--- 初始处理 ---*/
void initialize(void)
{
	win_no = 0;		/* 胜利次数 */
	lose_no = 0;		/* 失败次数 */
	draw_no = 0;		/* 平局次数 */
	srand(time(NULL));	/* 设定随机数种子 */
	printf("猜拳游戏开始!!\n");
	printf("要猜赢几次?");
	scanf("%d",&gamenumber);
}
/*--- 运行猜拳游戏(读取/生成手势) ---*/
void jyanken(void)
{
	int i;
	do 
	{
		comp = rand() % 3;		/* 用随机数生成计算机的手势(0~2)*/
	} while (comp==1);//当生成剪刀时继续生成。。直至生成石头或布
	
	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 main(void)
{
	int judge;				/* 胜负 */
	initialize();						/* 初始处理 */
	do {
		jyanken();						/* 运行猜拳游戏 */							
		printf("我出%s,你出%s。\n", hd[comp], hd[human]);/* 显示计算机和玩家的手势 */
		judge = (human - comp + 3) % 3;	/* 判断胜负 */
		count_no(judge);				/* 更新胜利/失败/平局次数 */
		disp_result(judge);				/* 显示判断结果 */
	} while (win_no < gamenumber && lose_no < gamenumber);
	printf(win_no == 3 ? "\n□你赢了。\n" : "\n■我赢了。\n");
	printf("%d胜%d负%d平。\n", win_no, lose_no, draw_no);
	return 0;
}
练习3-4
#include <time.h>
#include <stdio.h>
#include <stdlib.h>
int human;		/* 玩家的手势 */
int comp;		/* 计算机的手势 */
int win_no;		/* 胜利次数 */
int lose_no;	/* 失败次数 */
int draw_no;	/* 平局次数 */
char *hd[] = { "石头", "剪刀", "布" };		/* 手势 */
int gamenumber;/*游戏次数*/
static int currentgamenumber;/*目前第几次,自动初始化为0*/
/*--- 初始处理 ---*/
void initialize(void)
{
	win_no = 0;		/* 胜利次数 */
	lose_no = 0;		/* 失败次数 */
	draw_no = 0;		/* 平局次数 */
	srand(time(NULL));	/* 设定随机数种子 */
	printf("猜拳游戏开始!!\n");
	printf("要猜赢几次?");
	scanf("%d",&gamenumber);
}
/*--- 运行猜拳游戏(读取/生成手势) ---*/
void jyanken(void)
{
	int i;
	if (currentgamenumber == 0)
		comp = 0;//强行让计算机第一次出石头
	else
		comp = rand() % 3;		/* 用随机数生成计算机的手势(0~2)*/
	currentgamenumber++;
	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 main(void)
{
	int judge;				/* 胜负 */
	initialize();						/* 初始处理 */
	do {
		jyanken();						/* 运行猜拳游戏 */							
		printf("我出%s,你出%s。\n", hd[comp], hd[human]);/* 显示计算机和玩家的手势 */
		judge = (human - comp + 3) % 3;	/* 判断胜负 */
		count_no(judge);				/* 更新胜利/失败/平局次数 */
		disp_result(judge);				/* 显示判断结果 */
	} while (win_no < gamenumber && lose_no < gamenumber);
	printf(win_no == 3 ? "\n□你赢了。\n" : "\n■我赢了。\n");
	printf("%d胜%d负%d平。\n", win_no, lose_no, draw_no);
	return 0;
}
练习3-5
#include <time.h>
#include <stdio.h>
#include <stdlib.h>
int human;		/* 玩家的手势 */
int comp;		/* 计算机的手势 */
int win_no;		/* 胜利次数 */
int lose_no;	/* 失败次数 */
int draw_no;	/* 平局次数 */
char *hd[] = { "石头", "剪刀", "布" };		/* 手势 */
int gamenumber;/*游戏次数*/
static int currentgamenumber;/*目前第几次,自动初始化为0*/
/*--- 初始处理 ---*/
void initialize(void)
{
	win_no = 0;		/* 胜利次数 */
	lose_no = 0;		/* 失败次数 */
	draw_no = 0;		/* 平局次数 */
	srand(time(NULL));	/* 设定随机数种子 */
	printf("猜拳游戏开始!!\n");
	printf("要猜赢几次?(一直猜请输入-1):");
	scanf("%d",&gamenumber);

}
/*--- 运行猜拳游戏(读取/生成手势) ---*/
void jyanken(void)
{
	int i;
	if (currentgamenumber %5 != 0)
		comp = rand() % 3;		/* 用随机数生成计算机的手势(0~2)*/
	currentgamenumber++;
	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);
	if(currentgamenumber % 5 == 0)
		comp = (human + 2) % 3;//计算机每5次后出
}
/*--- 更新胜利/失败/平局次数 ---*/
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 main(void)
{
	int judge;				/* 胜负 */
	initialize();						/* 初始处理 */
	if (gamenumber == -1)
	{
		printf("一直猜\n");
		while(1)
		{
			jyanken();						/* 运行猜拳游戏 */
			printf("我出%s,你出%s。\n", hd[comp], hd[human]);/* 显示计算机和玩家的手势 */
			judge = (human - comp + 3) % 3;	/* 判断胜负 */
			count_no(judge);				/* 更新胜利/失败/平局次数 */
			disp_result(judge);				/* 显示判断结果 */
		} 
	}
	else
	{ 
		printf("猜%d次\n",gamenumber);
		do 
		{
			jyanken();						/* 运行猜拳游戏 */							
			printf("我出%s,你出%s。\n", hd[comp], hd[human]);/* 显示计算机和玩家的手势 */
			judge = (human - comp + 3) % 3;	/* 判断胜负 */
			count_no(judge);				/* 更新胜利/失败/平局次数 */
			disp_result(judge);				/* 显示判断结果 */
		} while (win_no < gamenumber && lose_no < gamenumber);
	}
	printf(win_no == 3 ? "\n□你赢了。\n" : "\n■我赢了。\n");
	printf("%d胜%d负%d平。\n", win_no, lose_no, draw_no);
	return 0;
}

练习3-6 待做 学过第五章之后做


练习3-7

#include <time.h>
#include <stdio.h>
#include <stdlib.h>
int human;		/* 玩家的手势 */
int comp1;		/* 计算机1的手势 */
int comp2;
int win_no;		/* 胜利次数 */
int lose_no;	/* 失败次数 */
int draw_no;	/* 平局次数 */
char *hd[] = { "石头", "剪刀", "布" };		/* 手势 */
int gamenumber;/*游戏次数*/
static int currentgamenumber;/*目前第几次,自动初始化为0*/
/*--- 初始处理 ---*/
void initialize(void)
{
	win_no = 0;		/* 胜利次数 */
	lose_no = 0;		/* 失败次数 */
	draw_no = 0;		/* 平局次数 */
	srand(time(NULL));	/* 设定随机数种子 */
	printf("猜拳游戏开始!!\n");
	printf("要猜赢几次?(一直猜请输入-1):");
	scanf("%d",&gamenumber);
}
/*--- 运行猜拳游戏(读取/生成手势) ---*/
void jyanken(void)
{
	int i;
	comp1 = rand() % 3;		/* 用随机数生成计算机1的手势(0~2)*/
	comp2 = rand() % 3;		/* 用随机数生成计算机2的手势(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 main(void)
{
	int judge;				/* 胜负 */
	initialize();						/* 初始处理 */
	if (gamenumber == -1)
	{
		printf("一直猜\n");
		while(1)
		{
			jyanken();						/* 运行猜拳游戏 */
			printf("计算机1出%s,计算机2出%s,你出%s。\n", hd[comp1], hd[comp2], hd[human]);/* 显示计算机1/2和玩家的手势 */
			//if (((human != comp1) && (human != comp2) && (comp1 != comp2)) || ((human == comp1) && (human == comp2)))
			if ((human + comp1 + comp2 == 0) || (human + comp1 + comp2 == 3) || (human + comp1 + comp2 == 6))
				judge = 0;//平局
			else if ((((human - comp1 + 3) % 3 == 1) && (((human - comp2 + 3) % 3 == 1) || ((human - comp2 + 3) % 3 == 0)))//human输comp1且输或平comp2
				|| (((human - comp2 + 3) % 3 == 1) && (((human - comp1 + 3) % 3 == 1) || ((human - comp1 + 3) % 3 == 0))))//human输comp2,输或平comp1
				judge = 1;//human输了
			else if ((((human - comp1 + 3) % 3 == 2) && (((human - comp2 + 3) % 3 == 2) || ((human - comp2 + 3) % 3 == 0)))//human赢comp1且赢或平comp2
				|| (((human - comp2 + 3) % 3 == 2) && (((human - comp1 + 3) % 3 == 2) || ((human - comp1 + 3) % 3 == 0))))
				judge = 2;//human赢了
			else
				printf("bug!\n");
			//judge = (human - comp + 3) % 3;	/* 判断胜负 */
			count_no(judge);				/* 更新胜利/失败/平局次数 */
			disp_result(judge);				/* 显示判断结果 */
		} 
	}
	else
	{ 
		printf("猜%d次\n",gamenumber);
		do 
		{
			jyanken();						/* 运行猜拳游戏 */							
			if ((human + comp1 + comp2 == 0) || (human + comp1 + comp2 == 3) || (human + comp1 + comp2 == 6))
				judge = 0;//平局
			else if ((((human - comp1 + 3) % 3 == 1) && (((human - comp2 + 3) % 3 == 1) || ((human - comp2 + 3) % 3 == 0)))//human输comp1且输或平comp2
				|| (((human - comp2 + 3) % 3 == 1) && (((human - comp1 + 3) % 3 == 1) || ((human - comp1 + 3) % 3 == 0))))//human输comp2,输或平comp1
				judge = 1;//human输了
			else if ((((human - comp1 + 3) % 3 == 2) && (((human - comp2 + 3) % 3 == 2) || ((human - comp2 + 3) % 3 == 0)))//human赢comp1且赢或平comp2
				|| (((human - comp2 + 3) % 3 == 2) && (((human - comp1 + 3) % 3 == 2) || ((human - comp1 + 3) % 3 == 0))))
				judge = 2;//human赢了
			else
				printf("bug!\n");
			//judge = (human - comp + 3) % 3;	/* 判断胜负 */
			count_no(judge);				/* 更新胜利/失败/平局次数 */
			disp_result(judge);				/* 显示判断结果 */
		} while (win_no < gamenumber && lose_no < gamenumber);
	}
	printf(win_no == 3 ? "\n□你赢了。\n" : "\n■我赢了。\n");
	printf("%d胜%d负%d平。\n", win_no, lose_no, draw_no);
	return 0;
}
练习3-8 待做 是否有通用一些的算法?如果5人对战,6人对战。。。。?


猜你喜欢

转载自blog.csdn.net/wofreeo/article/details/80741141