五子棋是一個非常經典的游戲,今天我試著用c語言來寫,可以自定義多少個子連在一起算是勝利,自定義棋盤大小,不足的是AI只能下隨機,沒有一定的分析棋盤能力,
首先理清楚思路,我希望程式能先列印棋盤,然后讓我下棋,之后判斷下棋位置的合法性(不合法則提示我重新下),然后判斷玩家是否勝利,接著判斷平局,機器下則是運用亂數,別的步驟是一樣的,
思路理清開始寫代碼,先寫一個簡單的列印選單;
void menu()
{
printf("-----------------------------------\n");
printf("******* 1.開始游戲 *********\n");
printf("******* 0.退出游戲 *********\n");
printf("-----------------------------------\n");
int input = 0;
char arr[HANG][LIE] = { 0 };
printf("請選擇:");
do
{
scanf("%d", &input);
switch (input)
{
case 1:
game(arr, HANG, LIE);
break;
case 0:
printf("退出");
break;
default:
printf("輸入的值錯誤,請重新輸入:");
}
} while (input);
}
然后寫出游戲函式
void game(char arr[HANG][LIE],int hang,int lie)
{
chushihua(arr, hang, lie);
display(arr, hang, lie);
while (1)
{
if (put_palyer(arr,hang,lie) == 1)
{
display(arr, hang, lie);
printf("\n玩家贏\n");
break;
}
if (is_full(arr, hang, lie))
{
display(arr, hang, lie);
printf("\n平局\n");
break;
}
display(arr, hang, lie);
if (put_computer(arr,hang,lie) == 1)
{
display(arr, hang, lie);
printf("電腦贏");
break;
}
if (is_full(arr, hang, lie))
{
display(arr, hang, lie);
printf("\n平局\n");
break;
}
display(arr, hang, lie);
}
menu();//我希望結束后玩家能看到上次結束時的完整棋盤,并可以選擇是否進行下一次游戲
}
當然陣列最好是要初始化一下
void chushihua(char arr[HANG][LIE], int hang, int lie)
{
int i = 0;
int j = 0;
for (i = 0; i < hang; i++)
{
for (j = 0; j < lie; j++)
arr[i][j] = ' ';
}
}
之后寫出列印函式,能列印出棋盤
void display(char arr[HANG][LIE], int hang, int lie)
{
system("cls");
int i = 0;
int j = 0;
for (i = 0; i < hang; i++)
printf(" %d ", i + 1);
printf("\n");
for (i = 0; i < hang; i++)
{
printf("%d", i + 1);
for (j = 0; j < lie-1; j++)
{
printf(" %c |", arr[i][j]);
}
printf(" %c\n ", arr[i][j]);
if (i < hang - 1)
{
for (j = 0; j < lie - 1; j++)
printf("---|");
printf("---\n");
}
}
}
接著寫出 玩家和計算機下棋的函式
int put_palyer(char arr[HANG][LIE],int hang,int lie)
{
int i = 0;
int j = 0;
printf("(#方)請輸入坐標:");
while (1)
{
scanf("%d %d", &i, &j);
if (i < 1 || i > hang || j < 1 || j > lie)
{
printf("坐標非法,重新輸入:");
continue;
}
else if (arr[i-1][j-1] != ' ')
{
printf("坐標占用,重新輸入:");
continue;
}
else
{
arr[i-1][j-1] = '#';
break;
}
}
if (panduan(arr, hang, lie, '#') == 1)
return 1;
return 0;
}
int put_computer(char arr[HANG][LIE], int hang, int lie)
{
while (1)
{
int i = rand() % hang;
srand((unsigned int)time(NULL));
int j = rand() % lie;
if (0 <= i && i < hang && 0 <= j && j < lie && arr[i][j] == ' ')
{
arr[i][j] = '@';
break;
}
}
if (panduan(arr, hang, lie, '@') == 1)
return 1;
return 0;
}
最后最難的是實作判斷輸贏的函式
我的思路是4個大判斷 分別為豎直 水平 左上到右下 左下到右上 4 個大判斷
然后創建一個全域變數flag 如果在某行 或者 某列 或者 某斜線中 發現有玩家或者電腦下的棋,flag就+1,但是如果沒有,就說明被斷開了,flag就要變為0,在這一列,或者在這行中,或者在這斜線中,發現flag=5,那么就可以說明玩家或者電腦獲勝,非常需要注意的是,換行,換列,換斜線都要重新讓flag=0,
知道了判斷思路,但是怎么寫判斷程序呢,豎直和水平是很容易的,難點是斜線判斷,這里引入區域變數k,再次將左上到右下,左下到右上分別分為兩個部分,

我們來看左上到右下的程序,分為兩個部分,靠上的箭頭和靠下的箭頭,
從靠下的箭頭來講,我希望用k來表示判斷斜線的下移,但是因為五子棋的緣故,所以k最大為hang-5,其中hang為行數,然后就像豎直和水平那樣,進行判斷,但是每次行都要以k為起始位置,
從靠上的箭頭來講,我希望用k來表示判斷斜線的右移,但是因為五子棋的緣故,所以k最低為lie-5,其中lie為列數,然后就和上面的是一樣,只不過,k最大為lie-5,列數每次都從k開始,
int panduan2(char x,char y)
{
if (x == y)
flag++;
else
flag = 0;
if (flag == 5)
return 1;
return 0;
}
int panduan(char arr[HANG][LIE], int hang, int lie, char a)
{
int flag = 0;
int i = 0;
int j = 0;
int k = 0;
for (i = 0; i < hang; i++)//橫向判斷
{
flag = 0;
for (j = 0; j < lie; j++)
if (panduan2(arr[i][j], a) == 1)
return 1;
}
for (j = 0; j < hang; j++)//豎向判斷
{
flag = 0;
for (i = 0; i < lie; i++)
if (panduan2(arr[i][j], a) == 1)
return 1;
}
for (k = 0; k < hang - 4; k++)
{
flag = 0;
for (i = k, j = 0; i < hang; i++, j++)
if (panduan2(arr[i][j], a) == 1)
return 1;
}
for (k = 1; k < lie - 4; k++)
{
flag = 0;
for (i = 0, j = k; j < lie; i++, j++)
if (panduan2(arr[i][j], a) == 1)
return 1;
}
for (k = hang - 1; k > 3; k--)
{
flag = 0;
for (i = k, j = 0; i >= 0; i--, j++)
if (panduan2(arr[i][j], a) == 1)
return 1;
}
for (k = 1; k < lie - 4; k++)
{
flag = 0;
for (i = hang - 1, j = k; j < lie; j++, i--)
if (panduan2(arr[i][j], a) == 1)
return 1;
}
return 0;
}
左下到右上也是一樣的方法和思路,
最后我們還需要寫一個判斷平局的代碼,
int is_full(char arr[HANG][LIE], int hang, int lie)
{
int i = 0;
int j = 0;
for (i = 0; i < hang; i++)
{
for (j = 0; j < lie; j++)
if (arr[i][j] == ' ')
return 0;
}
return 1;
}
最后完成了整個程式的基本實作邏輯,
gitee鏈接:RoseIsBlue/learning_c_language - Gitee.com
11.8的代碼
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/354768.html
標籤:其他
上一篇:你認為的智慧社區是怎樣的?
