一個C語言的剪刀石頭布小遊戲
阿新 • • 發佈:2019-02-12
/******************************************************
石頭剪刀布的程式
源程式是從開源中國看到的,
地址為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;
}
}