發新話題

『轉貼』[C&C++] 小遊戲 猜幾A幾B的遊戲

『轉貼』[C&C++] 小遊戲 猜幾A幾B的遊戲

可以人猜電腦的數字
也可以電腦猜人的數字
有興趣的可以研究研究
複製內容到剪貼板
代碼:
#include <stdio.h>

char iComputerNumber[4];
int iResultNumber[10000];
int iGuessNumber[20];
int iGuessResult[20];
int iTotalNumber;
int iGuessTimes;

/* 用亂數做出電腦的答案 */
void fnGenerateNumber()
{
int i, j;

for (i=0; i<4; i++)
{
iComputerNumber[i] = rand() % 10;
for (j=0; j<i; j++)
if (iComputerNumber[j] == iComputerNumber[i])
{
i--;
break;
}
}
}

/* 檢查數字 number 是否合理 */
int fnCheckNumber(char *number)
{
int i, j;

if (strlen(number) != 4)
return 1;

for (i=0; i<3; i++)
for (j=i+1; j<4; j++)
if (*(number+i) == *(number+j))
return 1;

return 0;
}

/* 比對數字 number 和 answer 並傳回 AB 值 */
int fnGuessNumber(char *number, char *answer)
{
int a=0, b=0;
int i, j;

for (i=0; i<4; i++)
for (j=0; j<4; j++)
if (*(number+i) == (*(answer+j)+'0'))
{
if (i == j)
a++;
else
b++;
}

return (a*10+b);
}

/* 解析使用者輸入的字串 buf */
int fnProcessAB(char *buf)
{
int a, b;

if ((strlen(buf) == 1) && (buf[0] == '0')) // 輸入 "0"
return 0;

if (strlen(buf) == 2) // 輸入 "xA" or "xB"
{
a = 0;
b = 0;

if (toupper(buf[1]) == 'A')
a = buf[0] - '0';
else if (toupper(buf[1]) == 'B')
b = buf[0] - '0';
else
return -1;

return (a*10+b);
}

if (strlen(buf) != 4)
return -1;

if ((toupper(buf[1]) == 'A') && (toupper(buf[3]) == 'B')) // 輸入 "xAxB"
{
a = buf[0] - '0';
b = buf[2] - '0';
}
else if ((toupper(buf[1]) == 'B') && (toupper(buf[3]) == 'A')) // 輸入 "xBxA"
{
a = buf[2] - '0';
b = buf[0] - '0';
}
else
return -1;

if ((a > 4) || (b > 4))
return -1;

return (a*10+b);
}

/* 初始化數字 */
void fnInitializeNumber()
{
int i;
char number[5];

iGuessTimes = 0;
iTotalNumber = 0;
for (i=0; i<10000; i++)
{
sprintf(number, "%04d", i);
if (fnCheckNumber(number) == 0)
{
iResultNumber[iTotalNumber] = i;
iTotalNumber++;
}
}
}

/* 比對答案 */
void fnGenerateResult(int num, int ab)
{
int temp[10000];
char guess[5], number[5];
int n, i, j;

n = 0;
for (i=0; i<iTotalNumber; i++)
{
sprintf(guess, "%04d", iResultNumber[i]);
sprintf(number, "%04d", num);
for (j=0; j<4; j++)
guess[j] -= '0';
if (fnGuessNumber(number, guess) == ab)
{
temp[n] = iResultNumber[i];
n++;
}
}

for (i=0; i<n; i++)
iResultNumber[i] = temp[i];
iTotalNumber = n;
}

/* 遊戲迴圈主程式 */
int fnPlayGame()
{
int result, finish=0;
char buf[100];
int tmp, ab;
int i;

printf("\n");

fnInitializeNumber();

result = 0;
while (finish == 0)
{
printf("請輸入你要猜的數字(輸入 quit 結束程式) ==> ");
fgets(buf, 100, stdin);
buf[strlen(buf)-1] = 0;
if (strcmp(buf, "quit") == 0)
return 1;

if ( fnCheckNumber(buf) )
{
printf("數字:%s 輸入錯誤, 請重新輸入\n", buf);
continue;
}

finish = fnGuessNumber(buf, iComputerNumber);
printf("數字:%s ==> %1dA %1dB\n", buf, finish/10, finish%10);
result++;
if (finish != 40)
finish = 0;

tmp = rand() % iTotalNumber;
do
{
printf("我猜你的數字為 ==> %04d, 請輸入AB:", iResultNumber[tmp]);
fgets(buf, 100, stdin);
buf[strlen(buf)-1] = 0;
ab = fnProcessAB(buf);
}
while (ab < 0);

iGuessNumber[iGuessTimes] = iResultNumber[tmp];
iGuessResult[iGuessTimes] = ab;
iGuessTimes++;

if (ab != 40)
fnGenerateResult(iResultNumber[tmp], ab);
else
finish += 100;

if (iTotalNumber == 0)
finish = 500;
}

if (finish == 500)
{
printf("無法找到答案, 你一定有輸入錯誤, 請檢查\n");
for (i=0; i<iGuessTimes; i++)
printf("數字 %2d: %04d ==> 你說是 %1dA %1dB\n", i+1, iGuessNumber[i], iGuessResult[i]/10, iGuessResult[i]%10);
printf("我的答案是 %1d%1d%1d%1d\n", iComputerNumber[0], iComputerNumber[1], iComputerNumber[2], iComputerNumber[3]);
}
else if (finish == 100)
{
printf("我在第 %d 次時答對答案. 我贏了.\n", result);
printf("我的答案是 %1d%1d%1d%1d\n", iComputerNumber[0], iComputerNumber[1], iComputerNumber[2], iComputerNumber[3]);
}
else if (finish == 140)
printf("恭喜 !!! 我們在第 %d 次時同時答對答案.\n", result);
else
printf("恭喜 !!! 你在第 %d 次時答對答案. 你贏了.\n", result);

return 0;
}

int main(void)
{
int quit=0;
char buf[100];
char ch;

srand(time(NULL));

while (quit == 0)
{
fnGenerateNumber();

quit = fnPlayGame();

if (quit == 0)
{
printf("\n你要重玩一次嗎 ? (y/n)");
fgets(buf, 100, stdin);
buf[strlen(buf)-1] = 0;
if ((strlen(buf) == 1) && ((buf[0] == 'n') || (buf[0] == 'N')))
quit = 1;
}
}

return 0;
}
關於電腦猜人的部分
我是用比對法 也就是說
從 1234 到 9876 的數字中一個一個去比對你輸入的數字
符合的留下來 不合的刪去
最後一定有答案
除非你故意輸入錯誤
我的方法應該 6-7 次一定猜出來

不知道大大們有沒有其他更好的方法
提出來研究研究吧

人工智慧是很有趣的

TOP

等等......你的srand到哪裡了......

TOP

發新話題

本站所有圖文均屬網友發表,僅代表作者的觀點與本站無關,如有侵權請通知版主會盡快刪除。