下載執行檔請點我
花了一個早上…終於完成啦<
下面是原始碼,可是作者砍掉小禮物的部份囉(怎麼可以輕易洩漏呢^^)
想知道小禮物是什麼的人就憑自己的實力獲勝吧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;
}