练习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 integrate(int result)
{
switch (result) {
case 0: draw_no++; printf("平局。"); break;
case 1: lose_no++; printf("你输了。"); break;
case 2: win_no++; printf("你赢了。"); break;
}
}
/*---确认是否再次挑战---*/
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[human], hd[comp]);
judge = (human - comp + 3) % 3; //判断胜负
integrate(judge);
retry = confirm_retry();
} while (retry == 1);
printf("%d胜%d负%d平。\n", win_no, lose_no, draw_no);
return 0;
}
练习3-2
? ? ? ? 直接在书本代码的基础上改的,加入了标识符game_no和i,分别表示玩家想玩几局以及世纪玩了几局。
#include <time.h>
#include <stdio.h>
#include <stdlib.h>
int human; //玩家的手势
int comp; //计算机的手势
int win_no; //玩家获胜次数
int lose_no; //玩家失败次数
int draw_no; //平局次数
int game_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: printf("平局。"); break;
case 1: printf("你输了。"); break;
case 2: printf("你赢了。"); break;
}
}
/*---确认是否再次挑战---*/
int confirm_retry(void)
{
int x;
printf("再来一次吗...(0)否(1)是");
scanf("%d", &x);
return x;
}
int main(void)
{
int i = 0; //玩了几局
int judge; //胜负
int retry; //再来一次?
printf("请问你打算玩几局:");
scanf("%d", &game_no);
initialize(); //初始化
do {
jyanken(); //运行猜拳游戏
/*显示计算机和玩家的手势*/
printf("你出%s,我出%s。\n", hd[human], hd[comp]);
judge = (human - comp + 3) % 3; //判断胜负
count_no(judge);
disp_result(judge);
//retry = confirm_retry();
i++;
} while (i < game_no);
printf("%d胜%d负%d平。\n", win_no, lose_no, draw_no);
return 0;
}
练习3-3
? ? ? ? 本题使用do{}while()循环来使comp只能取0或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[] = { "石头","剪刀","布" }; //手势
/*---初始处理---*/
void initialize(void)
{
win_no = 0; //玩家获胜次数
lose_no = 0; //玩家失败次数
draw_no = 0; //平局次数
srand(time(NULL)); //设定随机数钟子
printf("猜拳游戏开始!!!\n");
}
/*---运行猜拳游戏(读取、生成手势)---*/
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: printf("平局。"); break;
case 1: printf("你输了。"); break;
case 2: printf("你赢了。"); break;
}
}
/*---确认是否再次挑战---*/
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[human], hd[comp]);
judge = (human - comp + 3) % 3; //判断胜负
count_no(judge);
disp_result(judge);
retry = confirm_retry();
} while (retry==1);
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[] = { "石头","剪刀","布" }; //手势
/*---初始处理---*/
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: printf("平局。\n"); break;
case 1: printf("你输了。\n"); break;
case 2: printf("你赢了。\n"); break;
}
}
/*---确认是否再次挑战---*/
int confirm_retry(void)
{
int x;
printf("再来一次吗...(0)否(1)是");
scanf("%d", &x);
return x;
}
int main(void)
{
int i;
int judge; //胜负
int retry; //再来一次?
initialize(); //初始化
comp = 0; //设定电脑第一次出石头
printf("\n\a石头剪刀布...");
for (i = 0; i < 3; i++)
printf("(%d)%s ", i, hd[i]);
printf(":");
scanf("%d", &human); //读取玩家手势
printf("你出%s,我出%s。\n", hd[human], hd[comp]); //输出电脑手势和玩家手势
judge = (human - comp + 3) % 3; //判断胜负
count_no(judge);
disp_result(judge);
printf("再来一次吗...(0)否(1)是");
scanf("%d", &retry);
if (retry == 0) {
printf("%d胜%d负%d平。\n", win_no, lose_no, draw_no);
return 0; //若玩家只进行一次猜拳,则程序结束
}
do {
jyanken(); //运行猜拳游戏
/*显示计算机和玩家的手势*/
printf("你出%s,我出%s。\n", hd[human], hd[comp]);
judge = (human - comp + 3) % 3; //判断胜负
count_no(judge);
disp_result(judge);
retry = confirm_retry();
} while (retry==1);
printf("%d胜%d负%d平。\n", win_no, lose_no, draw_no);
return 0;
}
练习3-5
? ? ? ? 本题单独写了houchu(后出)程序,用于第5次、第10次、第15次...猜拳时电脑后出。
? ? ? ? 在两种游戏模式中,有限模式会使用一个for循环。
#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: printf("平局。\n"); break;
case 1: printf("你输了。\n"); break;
case 2: printf("你赢了。\n"); break;
}
}
/*---确认是否再次挑战---*/
int confirm_retry(void)
{
int x;
printf("再来一次吗...(0)否(1)是");
scanf("%d", &x);
return x;
}
/*---计算机后出---*/
void houchu(void)
{
int i;
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);
comp = (human + 2) % 3;
}
int main(void)
{
int i=1; //玩家在进行第i次猜拳
int j; //游戏模式
int k; //玩家想玩几次
int judge; //胜负
int retry; //再来一次?
printf("请选择游戏模式...(0)无限模式(1)有限模式");
scanf("%d", &j);
if (j == 0) {
initialize(); //初始化
do {
if (i % 5 == 0) //%的优先级高于==
houchu(); //当i是5的倍数时,电脑后出
else
jyanken(); //运行猜拳游戏
printf("你出%s,我出%s。\n", hd[human], hd[comp]);
judge = (human - comp + 3) % 3; //判断胜负
count_no(judge);
disp_result(judge);
retry = confirm_retry();
i++; //每次猜拳结束后i加1
} while (retry == 1);
}
else {
printf("请问您想玩几次:");
scanf("%d", &k);
initialize(); //初始化
for (i = 1; i <= k; i++) //计算机会玩k次猜拳
{
if (i % 5 == 0) 当i是5的倍数时,电脑后出
houchu();
else
jyanken();
printf("你出%s,我出%s。\n", hd[human], hd[comp]);
judge = (human - comp + 3) % 3; //判断胜负
count_no(judge);
disp_result(judge);
}
}
printf("%d胜%d负%d平。\n", win_no, lose_no, draw_no);
return 0;
}
练习3-6
#include <time.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.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: printf("平局。\n"); break;
case 1: printf("你输了。\n"); break;
case 2: printf("你赢了。\n"); break;
}
}
/*---确认是否再次挑战---*/
int confirm_retry(void)
{
int x;
printf("再来一次吗...(0)否(1)是");
scanf("%d", &x);
return x;
}
/*---计算机后出---*/
void houchu(void)
{
int i;
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);
comp = (human + 2) % 3;
}
int main(void)
{
int i;
int j; //游戏模式
int k; //玩家想玩几次
int judge; //胜负
int retry; //再来一次?
int record_hd[128]; //记录下每次的手势
int record_judge[128]; //记录下每次的输赢,judge=0平局;judge=1,玩家失败;judge=2玩家获胜
printf("请选择游戏模式...(0)无限模式(1)有限模式");
scanf("%d", &j);
if (j == 0) {
initialize(); //初始化
i = 1;
do {
if (i % 5 == 0) //%的优先级高于==
houchu(); //当i是5的倍数时,电脑后出
else
jyanken(); //运行猜拳游戏
printf("你出%s,我出%s。\n", hd[human], hd[comp]);
judge = (human - comp + 3) % 3; //判断胜负
count_no(judge);
disp_result(judge);
record_hd[i-1] = human;
record_judge[i-1] = judge;
retry = confirm_retry();
i++; //在第n次结束时,i=n+1;但是两个数组都只进行了i-1次记录
} while (retry == 1);
}
else {
printf("请问您想玩几次:");
scanf("%d", &k);
initialize(); //初始化
for (i = 1; i <= k; i++) //计算机会玩k次猜拳
{
if (i % 5 == 0) 当i是5的倍数时,电脑后出
houchu();
else
jyanken();
printf("你出%s,我出%s。\n", hd[human], hd[comp]);
judge = (human - comp + 3) % 3; //判断胜负
count_no(judge);
disp_result(judge);
record_hd[i - 1] = human;
record_judge[i - 1] = judge;
} //完成最后一次猜拳,i=k;但是两个数组都只进行了i-1次记录
}
for (j = 0; j< i-1; j++) { //模式1与模式2中,玩家都进行i-1次猜拳游戏
printf("第%d次玩家手势:", j + 1);
switch (record_hd[j]) {
case 0:printf("石头"); break;
case 1:printf("剪刀"); break;
case 2:printf("布 "); break;
}
printf(",");
switch (record_judge[j]) {
case 0: printf("平局。\n"); break;
case 1: printf("玩家失败。\n"); break;
case 2: printf("玩家获胜。\n"); break;
}
}
printf("%d胜%d负%d平。\n", win_no, lose_no, draw_no);
return 0;
}
练习3-7
#include <time.h>
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int i;
int human; //玩家手势
int comp1, comp2; //计算机1的手势、计算机2的手势
int judge1, judge2, judge3; //judge1代表玩家与计算机1的胜负,judge2代表玩家与计算机2的输赢,judge3代表计算机1与计算机2的输赢
int retry;
char *hd[] = { "石头","剪刀","布" };
srand(time(NULL));
printf("猜拳游戏开始!!!\n");
do {
comp1 = rand() % 3;
comp2 = rand() % 3;
do {
for (i = 0; i < 3; i++)
printf("(%d)%s", i, hd[i]);
printf(":");
scanf("%d", &human);
} while (human < 0 || human>2);
judge1 = (human - comp1 + 3) % 3;
judge2 = (human - comp2 + 3) % 3;
judge3 = (comp1 - comp2 + 3) % 3;
printf("玩家与1号电脑:");
printf("我出%s,你出%s。\n", hd[comp1], hd[human]);
switch (judge1) {
case 0:printf("平局。\n"); break;
case 1:printf("玩家失败。\n"); break;
case 2:printf("玩家获胜。\n"); break;
}
printf("玩家与2号电脑:");
printf("他出%s,你出%s。\n", hd[comp2], hd[human]);
switch (judge2) {
case 0:printf("平局。\n"); break;
case 1:printf("玩家失败。\n"); break;
case 2:printf("玩家获胜。\n"); break;
}
printf("1号电脑与2号电脑:");
printf("他出%s,我出%s。\n", hd[comp2], hd[comp1]);
switch (judge3) {
case 0:printf("平局。\n"); break;
case 1:printf("1号电脑失败。\n"); break;
case 2:printf("1号电脑获胜。\n"); break;
}
printf("再来一次吗...(0)否(1)是:");
scanf("%d", &retry);
} while (retry == 1);
return 0;
}
练习3-8
四人对战猜拳游戏,规则如下:
(1)四人出拳相同:平局;
(2)四人共计出拳两种:有赢家有输家;
(3)四人共计出拳三种,即石头剪刀布:本局无效。
没什么思路。
|