1. 程式人生 > >一個C語言的剪刀石頭布小遊戲

一個C語言的剪刀石頭布小遊戲



/******************************************************
石頭剪刀布的程式
源程式是從開源中國看到的,
地址為http://www.oschina.net/code/snippet_1448389_46137
geek_monkey於2015年3月3日修改了bug(輸入字元非石頭剪刀布都算是玩家贏)
編譯環境為VC++6.0
增加“上帝模式”和資料統計,純屬娛樂。
我是C語言初學者,輕噴
******************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>
 
int exist_in(char *arr1[][2], char *arr2[], int length);//勝負判斷函式
void nextround (void);//本輪結束後的處理輪函式
enum {QUIT,OK} status;//標誌位,QUIT=0,OK=1
int vcnt = 0,dcnt = 0,tcnt = 0;//資料統計
int main(void)
{
    int i = 0, length;


    time_t t;
status = OK;
    char *person = (char *) malloc(100);//動態記憶體分配
    char *computer = (char *) malloc(100);
     
    char *computer_person[2];
 
    char *guess_arr[] = {"石頭", "剪刀", "布"};
    char *win[3][2] = {{"布", "石頭"}, {"石頭", "剪刀"}, {"剪刀", "布"}};    


    length = (int)sizeof(win)/(int)sizeof(win[0]);//此例中length=3


    while (status == OK)//標誌位1,執行死迴圈
    {
        srand((unsigned) time(&t));
        i = rand() % 3 ;//srand和rand配合產生隨機數
         
        computer = guess_arr[i];//將隨機數轉換為石頭剪刀或者布的字串
computer_person[0] = computer;//將計算機的出拳結果放入*computer_person


do{
printf("請輸入 剪刀 石頭 布:\n");
scanf("%s",person);
if (strcmp(person,"god") == 0)//上帝模式,實現可看到電腦出拳結果
{
printf("*********************************\n");
printf("上帝你好,電腦本局的出的是 : %s \n",computer);
printf("*********************************\n");
continue;
}
else
printf("你輸入的是:%s\n", person);//下一行用於判斷使用者的輸入是否為石頭剪刀布
if ((strcmp(person,"石頭") == 0 )||(strcmp(person,"剪刀") == 0 )||(strcmp(person,"布") == 0 ))
break;//結果為石頭剪刀布之一,跳出迴圈。
else
printf("請檢查你的輸入是否為石頭剪刀或者布: \n");
}while(1);



computer_person[1] = person;
 tcnt++;        
         
        if (strcmp(computer, person) == 0 )
        {
            printf("平手!\n\n");
        }
        else if (exist_in(win, computer_person, length))
        {
              printf("電腦獲勝\n\n");
 dcnt++;
        }
        else
        {
            printf("玩家獲勝\n\n");
vcnt++;
            nextround();
        }   
 
    }
     
    person = NULL;
    computer = NULL;    
         
    free(person);
    free(computer);
     
    return 0;
 
}
/**********************************************
 exist_in函式用於判斷是否是電腦獲勝,length為3,比較3次,arr1和arr2中字串的
 順序即可判斷出電腦是否獲勝。
 *********************************************/
int exist_in(char *arr1[][2], char *arr2[], int length)
{
    int i;
    for (i = 0; i < length; i++)
    {
        if (strcmp(arr1[i][0], arr2[0]) == 0 && strcmp(arr1[i][1], arr2[1]) == 0)
        {
            return 1;
        }
             
    }
         
    return 0;
 
 }
void nextround (void)
{
int m = 0;
printf("請輸入指令:1退出,2繼續,3資料總結\n");
scanf ("%d",&m);


switch (m)
{
case 1:
status = QUIT;
break;
case 2:
printf("新的一局開始\n");
break;
case 3:
printf("您的勝場數是%d,敗場數是%d,總場數是%d\n",vcnt,dcnt,tcnt);
status = QUIT;
break;
default:
printf("輸入錯誤退出");
status = QUIT;
break;
}
}