avatar

大兜

右手寫程式,左手寫音樂

~C語言程式設計~數字大戰~

下載執行檔請點我
花了一個早上…終於完成啦<

下面是原始碼,可是作者砍掉小禮物的部份囉(怎麼可以輕易洩漏呢^^)

想知道小禮物是什麼的人就憑自己的實力獲勝吧XD

而各位應該也發現語法框被分成一塊一塊了,因為有字數限制…不分開的話後面的字會不見…囧

有任何問題或建議儘管指教吧^^

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<time.h>
/***宣告函數***/
void intro(void);  //介紹文 
int getRand(int,int);  //亂數函數
void prepare(void);  //準備工作
void goPlay(void);  //遊戲進行 
void pcPlay(void);  //輪電腦玩
void manPlay(void);  //輪人類玩
void menu(void);  //選單
/***宣告變數***/
int stoneNum;  //石頭數 
int takeNum;  //取石頭的上限 
int ifLastIsWin;  //布林值,是否拿最後一顆的人贏
int restart;  //布林值,是否要繼續玩 
int ifOver;  //遊戲結束 
int remain;  //剩下的石頭 
char input[500];  //放使用者輸入的東西 
int main(void){  //主程式只有九行XD 
    intro();
    countWin=0;
    restart = 1;
    while(restart){
        prepare();
        goPlay();
    }
    return 0;
}
/****** 介紹文 ******/
void intro(void){
    printf("************************************************\n");
    printf("************************************************\n");
    printf("**                                            **\n");
    printf("**  大兜蟲數字大戰遊戲 Ver1.0                 **\n");
    printf("**                                            **\n");
    printf("**  操作說明:                                **\n");
    printf("**                                            **\n");
    printf("**  1.遊戲一開始會設定石頭數,取石頭的上限數  **\n");
    printf("**    和規定拿到最後一顆石頭的人獲勝或失敗    **\n");
    printf("**                                            **\n");
    printf("**  2.選擇誰先開始,電腦或玩家                **\n");
    printf("**                                            **\n");
    printf("**  3.輪流拿石頭                              **\n");
    printf("**                                            **\n");
    printf("**  4.祝好運!                                **\n");
    printf("**                                            **\n");
    printf("**  ps. 連贏三次有神秘獎品!                  **\n");
    printf("**                                            **\n");
    printf("************************************************\n");
    printf("************************************************\n");
}
/****** 準備工作 ******/
void prepare(void){
    stoneNum = getRand(20,40);  //這六列是事前準備工作 
    takeNum = getRand(4,10);
    ifLastIsWin = getRand(0,1);
    remain = stoneNum;
    ifOver = 0;
}
/****** 遊戲進行函數 ******/
void goPlay(void){
    if(ifLastIsWin){
        printf("\n現在有%d顆石頭,最多可拿%d顆,拿到最後一顆的人就贏!\n",stoneNum,takeNum);
    }else{
        printf("\n現在有%d顆石頭,最多可拿%d顆,拿到最後一顆的人就輸!\n",stoneNum,takeNum);
    }
    
    int boolin =0;
    printf("想先玩請輸入'1',後玩請輸入'2': ");
    while(!boolin){
        boolin = 1;
        fgets(input,sizeof(input),stdin);
        *(input+strlen(input)-1)='\0';
        printf("\n");
        if(*input == '1'&& strlen(input)==1 ){
            while(!ifOver){
                manPlay();
                if(ifOver) break;       
                pcPlay();
                if(ifOver) break;
            }
        }else if(*input == '2'&& strlen(input)==1){
            while(!ifOver){
                pcPlay();
                if(ifOver) break;
                manPlay();
                if(ifOver) break;
            }
        }else{
            printf("錯誤:請輸入1或2\n");
            boolin *=0;
        }
    }
}
/****** 輪電腦玩 ******/
void pcPlay(void){
    int d;
    if(ifLastIsWin){
        if(remain <= takeNum){
            d = remain;
            remain -= remain;
            ifOver=1;
            printf("電腦拿走了%d顆,還剩下%d顆石頭\n",d,remain);
            printf("\n電腦獲勝!\n");
            menu();
        }else if(remain%(takeNum +1) == 0){
            d = getRand(1,takeNum);
            remain -= d;
            printf("電腦拿走了%d顆,還剩下%d顆石頭\n",d,remain);   
        }else{
            d = (remain%(takeNum +1));
            remain -= d;
            printf("電腦拿走了%d顆,還剩下%d顆石頭\n",d,remain);
        }
        
    }else{
        if(remain == 1){
            remain -= 1;
            ifOver=1;
            printf("電腦拿走了1顆,還剩下%d顆石頭\n",remain);
            printf("\n玩家獲勝!\n");
            menu();
        }else if(remain%(takeNum +1) == 1){
            d = getRand(1,takeNum);
            remain -= d;
            printf("電腦拿走了%d顆,還剩下%d顆石頭\n",d,remain);
        }else if(remain%(takeNum +1) == 0){
            remain -= takeNum;
            printf("電腦拿走了%d顆,還剩下%d顆石頭\n",takeNum,remain);
        }else{
            d = (remain%(takeNum +1) - 1);
            remain -= d;
            printf("電腦拿走了%d顆,還剩下%d顆石頭\n",d,remain);
        }
    } 
    
}
/****** 輪人類玩 ******/
void manPlay(void){
    char input[500];
    int i,input_int;
    int boolin = 0;
    while(!boolin){
        boolin =1;
        printf("\n\n拿幾顆石頭?");
        fgets(input,sizeof(input),stdin);
        *(input + strlen(input) -1) = '\0';
        for(i=0;i<strlen(input);i++){
            if(!(*(input+i) >= '0' && *(input+i) <= '9')){
                printf("錯誤:請輸入數字0~9\n");
                boolin *=0; 
                break;
            }
        }
        if(!boolin) continue;
        input_int = atoi(input);
        if(!(input_int>=1 && input_int <= takeNum && input_int <= remain)){
            printf("錯誤:不接受零、負數和太大的數\n");
            boolin*=0;
        }
        if(!boolin) continue;
    }
    remain -= input_int;
    if(remain>0){
        printf("玩家拿走了%d顆,還剩下%d顆石頭\n",input_int,remain);
    }else if(ifLastIsWin){
        ifOver=1;
        printf("\n玩家獲勝了!\n");
        menu();
        
    }else{
        ifOver=1;
        printf("\n電腦獲勝了!\n");
        menu();
    } 
    
}
/****** 選單函數 ******/
void menu(void){
     printf("是否繼續?y/n:");
     fgets(input,sizeof(input),stdin);
     *(input + strlen(input) -1) = '\0';
     if(*input == 'y' && strlen(input) == 1){
         restart = 1;
     }else if(*input == 'n' && strlen(input) == 1){
         restart = 0;
     }else{
         menu();
     }
} 
/****** 亂數函數 ******/
int getRand(int min, int max){
    srand(time(0));
    return rand()%(max-min+1)+min;
}

標籤