C 語言初學教材 - 第四章 第二次模擬

我們再來繼續對擲骰子遊戲進行第二次模擬,感受一下實際運用擬隨機數玩遊戲可能會有的情形。



假設使用者一開始有 100 個籌碼,每玩一次壓 5 個,我們來模擬看看實際玩遊戲使用者籌碼實際的變化吧!
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define SIZE 1000
#define ORIGIN 100

int main(void)
{
    int points1[SIZE]; // 第一組骰子表格
    int points2[SIZE]; // 第二組骰子表格
    int temp; // 暫存變數
    int i; // 迴圈用變數
    int jeton = ORIGIN; // 玩家的籌碼
    int n = 5; // 儲存籌碼值
    int result[SIZE]; // 儲存玩家的籌碼變化

    srand(time(NULL));
        
    // 建立兩組骰子的亂數表
    for (i = 0; i < SIZE; i++) {
        temp = rand() % 6;
        if (temp == 0) {
            temp = 6;
        }
        points1[i] = temp;
        
        temp = rand() % 6;
        if (temp == 0) {
            temp = 6;
        }
        points2[i] = temp;
    }
    
    // 假設玩 SIZE 次,計算使用者手中籌碼的變化
    for (i = 0; i < SIZE; i++) {
        if (points1[i] == points2[i]) {
            result[i] = jeton;
        }
        
        if (points1[i] > points2[i]) {
             jeton += n;
             result[i] = jeton;
        }
        
        if (points1[i] < points2[i]) {
             jeton -= n;
             result[i] = jeton;
        }
    }
    
    // 印出 300 次的使用者現有籌碼
    for (i = 1; i < 301; i++) {
        printf("%3d ", result[i]);
        
        if (i % 15 == 0) {
            printf("\n");
        }
    }
    printf("\n");
    
    return 0;
}

/* 《程式語言教學誌》的範例程式
    http://pydoing.blogspot.com/
    檔名:dice6.c
    功能:簡單的擲骰子遊戲
    作者:張凱慶
    時間:西元2010年7月 */


我們用另一個整數陣列 result[SIZE] 儲存使用者籌碼的變化,另外我們定義另一個常數 ORIGIN 標示最初使用者的籌碼值。


第 35 行到第 50 行,我們利用 for 迴圈將每一次籌碼的變化存進 result 中
// 假設玩 SIZE 次,計算使用者手中籌碼的變化
for (i = 0; i < SIZE; i++) {
    if (points1[i] == points2[i]) {
        result[i] = jeton;
    }
      
    if (points1[i] > points2[i]) {
         jeton += n;
         result[i] = jeton;
    }
        
    if (points1[i] < points2[i]) {
         jeton -= n;
         result[i] = jeton;
    }
}


第 52 行到第 60 行,我們印出前 300 次的籌碼變化
// 印出 300 次的使用者現有籌碼
for (i = 1; i < 301; i++) {
    printf("%3d ", result[i]);
        
    if (i % 15 == 0) {
        printf("\n");
    }
}
printf("\n");


因此,就會把前 300 次籌碼變化的情形全部印出來,好了,直接編譯執行看看囉!



問題與討論
  1. 為什麼只印出前 300 次的結果變化?
  2. 想一想,能不能多跑幾次,然後記錄每一次的輸贏結果?




沒有留言: