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

练习3-1

/****************************************************************
*  练习3-1
*	函数分割 针对猜拳
*	分为五个部分:
*	1、初始处理		2、读/生成手势		3、更新对局信息
*	4、显示判断结果	5、确认是否再次挑战
*	合并3、4模块
/****************************************************************/
#include<time.h>
#include<stdio.h>
#include<stdlib.h>

int player;
int computer;
int win_num;//赢的次数
int lose_num;//输的次数
int draw_num;//平局次数
char *hd[] = { "石头","剪刀","布" };

//1、状态初始化
void initialize(void)
{
	win_num = 0;
	lose_num = 0;
	draw_num = 0;
	srand((int)time(NULL));
	printf("猜拳游戏开始!!!\n");
}

//2、读取、生成手势
void read_create(void)
{
	int i;
	computer = rand() % 3;
	do
	{
		printf("\n\n石头剪刀布....");
		for (i = 0; i < 3; i++)
		{
			printf("(%d)%s ", i, hd[i]);
		}
		putchar(':');
		scanf_s("%d", &player);
	} while (player < 0 || player>2);
}

/*
//3、更新对局信息 胜负次数
void count_num(int result)
{
	switch (result)
	{
	case 0:draw_num++; break;
	case 1: lose_num++; break;
	case 2: win_num++; break;
	}
}

//4、显示判断结果
void disp_result(int result)
{
	switch (result)
	{
	case 0:puts("平局");  break;
	case 1:puts("你输了"); break;
	case 2:puts("你赢了"); break;
	}
}
*/
void renew_disp(int result)
{
	switch (result)
	{
	case 0:draw_num++; break;
	case 1: lose_num++; break;
	case 2: win_num++; break;
	}
	switch (result)
	{
	case 0:puts("平局");  break;
	case 1:puts("你输了"); break;
	case 2:puts("你赢了"); break;
	}
}

//5、确认是是否再次挑战
int confirm_retry(void)
{
	int x;
	printf("再来一次吗?---(0)否	(1)是");
	scanf_s("%d", &x);

	return x;
}

//主函数
int main(int arg, int argv[])
{
	int judge;//判断结果数
	int retry;//判断是否重新开始
	initialize();
	do
	{
		read_create();
		printf("玩家出%4s  ,  电脑出%4s\n", hd[player], hd[computer]);
		judge = (player - computer + 3) % 3;
		renew_disp(judge);
		//count_num(judge);
		//disp_result(judge);
		retry = confirm_retry();
	} while (retry == 1);

	printf("%d胜;%d负;%d平。\n", win_num, lose_num, draw_num);

	return 0;
}

练习3-2

/****************************************************************
*  练习3-2
*	函数分割 针对猜拳
*	分为五个部分:
*	1、初始处理		2、读/生成手势		3、更新对局信息
*	4、显示判断结果		5、先赢满n局者胜
/****************************************************************/
#include<time.h>
#include<stdio.h>
#include<stdlib.h>
int again_num;//猜赢的次数
int player;
int computer;
int win_num;//赢的次数
int lose_num;//输的次数
int draw_num;//平局次数
char *hd[] = { "石头","剪刀","布" };

//1、状态初始化
void initialize(void)
{
	win_num = 0;
	lose_num = 0;
	draw_num = 0;
	srand((int)time(NULL));
	printf("猜拳游戏开始!!!\n");
}

//2、读取、生成手势
void read_create(void)
{
	int i;
	computer = rand() % 3;
	do
	{
		printf("\n\n石头剪刀布....");
		for (i = 0; i < 3; i++)
		{
			printf("(%d)%s ", i, hd[i]);
		}
		putchar(':');
		scanf_s("%d", &player);
	} while (player < 0 || player>2);
}

//3、更新对局信息 胜负次数
void count_num(int result)
{
	switch (result)
	{
	case 0:draw_num++; break;
	case 1: lose_num++; break;
	case 2: win_num++; break;
	}
}

//4、显示判断结果
void disp_result(int result)
{
	switch (result)
	{
	case 0:puts("平局");  break;
	case 1:puts("你输了"); break;
	case 2:puts("你赢了"); break;
	}
}

//5、补充函数 需要猜赢n次
void again_fun()
{
	printf("需要猜赢几次:");
	scanf_s("%d",&again_num);
}

//主函数
int main(int arg, int argv[])
{
	int judge;//判断结果数
	int retry;//判断是否重新开始
	initialize();
	again_fun();
	do
	{
		read_create();
		printf("玩家出%4s  ,  电脑出%4s\n", hd[player], hd[computer]);
		judge = (player - computer + 3) % 3;
		count_num(judge);
		disp_result(judge);
	} while (lose_num < again_num && win_num < again_num);
	printf(win_num == again_num ? "\n你赢了\n" : "\n你输了\n");//注意printf的用法
	printf("%d胜;%d负;%d平。\n", win_num, lose_num, draw_num);

	return 0;
}

练习3-3

/****************************************************************
*  练习3-3
*	函数分割 针对猜拳
*	分为五个部分:
*	1、初始处理		2、读/生成手势		3、更新对局信息
*	4、显示判断结果		5、先赢满n局者胜
*	并且只让电脑只能出石头和布
/****************************************************************/
#include<time.h>
#include<stdio.h>
#include<stdlib.h>
int again_num;//猜赢的次数
int player;
int computer;
int win_num;//赢的次数
int lose_num;//输的次数
int draw_num;//平局次数
//想让电脑只出石头和布,这里需要进行调整hd[]中的次序
char *hd[] = { "石头","布","剪刀" };

//1、状态初始化
void initialize(void)
{
	win_num = 0;
	lose_num = 0;
	draw_num = 0;
	srand((int)time(NULL));
	printf("猜拳游戏开始!!!\n");
}

//2、读取、生成手势
void read_create(void)
{
	int i;
	computer = rand() % 2;//这里限定电脑随机数只在0-1之间
	do
	{
		printf("\n\n石头剪刀布....");
		for (i = 0; i < 3; i++)
		{
			printf("(%d)%s ", i, hd[i]);
		}
		putchar(':');
		scanf_s("%d", &player);
	} while (player < 0 || player>2);
}

//3、更新对局信息 胜负次数
void count_num(int result)
{
	switch (result)
	{
	case 0:draw_num++; break;
	case 1: lose_num++; break;
	case 2: win_num++; break;
	}
}

//4、显示判断结果
void disp_result(int result)
{
	switch (result)
	{
	case 0:puts("平局");  break;
	case 1:puts("你赢了"); break;//这里也需要进行调整result为1时赢
	case 2:puts("你输了"); break;
	}
}

//5、补充函数 需要猜赢n次
void again_fun()
{
	printf("需要猜赢几次:");
	scanf_s("%d", &again_num);
}

//主函数
int main(int arg, int argv[])
{
	int judge;//判断结果数
	int retry;//判断是否重新开始
	initialize();
	again_fun();
	do
	{
		read_create();
		printf("玩家出%4s  ,  电脑出%4s\n", hd[player], hd[computer]);
		judge = (player - computer + 3) % 3;
		count_num(judge);
		disp_result(judge);
	} while (lose_num < again_num && win_num < again_num);
	printf(win_num == again_num ? "\n你赢了\n" : "\n你输了\n");//注意printf的用法
	printf("%d胜;%d负;%d平。\n", win_num, lose_num, draw_num);

	return 0;
}

练习3-4

/****************************************************************
*  练习3-4
*	函数分割 针对猜拳
*	分为五个部分:
*	1、初始处理		2、读/生成手势		3、更新对局信息
*	4、显示判断结果		5、先赢满n局者胜
/****************************************************************/
#include<time.h>
#include<stdio.h>
#include<stdlib.h>
int again_num;//猜赢的次数
int player;
int computer;
int win_num;//赢的次数
int lose_num;//输的次数
int draw_num;//平局次数
char *hd[] = { "石头","剪刀","布" };

int sig_computer=0;//设置一个控制信号,让其电脑第一次为0
//1、状态初始化
void initialize(void)
{
	win_num = 0;
	lose_num = 0;
	draw_num = 0;
	srand((int)time(NULL));
	printf("猜拳游戏开始!!!\n");
}

//2、读取、生成手势
void read_create(void)
{
	int i;
	//两种情况控制电脑第一次出石头
	if (sig_computer==0)
	{
		computer = 0;
	}
	else
	{
		computer = rand() % 3;
	}
	do
	{
		printf("\n\n石头剪刀布....");
		for (i = 0; i < 3; i++)
		{
			printf("(%d)%s ", i, hd[i]);
		}
		putchar(':');
		scanf_s("%d", &player);
	} while (player < 0 || player>2);
}

//3、更新对局信息 胜负次数
void count_num(int result)
{
	switch (result)
	{
	case 0:draw_num++; break;
	case 1: lose_num++; break;
	case 2: win_num++; break;
	}
}

//4、显示判断结果
void disp_result(int result)
{
	switch (result)
	{
	case 0:puts("平局");  break;
	case 1:puts("你输了"); break;
	case 2:puts("你赢了"); break;
	}
}

//5、补充函数 需要猜赢n次
void again_fun()
{
	printf("需要猜赢几次:");
	scanf_s("%d",&again_num);
}

//主函数
int main(int arg, int argv[])
{
	int judge;//判断结果数
	int retry;//判断是否重新开始
	initialize();
	again_fun();
	do
	{
		read_create();
		printf("玩家出%4s  ,  电脑出%4s\n", hd[player], hd[computer]);
		judge = (player - computer + 3) % 3;
		count_num(judge);
		disp_result(judge);
		sig_computer = 1;
	} while (lose_num < again_num && win_num < again_num);
	printf(win_num == again_num ? "\n你赢了\n" : "\n你输了\n");//注意printf的用法
	printf("%d胜;%d负;%d平。\n", win_num, lose_num, draw_num);

	return 0;
}

练习3-5

/****************************************************************
*  练习3-5
*	1、初始处理		2、读/生成手势		3、更新对局信息
*	4、显示判断结果		5、需要猜赢n次
*	模式选择、计算机每五次后出一次
/****************************************************************/
#include<time.h>
#include<stdio.h>
#include<stdlib.h>
int mode;
int game_num=1;//游戏进行次数
int again_num;//猜赢的次数
int player;
int computer;
int win_num;//赢的次数
int lose_num;//输的次数
int draw_num;//平局次数
int signal=0;//控制五次计算机不后出
char *hd[] = { "石头","剪刀","布" };

//1、状态初始化、选择游戏模式
void initialize(void)
{
	win_num = 0;
	lose_num = 0;
	draw_num = 0;
	srand((int)time(NULL));
	printf("猜拳游戏开始!!!\n");
	do
	{
		printf("请选择游戏模式(0---练习模式,1---挑战模式):");
		scanf_s("%d", &mode);
	} while (mode<0&&mode>1);//要求输入0或者1
}

//2、读取、生成手势 每五次就后出一次
void read_create(int signal)
{
	int i;
	//signal==0时正常随机
	//signal==1时计算机后出
	if (signal==0) {
		computer = rand() % 3;
		do
		{
			printf("\n石头剪刀布....");
			for (i = 0; i < 3; i++)
			{
				printf("(%d)%s ", i, hd[i]);
			}
			putchar(':');
			scanf_s("%d", &player);
		} while (player < 0 || player>2);
	}
	else//计算机每五次后出一次
	{
		do
		{
			printf("\n石头剪刀布....");
			for (i = 0; i < 3; i++)
			{
				printf("(%d)%s ", i, hd[i]);
			}
			putchar(':');
			scanf_s("%d", &player);
		} while (player < 0 || player>2);
		computer = (player + 2) % 3;
	}
	
}

//3、更新对局信息 胜负次数
void count_num(int result)
{
	switch (result)
	{
	case 0:draw_num++; break;
	case 1: lose_num++; break;
	case 2: win_num++; break;
	}
}

//4、显示判断结果
void disp_result(int result)
{
	switch (result)
	{
	case 0:puts("平局");  break;
	case 1:puts("你输了"); break;
	case 2:puts("你赢了"); break;
	}
}

//5、补充函数 需要猜赢n次
void again_fun()
{
	printf("需要猜赢几次:");
	scanf_s("%d",&again_num);
}

//主函数
int main(int arg, int argv[])
{
	int judge;//判断结果数
	int retry;//判断是否重新开始
	initialize();
	if (mode == 0)//玩家可以自愿执行是否重新开始
	{
		do
		{
			printf("\n这是第%d回合", game_num);
			//判断是否为5的倍数,若为5的倍数,则计算机后出
			if (game_num % 5 == 0)
			{
				signal = 1;
			}
			else
			{
				signal = 0;
			}
			read_create(signal);
			printf("玩家出%4s  ,  电脑出%4s\n", hd[player], hd[computer]);
			judge = (player - computer + 3) % 3;
			count_num(judge);
			disp_result(judge);
			game_num++;
			printf("是否继续游戏(0--exit,1---continue):");
			scanf_s("%d", &retry);
		} while(retry==1);
	}
	else//猜赢几次就退出游戏
	{
		again_fun();
		do
		{
			printf("\n这是第%d回合", game_num);
			//判断是否为5的倍数,若为5的倍数,则计算机后出
			if (game_num % 5 == 0)
			{
				signal = 1;
			}
			else
			{
				signal = 0;
			}
			read_create(signal);
			printf("玩家出%4s  ,  电脑出%4s\n", hd[player], hd[computer]);
			judge = (player - computer + 3) % 3;
			count_num(judge);
			disp_result(judge);
			game_num++;
		} while (lose_num < again_num && win_num < again_num);
		printf(win_num == again_num ? "\n你赢了\n" : "\n你输了\n");//注意printf的用法
	}
	
	printf("%d胜;%d负;%d平。\n", win_num, lose_num, draw_num);
	return 0;
}

练习3-6

/****************************************************************
*  练习3-6
*	1、初始处理		2、读/生成手势		3、更新对局信息
*	4、显示判断结果		5、需要猜赢n次
*	模式选择(两种)
*	并保存所有记录
/****************************************************************/
#include<time.h>
#include<stdio.h>
#include<stdlib.h>
int mode;
int game_num = 1;//游戏进行次数
int again_num;//猜赢的次数
int player;
int computer;
int win_num;//赢的次数
int lose_num;//输的次数
int draw_num;//平局次数
char *hd[] = { "石头","剪刀","布" };
char *player_hd[100];//保存玩家每次的手势
char *computer_hd[100];//保存计算机每次的手势
char *result[100];//保存每次输赢的结果

//1、状态初始化、选择游戏模式
void initialize(void)
{
	win_num = 0;
	lose_num = 0;
	draw_num = 0;
	srand((int)time(NULL));
	printf("猜拳游戏开始!!!\n");
	do
	{
		printf("请选择游戏模式(0---练习模式,1---挑战模式):");
		scanf_s("%d", &mode);
	} while (mode < 0 && mode>1);//要求输入0或者1
}

//2、读取、生成手势 
void read_create( )
{
	int i;
		computer = rand() % 3;
		do
		{
			printf("\n石头剪刀布....");
			for (i = 0; i < 3; i++)
			{
				printf("(%d)%s ", i, hd[i]);
			}
			putchar(':');
			scanf_s("%d", &player);
		} while (player < 0 || player>2);
}

//3、更新对局信息 胜负次数
void count_num(int result)
{
	switch (result)
	{
	case 0:draw_num++; break;
	case 1: lose_num++; break;
	case 2: win_num++; break;
	}
}

//4、显示判断结果
void disp_result(int res,int i)
{
	switch (res)
	{
	case 0:puts("平局"); result[i] = "平局"; break;
	case 1:puts("你输了"); result[i] = "玩家输"; break;
	case 2:puts("你赢了"); result[i] = "玩家赢"; break;
	}
}

//5、补充函数 需要猜赢n次
void again_fun()
{
	printf("需要猜赢几次:");
	scanf_s("%d", &again_num);
}
//6、输出游戏每次对局的过程及结果
void PrintResult()
{
	printf("共对局%d次\n",game_num-1);
	for (int i = 0; i < game_num-1; i++)
	{
		printf("第%d次:玩家---%s	电脑---%s	结果---%s\n", i+1, player_hd[i], computer_hd[i],result[i]);
	}
}


//主函数
int main(int arg, int argv[])
{
	int judge;//判断结果数
	int retry;//判断是否重新开始
	initialize();
	int i=0;
	if (mode == 0)//玩家可以自愿执行是否重新开始
	{
		do
		{
			printf("\n这是第%d回合", game_num);
			read_create();
			printf("玩家出%4s  ,  电脑出%4s\n", hd[player], hd[computer]);
			//记录对局手势
			player_hd[i] = hd[player];
			computer_hd[i] = hd[computer];
			judge = (player - computer + 3) % 3;
			count_num(judge);
			disp_result(judge,i);
			i++;
			game_num++;
			printf("是否继续游戏(0--exit,1---continue):");
			scanf_s("%d", &retry);
		} while (retry == 1);
	}
	else//猜赢几次就退出游戏
	{
		again_fun();
		do
		{
			printf("\n这是第%d回合", game_num);
			//判断是否为5的倍数,若为5的倍数,则计算机后出
			read_create();
			printf("玩家出%4s  ,  电脑出%4s\n", hd[player], hd[computer]);
			//记录对局手势
			player_hd[i] = hd[player];
			computer_hd[i] = hd[computer];
			judge = (player - computer + 3) % 3;
			count_num(judge);
			disp_result(judge,i);
			i++;
			game_num++;
		} while (lose_num < again_num && win_num < again_num);
		printf(win_num == again_num ? "\n你赢了\n" : "\n你输了\n");//注意printf的用法
	}
	printf("%d胜;%d负;%d平。\n\n", win_num, lose_num, draw_num);
	PrintResult();
	return 0;
}

以上的练习,函数划分还能进行细分

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值