精華點在于:利用封裝,函數之間的良好調用,從而清晰明了的解決問題。
#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;
}