酒桌上的氣氛神器【擲骰子】!!!

骰子確實是活躍酒桌氣氛的一大神器,因爲它的隨機帶來的不確定性讓我們感到緊張和興奮。所以我們今天來通過一個程序來重新體會一下擲骰子的樂趣。

程序要求
1、輸入骰子的面數和個數
2、輸出總點數
3、用戶決定是否繼續
4、退出後返回擲骰子的次數


解題思路

1、獲取骰子的面數和個數,面數不能少2面,個數不能少於1個;
2、返回總點數給用戶,需要寫一個隨機數函數,並且種子跟着時間修改,增強隨機性

需要用到的新函數rand()、srand()、time()
rand():通過種子來生成一個指定範圍內的隨機數,rand() 在調用前會確定一下srand() 是否修改過種子
srand():用來修改隨機種子的數值
time():返回一個機器的日曆時間

scanf() 會返回接受數據的個數,可以通過這個來判斷用戶輸入個數是否合法


CodeBlocks 編譯

diceroll.h

#ifndef DICEROLL_H_INCLUDED
#define DICEROLL_H_INCLUDED

//表示roll_count 是外部變量
extern int roll_count;

int roll_n_dice(int dice, int sides);

#endif // DICEROLL_H_INCLUDED

diceroll.c

/** diceroll.c -- 擲骰子模擬程序 */

//與mandydice.c 一起編譯
#include "diceroll.h"
#include <stdio.h>
#include <stdlib.h> //提供rand() 的原型

int roll_count = 0;

static int rollem(int sides){    //函數屬於該文件私有
    //sides 用來控制骰子的面數
    int roll;

    roll = rand() % sides + 1;
    ++roll_count;   //記錄函數調用的次數

    //返回生成的僞隨機數
    return roll;
}

int roll_n_dice(int dice, int sides){
    int d;
    int total = 0;

    //判斷數據合法性
    if(sides < 2){
        printf("骰子至少需要兩面!\n");
        return -2;  //返回屬於該判斷的錯誤值
    }
    if(dice < 1){
        printf("至少需要一個骰子!\n");
        return -1;  //返回屬於該判斷的錯誤值
    }

    //骰子的個數控制循環次數
    //計算點數的總和
    for(d = 0; d < dice; d++)
        total += rollem(sides);

    return total;
}

manydice.c

/** 多次擲骰子的模擬程序 */
//與diceroll.c 一起編譯

#include <stdio.h>
#include <stdlib.h> //爲srand() 提供聲明
#include <time.h>   //爲time() 提供原型
#include "diceroll.h"   //爲roll_n_dice 提供原型,爲roll_count 變量提供聲明

#define ______START______
#define ______END______

int main(void){
    //聲明需要用到的變量
    int dice, roll;
    int sides;
    int status;

    ______START______

    //修改種子的值,跟隨時間而變化
    srand((unsigned int) time(0));

    printf("請輸入骰子的面數,輸入0退出\n");
    //確認scanf() 接收到數字了,並且數字的合法的
    while(scanf("%d", &sides) == 1 && sides > 0){
        printf("需要幾個骰子呢?\n");

        if((status = scanf("%d", &dice)) != 1){
            //是否輸入錯誤字符
            if(status == EOF)
                break;
            else{
                printf("輸入錯誤,您應該輸入一個整數\n");
                printf("請您再次輸入\n");
                while(getchar() != '\n')
                    continue;       //處理錯誤輸入
                printf("請輸入骰子的面數,輸入0 退出\n");
                continue;           //進行下一輪的循環迭代
            }
        }
        //調用函數生成點數總和
        roll = roll_n_dice(dice, sides);
        //輸出數據,並進行下一次判斷
        printf("您使用了%d個%d面骰子骰出了%d點\n\n", dice, sides, roll);
        printf("請輸入骰子的面數,輸入0 退出\n");
    }

    ______END______

    printf("一共擲了%d次骰子\n", roll_count);

    printf("遊戲結束,祝您生活愉快!\n");

    return 0;
}


當然我們也可以用今天學到的新函數來做一個抽獎程序 可以偷偷摸摸的弄點小手腳 ,但是聽說別人年會上大佬寫的抽獎程序要被投影出來公開處刑看看有沒有問題。太難頂了。

本月更新進度 10/10

創作不易,你的點贊是我最大的動力!!!
我們下次再見 end~

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章