练习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;
}