精华点在于:利用封装,函数之间的良好调用,从而清晰明了的解决问题。
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
# include<stdlib.h>
# include<time.h>
# include"math.h"
# define ARR_LEN 10
# define MAX_NUM 1000
# define _NUM 6
/*
* 第一次掷的时候:
如果点数之和为 7 或 11 则获胜;
如果点数之和为2、3或12则落败;
其他情况下的点数之和称为“目标”,继续投掷两个骰子。
在后续的投掷中:
如果玩家再次掷出“目标”点数则获胜;
如果掷出7则落败;
其他情况都忽略,继续投掷两个骰子。
在每一局游戏结束时,程序都要询问用户是否再玩一次,如果用户输入的回答不是 y 或 Y ,那么就结束游戏,程序此时要打印显示胜败的次数。
*
*
*/
/*
两个筛子的和 作为一个随机数,
区别在于 第一次和其他几次的输赢规律是不一样的
第一次 结果的和如果是7/11则是获胜 =》结束
如果是2、3、12则识别 =》结束
其他 情况则记录目标 =》第二次投掷
其他次数:再次投掷
若是第二次是目标数 =》胜利 结束:
如果是7 =>失败 是否结束
其他情况忽略继续rand
确定赢的条件,第一次赢是7/11, 2/3/12是输 其他都是继续投掷并且存储其他的值,直达再次投掷出该和,而且如果和是7是失败。
封装一个计算两次投掷的和控制在2~12之间
再封装一个是用于判断是否赢得游戏 包含第一次投掷和接下来几次投掷,知道此轮游戏结束
在一轮游戏结束之后 在看是否继续执行游戏,相应的需要统计赢和输的次数
*/
# include<stdbool.h>
//游戏开始
bool play() {//游戏的输赢 由bool值来得知
int sum = roll_play();
printf("You rolled: %d\n", sum);
if (sum == 7 || sum == 11) {
printf("You win!\n");
return true;//赢了游戏就直接退出 由主函数来得知该玩家是否进行下一轮
}
if (sum == 2 || sum == 3 || sum == 12) {
printf("You lose!\n"); //输了游戏就直接退出 由主函数来得知该玩家是否进行下一轮
return false;
} //只要没退出函数 执行到了这一步 就是进入其他情况 其他情况由循环进行
//进行之前记录之前的点数,其他情况的循环 保证一点就是找到一样的目标就是赢得游戏
//否则继续投掷
int target = sum;
printf("Your point is: %d\n", sum);
while (true) {
//否则继续投掷
sum = roll_play();
printf("You rolled: %d\n", sum);
if (sum == target) {
printf("You win!\n");
return true;
}
if (sum == 7) {
printf("You lose!\n");
return false;
}
}
}
//两次投掷的和 结果
int roll_play(void) {
int num1 = rand() % 6 + 1;
int num2 = rand() % 6 + 1;
int sum = num1 + num2;
return sum;
}
//主函数只需要保证是否需要继续游戏 另外两个函数分别是进行骰子的投掷,以及按照游戏规则的进行。
int main(void) {
char play_;
int win = 0, lose = 0;
srand(time(NULL));//产生一个序列的数就可以
do {
play() ? win++ : lose++;
printf("Play again? (y/n)\n");
scanf(" %c", &play_);//为了保证空格y的情况依旧可以正常运行 在%c前面加一个空格来读走空格
while (getchar() != '\n');//清空输入缓存 防止多个yyy在缓冲区内
} while (play_ == 'y' || play_ == 'Y');
printf("You win: %d, lose: %d\n", win, lose);
return 0;
}