經過好多天的撰寫,五子棋專案總算完成,作為一個學了不是很久的小白,我在撰寫程序中也遇到了許多困難,但還好都解決了,在此我建議和我一樣,是小白的都應該寫寫五子棋或三子棋,當然,不是全抄別人的代碼,也不是一遇到不會的就去找,先思考解決方法,多嘗試,即使錯了也沒關系,實在遇到不會的就進行查詢,但查詢過后必須要知道原理,怎么寫的,為什么這樣寫,為什么自己想不到,接下來進行代碼講解:
關于五子棋,其實就是個簡單的游戲,那么作為游戲,就應該有個基礎的框架,開始或結束,我們先來一個游戲框架:
void moshi()
{
printf(" ***-- - 2.玩家對戰-- - ***\n");
printf(" ***-- - 3.人機對戰-- - ***\n");
printf("PS:輸入2進行兩玩家間對決,輸入其他整數進行人機對決\n");
}
void menu()
{
printf("***---1.開始游戲---***\n");
printf("***---0.退出游戲---***\n");
}
int main()
{
int input = 0;
int a = 0;
srand((unsigned int)time(NULL));
do
{
menu();
scanf("%d", &input);
if (input == 1)
{
printf("請選擇模式\n");
moshi();
scanf("%d", &a);
game(a);
break;
}
if (input == 0)
{
printf("已退出\n");
break;
}
else
{
printf("輸入錯誤請重新輸入\n");
}
} while (input);
return 0;
}
do while回圈方便判斷游戲是否進行和游戲結束后直接繼續,不用再做一次選擇
其中的moshi函式是選擇模式人機或玩家,
框架搭好后就是參考頭檔案還有定義行與列
#define _CRT_SECURE_NO_WARNINGS
#define ROW 10
#define COL 10
#include<stdio.h>
#include <stdlib.h>
#include <time.h>
行與列的定義方便修改棋盤,當然我你們也可以讓玩家自己輸入棋盤大小,將行與列撤出定義用scanf即可實作,下面的兩個頭檔案是電腦走棋用的隨機走的頭檔案,從這其實可以看出這個電腦是個‘傻子’畢竟我修為不夠,無法給他設計演算法,
做好這一切后接下來就定義game函式用于游戲地進行
void game(int a)//引a用于判斷是人機還是玩家
{
char board[ROW][COL];
initboard(board, ROW, COL);//初始化棋盤
displayboard(board, ROW, COL);//列印棋盤
if (a == 2)
{
while (1)//玩家間對決
{
printf("先行后列\n");
playeronemovie(board, ROW, COL);
displayboard(board, ROW, COL);//每走一步列印一次棋盤才知道走了哪
full(board, ROW, COL);//平局判定
char ping = full(board, ROW, COL);
if (ping =='o');
break;
win(board, ROW, COL);//贏家判定
char winer = win(board, ROW, COL);
if (winer == 1)//玩家一獲勝回傳1
continue;//如果一贏就跳出下半段從while回圈開始
printf("先行后列\n");
playertwomovie(board, ROW, COL);
displayboard(board, ROW, COL);
full(board, ROW, COL);
if (ping == 'o');
break;
win(board, ROW, COL);
if (winer == 1)
continue;//同理
}
}
else
{
while (1)//人機對決
{
printf("先行后列\n");
playeronemovie(board, ROW, COL);
displayboard(board, ROW, COL);
full(board, ROW, COL);
char ping = full(board, ROW, COL);
if (ping == 'o');
break;
pcwin(board, ROW, COL);
char pcwiner = pcwin(board, ROW, COL);
if (pcwiner == 3)
continue;
printf("先行后列\n");
computermovie(board, ROW, COL);
displayboard(board, ROW, COL);
full(board, ROW, COL);
if (ping == 'o');
break;
pcwin(board, ROW, COL);
if (pcwiner == 4)
continue;//與上述同理
}
}
}
大致以定好,當然不可能第一次就能寫出完整步驟,根據自己所寫對此函式進行補充,接下來就是棋盤,先初始化棋盤,而后對棋盤進行列印,
void initboard(char board[ROW][COL], int row, int clo)//棋盤初始化,防止列印的棋盤空格處出現亂碼
{
int i = 0;
int j = 0;
for (i = 0; i < ROW; i++)
{
for (j = 0; j < COL; j++)
{
board[i][j] = ' ';
}
}
}
void displayboard(char board[ROW][COL], int row, int col)//列印棋盤,先了解棋盤結構,采用for回圈嵌套列印,嵌套兩個小的for回圈(兩個小的for回圈共同構成了棋盤中的一行
{
int lie = 0;
int hang = 0;
int i = 0;
int j = 0;
printf("0");
for (lie = 1; lie <= col; lie++)//列印每一列的序號
{
if (lie + 1 < 10)
printf(" %d ", lie);//此處為空格空格%d空格(依據棋盤每個格子占四列)
if (lie + 1 > 9)
printf(" %d", lie);//大于10時一個數占兩格
}
printf("\n");//對以上整體進行換行,是它能在棋盤上方
for (i = 0; i < row; i++)
{
if (i + 1 < 10)
printf("0%d", i + 1);//列印每行序號因為大于10會出現格子錯亂所以用01 02 這類形式
if (i + 1 > 9)
printf("%d", i + 1);
for (j = 0; j < col; j++)
{
printf(" %c ", board[i][j]);//初始化起作用,能準確定位,方便棋盤的列印
//if(j<col-1)
printf("|");//列印出棋盤第一行的一半
}
printf("\n");//此處換行是為在行的下標仍為0的情況下能使其與第一行的下一半組合,否則會全在這一行中
printf(" ");
int j = 0;
for (j = 0; j < col; j++)
{
printf("---");
//if(j<col-1) //兩個if陳述句可有可無,主要看棋盤設計,無if更順眼
printf("|");//列印出棋盤第一行的下半部分,棋盤第一行完成 且行下標為0,因為仍處于大for回圈中i=0中
}
printf("\n");//繼續換行,防止大的for回圈進行下一次回圈時與此次成一行
}
}
此處列印出的棋盤有行列對應的數字,但我的棋盤僅限于1-99,實際可以更多,但要對棋盤的行進行改動,如果非要防止這種改動,可以把行對應數列印在表格右側,這樣便能實作,我就不改了,要改的話就留給你們自己練習了,其實我一開始是考慮在整個棋盤不變的情況下做行對應數,但并未成功,所以在函式內部進行修改,知道怎么弄的大佬可以在評論區留下方法,
接下來就是玩家一,玩家二與電腦的移動了,玩家一我們用'*',玩家二與電腦我們用‘#’
void playeronemovie(char board[ROW][COL], int row, int col)
{
printf("玩家一請下");
int x = 0;
int y = 0;
while (1)
{
scanf("%d%d", &x, &y);
if (x >= 1 && x <= row && y >= 1 && y <= col)//判斷坐標合法性
{
if (board[x - 1][y - 1] == ' ')//說明此點未下棋
{
board[x - 1][y - 1] = '*';
break;
}
else
{
printf("被占用,請重輸\n");
}
}
else
{
printf("輸入錯誤,請重新輸入\n");
}
}
}
void playertwomovie(char board[ROW][COL], int row, int col)
{
printf("玩家二請下");
int x = 0;
int y = 0;
while (1)
{
scanf("%d%d", &x, &y);
if (x >= 1 && x <= row && y >= 1 && y <= col)//判斷坐標合法性
{
if (board[x - 1][y - 1] == ' ')//說明此點未下棋,減一是因為是下標,很容易忽略
{
board[x - 1][y - 1] = '#';
break;
}
else
{
printf("被占用,請重輸\n");
}
}
else
{
printf("輸入錯誤,請重新輸入\n");
}
}
}
void computermovie(char board[ROW][COL],int row,int col)
{
printf("電腦下\n");
int x = rand()%10;
int y = rand()%10;//余數只能取到一到九,此處也是不會演算法的鍋
while (1)
{
if (board[x][y] == ' ')
{
board[x][y] = '#';
break;
}
}
}
電腦下棋相比玩家要簡單,只要棋盤有空處就會隨機下,不會下到無空處或者是棋盤外,
判斷輸贏,我個人寫的這個步驟較為繁瑣,因為有兩個模式(人機與玩家間),所以輸贏寫兩個函式,但實際寫一個就行,另一個照著第一個修改區域就行
char win(char board[ROW][COL], int row, int col)//玩家對戰玩家
{
int i = 0;
int j = 0;
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
if ( //一行五個
board[i][j] == board[i][i + 1]
&& board[i][j + 1] == board[i][j + 2]
&& board[i][j + 2] == board[i][j + 3]
&& board[i][j + 3] == board[i][j + 4]
&& board[i][j + 4] == '*'
)
{
printf("玩家一獲勝\n");
initboard(board, ROW, COL);
displayboard(board, ROW, COL);
return 1;
}
if ( //一列五個
board[i][j] == board[i+1][j]
&& board[i+1][j] == board[i+2][j]
&& board[i+2][j] == board[i+3][j]
&& board[i+3][j] == board[i+4][j]
&& board[i+4][j] == '*'
)
{
printf("玩家一獲勝\n");
initboard(board, ROW, COL);
displayboard(board, ROW, COL);
return 1;
}
if ( //斜五個
board[i][j] == board[i+1][j + 1]
&& board[i+1][j + 1] == board[i+2][j + 2]
&& board[i+2][j + 2] == board[i+3][j + 3]
&& board[i+3][j + 3] == board[i+4][j + 4]
&& board[i+4][j + 4] == '*'
)
{
printf("玩家一獲勝\n");
initboard(board, ROW, COL);
displayboard(board, ROW, COL);
return 1;
}
if ( //斜五個
board[i][j] == board[i - 1][j - 1]
&& board[i - 1][j - 1] == board[i - 2][j - 2]
&& board[i - 2][j - 2] == board[i - 3][j - 3]
&& board[i - 3][j - 3] == board[i - 4][j - 4]
&& board[i - 4][j - 4] == '*'
)
{
printf("玩家一獲勝\n");
initboard(board, ROW, COL);
displayboard(board, ROW, COL);
return 1;
}//玩家一獲勝情況結束,玩家二也是如此 修改符號即可
}
}
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
if ( //一行五個
board[i][j] == board[i][i + 1]
&& board[i][j + 1] == board[i][j + 2]
&& board[i][j + 2] == board[i][j + 3]
&& board[i][j + 3] == board[i][j + 4]
&& board[i][j + 4] == '#'
)
{
printf("玩家二獲勝\n");
initboard(board, ROW, COL);
displayboard(board, ROW, COL);
return 2;
}
if ( //一列五個
board[i][j] == board[i + 1][j]
&& board[i + 1][j] == board[i + 2][j]
&& board[i + 2][j] == board[i + 3][j]
&& board[i + 3][j] == board[i + 4][j]
&& board[i + 4][j] == '#'
)
{
printf("玩家二獲勝\n");
initboard(board, ROW, COL);
displayboard(board, ROW, COL);
return 2;
}
if ( //斜五個
board[i][j] == board[i + 1][j + 1]
&& board[i + 1][j + 1] == board[i + 2][j + 2]
&& board[i + 2][j + 2] == board[i + 3][j + 3]
&& board[i + 3][j + 3] == board[i + 4][j + 4]
&& board[i + 4][j + 4] == '#'
)
{
printf("玩家二獲勝\n");
initboard(board, ROW, COL);
displayboard(board, ROW, COL);
return 2;
}
if ( //斜五個
board[i][j] == board[i - 1][j - 1]
&& board[i - 1][j - 1] == board[i - 2][j - 2]
&& board[i - 2][j - 2] == board[i - 3][j - 3]
&& board[i - 3][j - 3] == board[i - 4][j - 4]
&& board[i - 4][j - 4] == '#'
)
{
printf("玩家二獲勝\n");
initboard(board, ROW, COL);
displayboard(board, ROW, COL);
return 2;
}//玩家二獲勝情況結束
}
}
}
char pcwin(char board[ROW][COL], int row, int col)
{
int i = 0;
int j = 0;
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
if ( //一行五個
board[i][j] == board[i][i + 1]
&& board[i][j + 1] == board[i][j + 2]
&& board[i][j + 2] == board[i][j + 3]
&& board[i][j + 3] == board[i][j + 4]
&& board[i][j + 4] == '*'
)
{
printf("玩家一獲勝\n");
initboard(board, ROW, COL);
displayboard(board, ROW, COL);
return 3;
}
if ( //一列五個
board[i][j] == board[i + 1][j]
&& board[i + 1][j] == board[i + 2][j]
&& board[i + 2][j] == board[i + 3][j]
&& board[i + 3][j] == board[i + 4][j]
&& board[i + 4][j] == '*'
)
{
printf("玩家一獲勝\n");
initboard(board, ROW, COL);
displayboard(board, ROW, COL);
return 3;
}
if ( //斜五個
board[i][j] == board[i + 1][j + 1]
&& board[i + 1][j + 1] == board[i + 2][j + 2]
&& board[i + 2][j + 2] == board[i + 3][j + 3]
&& board[i + 3][j + 3] == board[i + 4][j + 4]
&& board[i + 4][j + 4] == '*'
)
{
printf("玩家一獲勝\n");
initboard(board, ROW, COL);
displayboard(board, ROW, COL);
return 3;
}
if ( //斜五個
board[i][j] == board[i - 1][j - 1]
&& board[i - 1][j - 1] == board[i - 2][j - 2]
&& board[i - 2][j - 2] == board[i - 3][j - 3]
&& board[i - 3][j - 3] == board[i - 4][j - 4]
&& board[i - 4][j - 4] == '*'
)
{
printf("玩家一獲勝\n");
initboard(board, ROW, COL);
displayboard(board, ROW, COL);
return 3;
}//玩家一獲勝情況結束,玩家二也是如此 修改符號即可
}
}
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
if ( //一行五個
board[i][j] == board[i][i + 1]
&& board[i][j + 1] == board[i][j + 2]
&& board[i][j + 2] == board[i][j + 3]
&& board[i][j + 3] == board[i][j + 4]
&& board[i][j + 4] == '#'
)
{
printf("玩家二獲勝\n");
initboard(board, ROW, COL);
displayboard(board, ROW, COL);
return 4;
}
if ( //一列五個
board[i][j] == board[i + 1][j]
&& board[i + 1][j] == board[i + 2][j]
&& board[i + 2][j] == board[i + 3][j]
&& board[i + 3][j] == board[i + 4][j]
&& board[i + 4][j] == '#'
)
{
printf("玩家二獲勝\n");
initboard(board, ROW, COL);
displayboard(board, ROW, COL);
return 4;
}
if ( //斜五個
board[i][j] == board[i + 1][j + 1]
&& board[i + 1][j + 1] == board[i + 2][j + 2]
&& board[i + 2][j + 2] == board[i + 3][j + 3]
&& board[i + 3][j + 3] == board[i + 4][j + 4]
&& board[i + 4][j + 4] == '#'
)
{
printf("玩家二獲勝\n");
initboard(board, ROW, COL);
displayboard(board, ROW, COL);
return 4;
}
if ( //斜五個
board[i][j] == board[i - 1][j - 1]
&& board[i - 1][j - 1] == board[i - 2][j - 2]
&& board[i - 2][j - 2] == board[i - 3][j - 3]
&& board[i - 3][j - 3] == board[i - 4][j - 4]
&& board[i - 4][j - 4] == '#'
)
{
printf("玩家二獲勝\n");
initboard(board, ROW, COL);
displayboard(board, ROW, COL);
return 4;
}//電腦獲勝情況結束
}
}
}
一方勝后要初始化棋盤,否則任然會在獲勝的棋盤中進行下一輪,這個判斷輸贏的方法很繁瑣,但很明顯,因為暫時沒想到其他方法,
有輸有贏當然也有平局啦,所以我們要寫一個判斷平局的函式,
char full(char board[ROW][COL], int row, int col)
{
int i = 0;
int j = 0;
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
if (board[i][j] == ' ')
return 'c';
}
}
return 'o';//無空格的情況下回傳字符o,在game函式中就可以以此來判斷是否繼續下棋
}
所有的小部分都在這,接下來發整體,
#define _CRT_SECURE_NO_WARNINGS
#define ROW 10
#define COL 10
#include<stdio.h>
#include <stdlib.h>
#include <time.h>
void initboard(char board[ROW][COL], int row, int clo)//棋盤初始化,防止列印的棋盤空格處出現亂碼
{
int i = 0;
int j = 0;
for (i = 0; i < ROW; i++)
{
for (j = 0; j < COL; j++)
{
board[i][j] = ' ';
}
}
}
void displayboard(char board[ROW][COL], int row, int col)//列印棋盤,先了解棋盤結構,采用for回圈嵌套列印,嵌套兩個小的for回圈(兩個小的for回圈共同構成了棋盤中的一行
{
int lie = 0;
int hang = 0;
int i = 0;
int j = 0;
printf("0");
for (lie = 1; lie <= col; lie++)//列印每一列的序號
{
if (lie + 1 < 10)
printf(" %d ", lie);//此處為空格空格%d空格(依據棋盤每個格子占四列)
if (lie + 1 > 9)
printf(" %d", lie);//大于10時一個數占兩格
}
printf("\n");//對以上整體進行換行,是它能在棋盤上方
for (i = 0; i < row; i++)
{
if (i + 1 < 10)
printf("0%d", i + 1);//列印每行序號因為大于10會出現格子錯亂所以用01 02 這類形式
if (i + 1 > 9)
printf("%d", i + 1);
for (j = 0; j < col; j++)
{
printf(" %c ", board[i][j]);//初始化起作用,能準確定位,方便棋盤的列印
//if(j<col-1)
printf("|");//列印出棋盤第一行的一半
}
printf("\n");//此處換行是為在行的下標仍為0的情況下能使其與第一行的下一半組合,否則會全在這一行中
printf(" ");
int j = 0;
for (j = 0; j < col; j++)
{
printf("---");
//if(j<col-1) //兩個if陳述句可有可無,主要看棋盤設計,無if更順眼
printf("|");//列印出棋盤第一行的下半部分,棋盤第一行完成 且行下標為0,因為仍處于大for回圈中i=0中
}
printf("\n");//繼續換行,防止大的for回圈進行下一次回圈時與此次成一行
}
}
void playeronemovie(char board[ROW][COL], int row, int col)
{
printf("玩家一請下");
int x = 0;
int y = 0;
while (1)
{
scanf("%d%d", &x, &y);
if (x >= 1 && x <= row && y >= 1 && y <= col)//判斷坐標合法性
{
if (board[x - 1][y - 1] == ' ')//說明此點未下棋
{
board[x - 1][y - 1] = '*';
break;
}
else
{
printf("被占用,請重輸\n");
}
}
else
{
printf("輸入錯誤,請重新輸入\n");
}
}
}
void playertwomovie(char board[ROW][COL], int row, int col)
{
printf("玩家二請下");
int x = 0;
int y = 0;
while (1)
{
scanf("%d%d", &x, &y);
if (x >= 1 && x <= row && y >= 1 && y <= col)//判斷坐標合法性
{
if (board[x - 1][y - 1] == ' ')//說明此點未下棋,減一是因為是下標,很容易忽略
{
board[x - 1][y - 1] = '#';
break;
}
else
{
printf("被占用,請重輸\n");
}
}
else
{
printf("輸入錯誤,請重新輸入\n");
}
}
}
void computermovie(char board[ROW][COL],int row,int col)
{
printf("電腦下\n");
int x = rand()%10;
int y = rand()%10;
while (1)
{
if (board[x][y] == ' ')
{
board[x][y] = '#';
break;
}
}
}
char win(char board[ROW][COL], int row, int col)//玩家對戰勝者
{
int i = 0;
int j = 0;
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
if ( //一行五個
board[i][j] == board[i][i + 1]
&& board[i][j + 1] == board[i][j + 2]
&& board[i][j + 2] == board[i][j + 3]
&& board[i][j + 3] == board[i][j + 4]
&& board[i][j + 4] == '*'
)
{
printf("玩家一獲勝\n");
initboard(board, ROW, COL);
displayboard(board, ROW, COL);
return 1;
}
if ( //一列五個
board[i][j] == board[i+1][j]
&& board[i+1][j] == board[i+2][j]
&& board[i+2][j] == board[i+3][j]
&& board[i+3][j] == board[i+4][j]
&& board[i+4][j] == '*'
)
{
printf("玩家一獲勝\n");
initboard(board, ROW, COL);
displayboard(board, ROW, COL);
return 1;
}
if ( //斜五個
board[i][j] == board[i+1][j + 1]
&& board[i+1][j + 1] == board[i+2][j + 2]
&& board[i+2][j + 2] == board[i+3][j + 3]
&& board[i+3][j + 3] == board[i+4][j + 4]
&& board[i+4][j + 4] == '*'
)
{
printf("玩家一獲勝\n");
initboard(board, ROW, COL);
displayboard(board, ROW, COL);
return 1;
}
if ( //斜五個
board[i][j] == board[i - 1][j - 1]
&& board[i - 1][j - 1] == board[i - 2][j - 2]
&& board[i - 2][j - 2] == board[i - 3][j - 3]
&& board[i - 3][j - 3] == board[i - 4][j - 4]
&& board[i - 4][j - 4] == '*'
)
{
printf("玩家一獲勝\n");
initboard(board, ROW, COL);
displayboard(board, ROW, COL);
return 1;
}//玩家一獲勝情況結束,玩家二也是如此 修改符號即可
}
}
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
if ( //一行五個
board[i][j] == board[i][i + 1]
&& board[i][j + 1] == board[i][j + 2]
&& board[i][j + 2] == board[i][j + 3]
&& board[i][j + 3] == board[i][j + 4]
&& board[i][j + 4] == '#'
)
{
printf("玩家二獲勝\n");
initboard(board, ROW, COL);
displayboard(board, ROW, COL);
return 2;
}
if ( //一列五個
board[i][j] == board[i + 1][j]
&& board[i + 1][j] == board[i + 2][j]
&& board[i + 2][j] == board[i + 3][j]
&& board[i + 3][j] == board[i + 4][j]
&& board[i + 4][j] == '#'
)
{
printf("玩家二獲勝\n");
initboard(board, ROW, COL);
displayboard(board, ROW, COL);
return 2;
}
if ( //斜五個
board[i][j] == board[i + 1][j + 1]
&& board[i + 1][j + 1] == board[i + 2][j + 2]
&& board[i + 2][j + 2] == board[i + 3][j + 3]
&& board[i + 3][j + 3] == board[i + 4][j + 4]
&& board[i + 4][j + 4] == '#'
)
{
printf("玩家二獲勝\n");
initboard(board, ROW, COL);
displayboard(board, ROW, COL);
return 2;
}
if ( //斜五個
board[i][j] == board[i - 1][j - 1]
&& board[i - 1][j - 1] == board[i - 2][j - 2]
&& board[i - 2][j - 2] == board[i - 3][j - 3]
&& board[i - 3][j - 3] == board[i - 4][j - 4]
&& board[i - 4][j - 4] == '#'
)
{
printf("玩家二獲勝\n");
initboard(board, ROW, COL);
displayboard(board, ROW, COL);
return 2;
}//玩家二獲勝情況結束
}
}
}
char pcwin(char board[ROW][COL], int row, int col)
{
int i = 0;
int j = 0;
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
if ( //一行五個
board[i][j] == board[i][i + 1]
&& board[i][j + 1] == board[i][j + 2]
&& board[i][j + 2] == board[i][j + 3]
&& board[i][j + 3] == board[i][j + 4]
&& board[i][j + 4] == '*'
)
{
printf("玩家一獲勝\n");
initboard(board, ROW, COL);
displayboard(board, ROW, COL);
return 3;
}
if ( //一列五個
board[i][j] == board[i + 1][j]
&& board[i + 1][j] == board[i + 2][j]
&& board[i + 2][j] == board[i + 3][j]
&& board[i + 3][j] == board[i + 4][j]
&& board[i + 4][j] == '*'
)
{
printf("玩家一獲勝\n");
initboard(board, ROW, COL);
displayboard(board, ROW, COL);
return 3;
}
if ( //斜五個
board[i][j] == board[i + 1][j + 1]
&& board[i + 1][j + 1] == board[i + 2][j + 2]
&& board[i + 2][j + 2] == board[i + 3][j + 3]
&& board[i + 3][j + 3] == board[i + 4][j + 4]
&& board[i + 4][j + 4] == '*'
)
{
printf("玩家一獲勝\n");
initboard(board, ROW, COL);
displayboard(board, ROW, COL);
return 3;
}
if ( //斜五個
board[i][j] == board[i - 1][j - 1]
&& board[i - 1][j - 1] == board[i - 2][j - 2]
&& board[i - 2][j - 2] == board[i - 3][j - 3]
&& board[i - 3][j - 3] == board[i - 4][j - 4]
&& board[i - 4][j - 4] == '*'
)
{
printf("玩家一獲勝\n");
initboard(board, ROW, COL);
displayboard(board, ROW, COL);
return 3;
}//玩家一獲勝情況結束,玩家二也是如此 修改符號即可
}
}
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
if ( //一行五個
board[i][j] == board[i][i + 1]
&& board[i][j + 1] == board[i][j + 2]
&& board[i][j + 2] == board[i][j + 3]
&& board[i][j + 3] == board[i][j + 4]
&& board[i][j + 4] == '#'
)
{
printf("玩家二獲勝\n");
initboard(board, ROW, COL);
displayboard(board, ROW, COL);
return 4;
}
if ( //一列五個
board[i][j] == board[i + 1][j]
&& board[i + 1][j] == board[i + 2][j]
&& board[i + 2][j] == board[i + 3][j]
&& board[i + 3][j] == board[i + 4][j]
&& board[i + 4][j] == '#'
)
{
printf("玩家二獲勝\n");
initboard(board, ROW, COL);
displayboard(board, ROW, COL);
return 4;
}
if ( //斜五個
board[i][j] == board[i + 1][j + 1]
&& board[i + 1][j + 1] == board[i + 2][j + 2]
&& board[i + 2][j + 2] == board[i + 3][j + 3]
&& board[i + 3][j + 3] == board[i + 4][j + 4]
&& board[i + 4][j + 4] == '#'
)
{
printf("玩家二獲勝\n");
initboard(board, ROW, COL);
displayboard(board, ROW, COL);
return 4;
}
if ( //斜五個
board[i][j] == board[i - 1][j - 1]
&& board[i - 1][j - 1] == board[i - 2][j - 2]
&& board[i - 2][j - 2] == board[i - 3][j - 3]
&& board[i - 3][j - 3] == board[i - 4][j - 4]
&& board[i - 4][j - 4] == '#'
)
{
printf("玩家二獲勝\n");
initboard(board, ROW, COL);
displayboard(board, ROW, COL);
return 4;
}//電腦獲勝情況結束
}
}
}
char full(char board[ROW][COL], int row, int col)
{
int i = 0;
int j = 0;
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
if (board[i][j] == ' ')
return 'c';
}
}
return 'o';
}
void game(int a)
{
char board[ROW][COL];
initboard(board, ROW, COL);
displayboard(board, ROW, COL);
if (a == 2)
{
while (1)
{
printf("先行后列\n");
playeronemovie(board, ROW, COL);
displayboard(board, ROW, COL);
full(board, ROW, COL);
char ping = full(board, ROW, COL);
if (ping =='o');
printf("平局");
break;
win(board, ROW, COL);
char winer = win(board, ROW, COL);
if (winer == 1)
continue;
printf("先行后列\n");
playertwomovie(board, ROW, COL);
displayboard(board, ROW, COL);
full(board, ROW, COL);
if (ping == 'o');
printf("平局");
break;
win(board, ROW, COL);
if (winer == 1)
continue;
}
}
else
{
while (1)
{
printf("先行后列\n");
playeronemovie(board, ROW, COL);
displayboard(board, ROW, COL);
full(board, ROW, COL);
char ping = full(board, ROW, COL);
if (ping == 'o');
printf("平局");
break;
pcwin(board, ROW, COL);
char pcwiner = pcwin(board, ROW, COL);
if (pcwiner == 3)
continue;
printf("先行后列\n");
computermovie(board, ROW, COL);
displayboard(board, ROW, COL);
full(board, ROW, COL);
if (ping == 'o');
printf("平局");
break;
pcwin(board, ROW, COL);
if (pcwiner == 4)
continue;
}
}
}
void moshi()
{
printf(" ***-- - 2.玩家對戰-- - ***\n");
printf(" ***-- - 3.人機對戰-- - ***\n");
printf("PS:輸入2進行兩玩家間對決,輸入其他整數進行人機對決\n");
}
void menu()
{
printf("***---1.開始游戲---***\n");
printf("***---0.退出游戲---***\n");
}
int main()
{
int input = 0;
int a = 0;
srand((unsigned int)time(NULL));
do
{
menu();
scanf("%d", &input);
if (input == 1)
{
printf("請選擇模式\n");
moshi();
scanf("%d", &a);
game(a);
break;
}
if (input == 0)
{
printf("已退出\n");
break;
}
else
{
printf("輸入錯誤請重新輸入\n");
}
} while (input);
return 0;
}
此代碼共509行,由于技術不夠,只能行數來湊,對于目前的我是個大工程,耗時也長,但做出來還是挺開心的,都看到這了,來個三連吧,求求了,后面可能還會寫個掃雷,當然耗時也會很長,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/348516.html
標籤:其他
