五子棋(人機對弈)
人事三杯酒,流年一局棋, ------《句》李遠
1.既然是棋,先得有棋盤
--先畫個棋盤--
void draw_map()
{
int i, j;
for(i=0; i<H; i++)
for(j=0; j<W; j++){
gotoxy(i,j);
printf("-");
}
for(i=0; i<H; i++)
gotoxy(i,W),
printf("%2d",i);
for(i=0; i<W; i++,i++) //游戲最小單位為兩個字符故i連續++
gotoxy(H,i),
printf("%2d",i/2);
gotoxy(0,50);
printf("是五子棋");
gotoxy(5,50);
printf("輸入坐標為四位字符型《前兩位為行*后兩位為列》");
gotoxy(6,50);
printf(" (0--19) (0--19)");
}
2.有了棋盤,還得有棋子,人機對弈,顧名思義,黑先白后,人執黑,人機執白
--map存棋子狀態,下標表示棋子位置,數值為0表示空,為1表示玩家已下棋子,為2表示人機已下棋子--
--chess存棋子坐標,第二個下標為0表示棋子行坐標,為1表示棋子列坐標--
int map[H][W]; //棋盤狀態
int chess[H*W/4][2], ai_chess[H*W/4][2]; //玩家/人機棋子坐標
int chess_num, ai_chess_num; //玩家/人機落子總數
3.棋盤和棋子準備妥當,接下來就是下棋的狀態了
--這里用scanf函式來實作下棋的動作--
--輸入四位字符型數值,前兩位表示行坐標,后兩位表示列坐標--
--滿足落子的條件才可落子(不能落子到棋盤外,也不能落子在已落子處)--
void in_chess()
{
int i;
ret:;
gotoxy(10,50);
printf("請輸入落子坐標:");
scanf("%4d:",&data);
data_now[chess_num] = data;
gotoxy(15,50);
printf("當前輸入坐標為:");
printf("%4d",data_now[chess_num]);
if(((data/100)<20)&&((data%100)<20)){ //輸入坐標必須在棋盤內才列印棋子
for(i=0 ; i<=chess_num; i++) //輸入坐標不能是已經落子的位置
if(((data/100)==chess[i][0])&&((data%100)==chess[i][1]))
goto ret;
for(i=0 ; i<=ai_chess_num; i++) //也不能落在人機已經落子位置
if(((data/100)==ai_chess[i][0])&&((data%100)==ai_chess[i][1]))
goto ret;
out_chess();
chess_num++;
}
Ai_chess(); //玩家落子后人機落子
a = 0; //標識置零,進入清空輸入坐標函式
}
void if_chess()
{
gotoxy(10,65);
printf(" ");
a = 1;
}
void out_chess()
{
chess[chess_num][0] = data_now[chess_num]/100; //整除得到高二位數值即輸入行坐標
chess[chess_num][1] = data_now[chess_num]%100; //取余得到低二位數值即輸入列坐標
gotoxy(chess[chess_num][0],chess[chess_num][1]*2); //*2理解如上
printf("@@");
map[chess[chess_num][0]][chess[chess_num][1]*2] = 1;
}
4.接下來就需要判斷勝負了
--遍歷棋盤--
--找到第一個棋子位置--
--判斷這個棋子右邊相鄰四個位置是否是同陣營棋子--
--如果是,達成五子相連條件,游戲勝利--
--如果不是,繼續判斷下邊四個位置與右下四個位置與左下四個位置是否是同陣營棋子--
(這里只粘貼了一行的判斷條件,完整代碼如后)
--若都不是,繼續遍歷棋盤,找到第二個棋子位置,再次判斷,直到遍歷完整個棋盤--
--再重復一遍流程,判斷人機是否獲勝--
(由于從左上挨個挨個棋子遍歷,所以只需要判斷右邊,右下,下邊,左下四個方向的棋子連接情況)
for(i=0; i<H; i++)
for(j=0; j<W; j+=2){
if(map[i][j] == 1){
if((map[i+1][j] == 1)&&(map[i+2][j] == 1)&&(map[i+3][j] == 1)&&(map[i+4][j] == 1)){
for(k=0; k<5; k++){
gotoxy(i+k,j);
printf(" ");
}
Sleep(1000); //延時1秒
system("cls"); //清屏
gotoxy(10,10);
printf("win!");
system("pause"); //暫停
}
5.最后是程式核心==>實作低智能人機運算
--就是一個對棋盤中出現的各種情況人機不同的落子方式--
--面對不同的棋盤情況,需要優先處理更“急”的情況,所以不同的判斷陳述句有一個先后順序--
--當滿足了一種可以落子的情況,落子后需要馬上跳到函式底端(跳出多層回圈體/判斷陳述句),這里用了goto--
(人機一次只能落一個子)
--怎么判斷棋盤情況其實和判斷勝負的情況差不多,都是先遍歷棋盤,再根據不同的棋盤情況落子--
有兩個缺點
--人機代碼比較沉長,因為呼叫了goto,無法函式嵌套,整個代碼塊可讀性比較差,判斷的情況也較少,人機智能程度不高--
--落子在棋盤邊緣的情況沒有一個很好地考慮,整個程式還有待提高--
以下是源代碼
#include<stdio.h>
#include<windows.h>
#define W 40 //棋盤寬
#define H 20 //棋盤高
int map[H][W]; //棋盤狀態
int chess[H*W/4][2], ai_chess[H*W/4][2]; //玩家/人機棋子坐標
int chess_num, ai_chess_num; //玩家/人機落子總數
int data_now[H*W/2]; //存放輸入坐標
int data; //輸入坐標暫存變數
int a; //判斷標識
/*******移動游標函式********/
void gotoxy(int i,int j)
{
COORD position={j,i};
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),position);
}
void init(); //初始化
void draw_map(); //畫棋盤
void out_chess(); //列印玩家落子
void Ai_chess(); //人機落子
void in_chess(); //棋子坐標輸入與顯示
void if_chess(); //清空輸入坐標
void deleter(); //勝負判斷
int main()
{
init();
draw_map();
while(1){
if(a)
in_chess();
if(!a)
if_chess();
deleter();
}
return 0;
}
void init()
{
/**********gotoxy()初始化***********/
CONSOLE_CURSOR_INFO cursor_info = {1, 0};
SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursor_info);
data = 0;
a = 1;
}
void draw_map()
{
int i, j;
for(i=0; i<H; i++)
for(j=0; j<W; j++){
gotoxy(i,j);
printf("-");
}
for(i=0; i<H; i++)
gotoxy(i,W),
printf("%2d",i);
for(i=0; i<W; i++,i++) //游戲最小單位為兩個字符故i連續++
gotoxy(H,i),
printf("%2d",i/2);
gotoxy(0,50);
printf("是五子棋");
gotoxy(5,50);
printf("輸入坐標為四位字符型《前兩位為行*后兩位為列》");
gotoxy(6,50);
printf(" (0--19) (0--19)");
}
void in_chess()
{
int i;
ret:;
gotoxy(10,50);
printf("請輸入落子坐標:");
scanf("%4d:",&data);
data_now[chess_num] = data;
gotoxy(15,50);
printf("當前輸入坐標為:");
printf("%4d",data_now[chess_num]);
if(((data/100)<20)&&((data%100)<20)){ //輸入坐標必須在棋盤內才列印棋子
for(i=0 ; i<=chess_num; i++) //輸入坐標不能是已經落子的位置
if(((data/100)==chess[i][0])&&((data%100)==chess[i][1]))
goto ret;
for(i=0 ; i<=ai_chess_num; i++) //也不能落在人機已經落子位置
if(((data/100)==ai_chess[i][0])&&((data%100)==ai_chess[i][1]))
goto ret;
out_chess();
chess_num++;
}
Ai_chess(); //玩家落子后人機落子
a = 0; //標識置零,進入清空輸入坐標函式
}
/********其實這個函式可以整合到上一個函式*********/
/********分開兩個函式寫以便于更清晰的邏輯*********/
void if_chess()
{
gotoxy(10,65);
printf(" ");
a = 1;
}
void out_chess()
{
chess[chess_num][0] = data_now[chess_num]/100; //整除得到高二位數值即輸入行坐標
chess[chess_num][1] = data_now[chess_num]%100; //取余得到低二位數值即輸入列坐標
gotoxy(chess[chess_num][0],chess[chess_num][1]*2); //*2理解如上
printf("@@");
map[chess[chess_num][0]][chess[chess_num][1]*2] = 1;
}
/*************人機判斷如何落子****************/
/*********先遍歷棋盤再判斷落子情況************/
/********goto用于跳出多層回圈判斷陳述句*********/
void Ai_chess()
{
int i, j;
for(i=0; i<H; i++){ //第一次遍歷
for(j=0; j<W; j+=2){
if(map[i][j] == 2){
if((map[i+1][j] == 2)&&(map[i+2][j] == 2)&&(map[i+3][j] == 2)){ //第一種情況,如果人機已有四個棋子按列連著
if((map[i-1][j]==0)&&(map[i+4][j]==0)){ //四個棋子兩邊都為空
gotoxy(i+4,j);
printf("##");
ai_chess[ai_chess_num][0] = i+4;
ai_chess[ai_chess_num][1] = j;
map[ai_chess[ai_chess_num][0]][ai_chess[ai_chess_num][1]] = 2;
ai_chess_num++;
goto here; //已落子已保存資料即跳到函式底端
}
if((map[i-1][j]==0)&&(map[i+4][j]!=0)){ //四個棋子一邊為空就落子另一邊
gotoxy(i-1,j);
printf("##");
ai_chess[ai_chess_num][0] = i-1;
ai_chess[ai_chess_num][1] = j;
map[ai_chess[ai_chess_num][0]][ai_chess[ai_chess_num][1]] = 2;
ai_chess_num++;
goto here;
}
if((map[i-1][j]!=0)&&(map[i+4][j]==0)){ //同上,另一邊棋子為空就落子這一邊
gotoxy(i+4,j);
printf("##");
ai_chess[ai_chess_num][0] = i+4;
ai_chess[ai_chess_num][1] = j;
map[ai_chess[ai_chess_num][0]][ai_chess[ai_chess_num][1]] = 2;
ai_chess_num++;
goto here;
}
} //第一種情況沒有生效則判斷下一種情況
if((map[i][j+2] == 2)&&(map[i][j+4] == 2)&&(map[i][j+6] == 2)){ //四個棋子按行連著
if((map[i][j-2]==0)&&(map[i][j+8]==0)){
gotoxy(i,j+8);
printf("##");
ai_chess[ai_chess_num][0] = i;
ai_chess[ai_chess_num][1] = j+8;
map[ai_chess[ai_chess_num][0]][ai_chess[ai_chess_num][1]] = 2;
ai_chess_num++;
goto here;
}
if((map[i][j-2]==0)&&(map[i][j+8]!=0)){
gotoxy(i,j-2);
printf("##");
ai_chess[ai_chess_num][0] = i;
ai_chess[ai_chess_num][1] = j-2;
map[ai_chess[ai_chess_num][0]][ai_chess[ai_chess_num][1]] = 2;
ai_chess_num++;
goto here;
}
if((map[i][j-2]!=0)&&(map[i][j+8]==0)){
gotoxy(i,j+8);
printf("##");
ai_chess[ai_chess_num][0] = i;
ai_chess[ai_chess_num][1] = j+8;
map[ai_chess[ai_chess_num][0]][ai_chess[ai_chess_num][1]] = 2;
ai_chess_num++;
goto here;
}
}
if((map[i+1][j+2] == 2)&&(map[i+2][j+4] == 2)&&(map[i+3][j+6] == 2)){ //四個棋子按右下斜連著
if((map[i-1][j-2]==0)&&(map[i+4][j+8]==0)){
gotoxy(i+4,j+8);
printf("##");
ai_chess[ai_chess_num][0] = i+4;
ai_chess[ai_chess_num][1] = j+8;
map[ai_chess[ai_chess_num][0]][ai_chess[ai_chess_num][1]] = 2;
ai_chess_num++;
goto here;
}
if((map[i-1][j-2]==0)&&(map[i+4][j+8]!=0)){
gotoxy(i-1,j-2);
printf("##");
ai_chess[ai_chess_num][0] = i-1;
ai_chess[ai_chess_num][1] = j-2;
map[ai_chess[ai_chess_num][0]][ai_chess[ai_chess_num][1]] = 2;
ai_chess_num++;
goto here;
}
if((map[i-1][j-2]!=0)&&(map[i+4][j+8]==0)){
gotoxy(i+4,j+8);
printf("##");
ai_chess[ai_chess_num][0] = i+4;
ai_chess[ai_chess_num][1] = j+8;
map[ai_chess[ai_chess_num][0]][ai_chess[ai_chess_num][1]] = 2;
ai_chess_num++;
goto here;
}
}
if((map[i+1][j-2] == 2)&&(map[i+2][j-4] == 2)&&(map[i+3][j-6] == 2)){ //四個棋子按左下斜連著
if((map[i-1][j+2]==0)&&(map[i+4][j-8]==0)){
gotoxy(i+4,j-8);
printf("##");
ai_chess[ai_chess_num][0] = i+4;
ai_chess[ai_chess_num][1] = j-8;
map[ai_chess[ai_chess_num][0]][ai_chess[ai_chess_num][1]] = 2;
ai_chess_num++;
goto here;
}
if((map[i-1][j+2]==0)&&(map[i+4][j-8]!=0)){
gotoxy(i-1,j+2);
printf("##");
ai_chess[ai_chess_num][0] = i-1;
ai_chess[ai_chess_num][1] = j+2;
map[ai_chess[ai_chess_num][0]][ai_chess[ai_chess_num][1]] = 2;
ai_chess_num++;
goto here;
}
if((map[i-1][j+2]!=0)&&(map[i+4][j-8]==0)){
gotoxy(i+4,j-8);
printf("##");
ai_chess[ai_chess_num][0] = i+4;
ai_chess[ai_chess_num][1] = j-8;
map[ai_chess[ai_chess_num][0]][ai_chess[ai_chess_num][1]] = 2;
ai_chess_num++;
goto here;
}
}
}
}
}
for(i=0; i<H; i++){ //再次遍歷
for(j=0; j<W; j+=2){
if(map[i][j] == 1){
if((map[i+1][j] == 1)&&(map[i+2][j] == 1)&&(map[i+3][j] == 1)){ //堵玩家已經有四個棋子按列連著(垂死掙扎)
if((map[i-1][j]==0)&&(map[i+4][j]==0)){
gotoxy(i+4,j);
printf("##");
ai_chess[ai_chess_num][0] = i+4;
ai_chess[ai_chess_num][1] = j;
map[ai_chess[ai_chess_num][0]][ai_chess[ai_chess_num][1]] = 2;
ai_chess_num++;
goto here;
}
if((map[i-1][j]==0)&&(map[i+4][j]!=0)){ //這四個棋子有一端已經封住(可以搶救)
gotoxy(i-1,j);
printf("##");
ai_chess[ai_chess_num][0] = i-1;
ai_chess[ai_chess_num][1] = j;
map[ai_chess[ai_chess_num][0]][ai_chess[ai_chess_num][1]] = 2;
ai_chess_num++;
goto here;
}
if((map[i-1][j]!=0)&&(map[i+4][j]==0)){ //四個棋子另一端被封住(搶救有效)
gotoxy(i+4,j);
printf("##");
ai_chess[ai_chess_num][0] = i+4;
ai_chess[ai_chess_num][1] = j;
map[ai_chess[ai_chess_num][0]][ai_chess[ai_chess_num][1]] = 2;
ai_chess_num++;
goto here;
}
}
if((map[i][j+2] == 1)&&(map[i][j+4] == 1)&&(map[i][j+6] == 1)){ //堵玩家已經有四個棋子按行連著
if((map[i][j-2]==0)&&(map[i][j+8]==0)){
gotoxy(i,j+8);
printf("##");
ai_chess[ai_chess_num][0] = i;
ai_chess[ai_chess_num][1] = j+8;
map[ai_chess[ai_chess_num][0]][ai_chess[ai_chess_num][1]] = 2;
ai_chess_num++;
goto here;
}
if((map[i][j-2]==0)&&(map[i][j+8]!=0)){
gotoxy(i,j-2);
printf("##");
ai_chess[ai_chess_num][0] = i;
ai_chess[ai_chess_num][1] = j-2;
map[ai_chess[ai_chess_num][0]][ai_chess[ai_chess_num][1]] = 2;
ai_chess_num++;
goto here;
}
if((map[i][j-2]!=0)&&(map[i][j+8]==0)){
gotoxy(i,j+8);
printf("##");
ai_chess[ai_chess_num][0] = i;
ai_chess[ai_chess_num][1] = j+8;
map[ai_chess[ai_chess_num][0]][ai_chess[ai_chess_num][1]] = 2;
ai_chess_num++;
goto here;
}
}
if((map[i+1][j+2] == 1)&&(map[i+2][j+4] == 1)&&(map[i+3][j+6] == 1)){ //堵玩家已經有四個棋子按右下斜連著
if((map[i-1][j-2]==0)&&(map[i+4][j+8]==0)){
gotoxy(i+4,j+8);
printf("##");
ai_chess[ai_chess_num][0] = i+4;
ai_chess[ai_chess_num][1] = j+8;
map[ai_chess[ai_chess_num][0]][ai_chess[ai_chess_num][1]] = 2;
ai_chess_num++;
goto here;
}
if((map[i-1][j-2]==0)&&(map[i+4][j+8]!=0)){
gotoxy(i-1,j-2);
printf("##");
ai_chess[ai_chess_num][0] = i-1;
ai_chess[ai_chess_num][1] = j-2;
map[ai_chess[ai_chess_num][0]][ai_chess[ai_chess_num][1]] = 2;
ai_chess_num++;
goto here;
}
if((map[i-1][j-2]!=0)&&(map[i+4][j+8]==0)){
gotoxy(i+4,j+8);
printf("##");
ai_chess[ai_chess_num][0] = i+4;
ai_chess[ai_chess_num][1] = j+8;
map[ai_chess[ai_chess_num][0]][ai_chess[ai_chess_num][1]] = 2;
ai_chess_num++;
goto here;
}
}
if((map[i+1][j-2] == 1)&&(map[i+2][j-4] == 1)&&(map[i+3][j-6] == 1)){ //堵玩家已經有四個棋子按左下斜連著
if((map[i-1][j+2]==0)&&(map[i+4][j-8]==0)){
gotoxy(i+4,j-8);
printf("##");
ai_chess[ai_chess_num][0] = i+4;
ai_chess[ai_chess_num][1] = j-8;
map[ai_chess[ai_chess_num][0]][ai_chess[ai_chess_num][1]] = 2;
ai_chess_num++;
goto here;
}
if((map[i-1][j+2]==0)&&(map[i+4][j-8]!=0)){
gotoxy(i-1,j+2);
printf("##");
ai_chess[ai_chess_num][0] = i-1;
ai_chess[ai_chess_num][1] = j+2;
map[ai_chess[ai_chess_num][0]][ai_chess[ai_chess_num][1]] = 2;
ai_chess_num++;
goto here;
}
if((map[i-1][j+2]!=0)&&(map[i+4][j-8]==0)){
gotoxy(i+4,j-8);
printf("##");
ai_chess[ai_chess_num][0] = i+4;
ai_chess[ai_chess_num][1] = j-8;
map[ai_chess[ai_chess_num][0]][ai_chess[ai_chess_num][1]] = 2;
ai_chess_num++;
goto here;
}
}
if((map[i+1][j] == 1)&&(map[i+2][j] == 1)){ //玩家三個棋子連著必須堵一邊
if((map[i-1][j]==0)&&(map[i+3][j]==0)){
if(i == 0){ //落在邊界情況
gotoxy(i+3,j);
printf("##");
ai_chess[ai_chess_num][0] = i+3;
ai_chess[ai_chess_num][1] = j;
map[ai_chess[ai_chess_num][0]][ai_chess[ai_chess_num][1]] = 2;
ai_chess_num++;
goto here;
}
if(i == H-1){
gotoxy(i-1,j);
printf("##");
ai_chess[ai_chess_num][0] = i-1;
ai_chess[ai_chess_num][1] = j;
map[ai_chess[ai_chess_num][0]][ai_chess[ai_chess_num][1]] = 2;
ai_chess_num++;
goto here;
}
else //不在邊界情況
{
int s;
s = rand()%2; //因為兩邊為空可以用個偽亂數隨機落子在一邊
gotoxy(i-1+4*s,j); //必要性不大后面就沒有用了
printf("##");
ai_chess[ai_chess_num][0] = i-1+4*s;
ai_chess[ai_chess_num][1] = j;
map[ai_chess[ai_chess_num][0]][ai_chess[ai_chess_num][1]] = 2;
ai_chess_num++;
goto here;
}
}
}
if((map[i][j+2] == 1)&&(map[i][j+4] == 1)){
if((map[i][j-2]==0)&&(map[i][j+6]==0)){
if(j == 0){
gotoxy(i,j+6);
printf("##");
ai_chess[ai_chess_num][0] = i;
ai_chess[ai_chess_num][1] = j+6;
map[ai_chess[ai_chess_num][0]][ai_chess[ai_chess_num][1]] = 2;
ai_chess_num++;
goto here;
}
if(j == W-2){
gotoxy(i,j-2);
printf("##");
ai_chess[ai_chess_num][0] = i;
ai_chess[ai_chess_num][1] = j-2;
map[ai_chess[ai_chess_num][0]][ai_chess[ai_chess_num][1]] = 2;
ai_chess_num++;
goto here;
}
else
{
int s;
s = rand()%2;
gotoxy(i,j-2+8*s);
printf("##");
ai_chess[ai_chess_num][0] = i;
ai_chess[ai_chess_num][1] = j-2+8*s;
map[ai_chess[ai_chess_num][0]][ai_chess[ai_chess_num][1]] = 2;
ai_chess_num++;
goto here;
}
}
}
if((map[i+1][j+2] == 1)&&(map[i+2][j+4] == 1)){
if((map[i-1][j-2]==0)&&(map[i+3][j+6]==0)){
if(i == 0){ //斜邊的邊界判斷不夠完善(右下)
gotoxy(i+3,j+6);
printf("##");
ai_chess[ai_chess_num][0] = i+3;
ai_chess[ai_chess_num][1] = j+6;
map[ai_chess[ai_chess_num][0]][ai_chess[ai_chess_num][1]] = 2;
ai_chess_num++;
goto here;
}
if(i == H-1){
gotoxy(i-1,j-2);
printf("##");
ai_chess[ai_chess_num][0] = i-1;
ai_chess[ai_chess_num][1] = j-2;
map[ai_chess[ai_chess_num][0]][ai_chess[ai_chess_num][1]] = 2;
ai_chess_num++;
goto here;
}
else
{
int s;
s = rand()%2;
gotoxy(i-1+4*s,j-2+8*s);
printf("##");
ai_chess[ai_chess_num][0] = i-1+4*s;
ai_chess[ai_chess_num][1] = j-2+8*s;
map[ai_chess[ai_chess_num][0]][ai_chess[ai_chess_num][1]] = 2;
ai_chess_num++;
goto here;
}
}
}
if((map[i+1][j-2] == 1)&&(map[i+2][j-4] == 1)){
if((map[i-1][j+2]==0)&&(map[i+3][j-6]==0)){
if(i == 0){ //左下
gotoxy(i+3,j-6);
printf("##");
ai_chess[ai_chess_num][0] = i+3;
ai_chess[ai_chess_num][1] = j-6;
map[ai_chess[ai_chess_num][0]][ai_chess[ai_chess_num][1]] = 2;
ai_chess_num++;
goto here;
}
if(i == H-1){
gotoxy(i-1,j+2);
printf("##");
ai_chess[ai_chess_num][0] = i-1;
ai_chess[ai_chess_num][1] = j+2;
map[ai_chess[ai_chess_num][0]][ai_chess[ai_chess_num][1]] = 2;
ai_chess_num++;
goto here;
}
else
{
int s;
s = rand()%2;
gotoxy(i-1+4*s,j+2+8*(-s));
printf("##");
ai_chess[ai_chess_num][0] = i-1+4*s;
ai_chess[ai_chess_num][1] = j+2+8*(-s);
map[ai_chess[ai_chess_num][0]][ai_chess[ai_chess_num][1]] = 2;
ai_chess_num++;
goto here;
}
}
}
}
}
}
for(i=0; i<H; i++){ //第三次遍歷
for(j=0; j<W; j+=2){ //這次遍歷是判斷人機自身了
if(map[i][j] == 2){
if((map[i+1][j] == 2)&&(map[i+2][j] == 2)){ //人機有三個棋子按列連著
if((map[i-1][j] == 0)&&(map[i+3][j] == 0)){
gotoxy(i-1,j);
printf("##");
ai_chess[ai_chess_num][0] = i-1;
ai_chess[ai_chess_num][1] = j;
map[ai_chess[ai_chess_num][0]][ai_chess[ai_chess_num][1]] = 2;
ai_chess_num++;
goto here;
}
}
if((map[i][j+2] == 2)&&(map[i][j+4] == 2)){ //按行連著
if((map[i][j-2] == 0)&&(map[i][j+6] == 0)){
gotoxy(i,j-2);
printf("##");
ai_chess[ai_chess_num][0] = i;
ai_chess[ai_chess_num][1] = j-2;
map[ai_chess[ai_chess_num][0]][ai_chess[ai_chess_num][1]] = 2;
ai_chess_num++;
goto here;
}
}
if((map[i+1][j+2] == 2)&&(map[i+2][j+4] == 2)){ //斜右下連著
if((map[i-1][j-2] == 0)&&(map[i+3][j+6] == 0)){
gotoxy(i-1,j-2);
printf("##");
ai_chess[ai_chess_num][0] = i-1;
ai_chess[ai_chess_num][1] = j-2;
map[ai_chess[ai_chess_num][0]][ai_chess[ai_chess_num][1]] = 2;
ai_chess_num++;
goto here;
}
}
if((map[i+1][j-2] == 2)&&(map[i+2][j-4] == 2)){ //斜左下連著
if((map[i-1][j+2] == 0)&&(map[i+3][j-6] == 0)){
gotoxy(i-1,j+2);
printf("##");
ai_chess[ai_chess_num][0] = i-1;
ai_chess[ai_chess_num][1] = j+2;
map[ai_chess[ai_chess_num][0]][ai_chess[ai_chess_num][1]] = 2;
ai_chess_num++;
goto here;
}
}
}
}
}
for(i=0; i<H; i++){ //第四次遍歷
for(j=0; j<W; j+=2){ //還是判斷人機自身(可以和第三次遍歷放在一起,放在第三次末尾)
if(map[i][j] == 2){
if(map[i+1][j] == 2){ //人機有兩個棋子按列連著
if((map[i-1][j] == 0)&&(map[i+2][j] == 0)){
gotoxy(i-1,j);
printf("##");
ai_chess[ai_chess_num][0] = i-1;
ai_chess[ai_chess_num][1] = j;
map[ai_chess[ai_chess_num][0]][ai_chess[ai_chess_num][1]] = 2;
ai_chess_num++;
goto here;
}
}
if(map[i][j+2] == 2){ //按行連著
if((map[i][j-2] == 0)&&(map[i][j+4] == 0)){
gotoxy(i,j-2);
printf("##");
ai_chess[ai_chess_num][0] = i;
ai_chess[ai_chess_num][1] = j-2;
map[ai_chess[ai_chess_num][0]][ai_chess[ai_chess_num][1]] = 2;
ai_chess_num++;
goto here;
}
}
if(map[i+1][j+2] == 2){ //按斜右下連著
if((map[i-1][j-2] == 0)&&(map[i+2][j+4] == 0)){
gotoxy(i-1,j-2);
printf("##");
ai_chess[ai_chess_num][0] = i-1;
ai_chess[ai_chess_num][1] = j-2;
map[ai_chess[ai_chess_num][0]][ai_chess[ai_chess_num][1]] = 2;
ai_chess_num++;
goto here;
}
}
if(map[i+1][j-2] == 2){ //按斜左下連著
if((map[i-1][j+2] == 0)&&(map[i+2][j-4] == 0)){
gotoxy(i-1,j+2);
printf("##");
ai_chess[ai_chess_num][0] = i-1;
ai_chess[ai_chess_num][1] = j+2;
map[ai_chess[ai_chess_num][0]][ai_chess[ai_chess_num][1]] = 2;
ai_chess_num++;
goto here;
}
}
}
}
}
for(i=0; i<H; i++){ //再遍歷一次
for(j=0; j<W; j+=2){ //這次只判斷棋盤上有一個棋子了
if(map[i][j] == 2){
if((map[i-1][j] == 0)&&(map[i+1][j] == 0)){ //雖然只有一個棋子,但還是判斷一下四種關系
gotoxy(i-1,j); //因為人機落子的位置往往都挨著玩家的落子
printf("##");
ai_chess[ai_chess_num][0] = i-1;
ai_chess[ai_chess_num][1] = j;
map[ai_chess[ai_chess_num][0]][ai_chess[ai_chess_num][1]] = 2;
ai_chess_num++;
goto here;
}
if((map[i][j-2] == 0)&&(map[i][j+2] == 0)){
gotoxy(i,j-2);
printf("##");
ai_chess[ai_chess_num][0] = i;
ai_chess[ai_chess_num][1] = j-2;
map[ai_chess[ai_chess_num][0]][ai_chess[ai_chess_num][1]] = 2;
ai_chess_num++;
goto here;
}
if((map[i-1][j-2] == 0)&&(map[i+1][j+2] == 0)){
gotoxy(i-1,j-2);
printf("##");
ai_chess[ai_chess_num][0] = i-1;
ai_chess[ai_chess_num][1] = j-2;
map[ai_chess[ai_chess_num][0]][ai_chess[ai_chess_num][1]] = 2;
ai_chess_num++;
goto here;
}
if((map[i-1][j+2] == 0)&&(map[i+1][j-2] == 0)){
gotoxy(i-1,j+2);
printf("##");
ai_chess[ai_chess_num][0] = i-1;
ai_chess[ai_chess_num][1] = j+2;
map[ai_chess[ai_chess_num][0]][ai_chess[ai_chess_num][1]] = 2;
ai_chess_num++;
goto here;
}
}
}
}
for(i=0; i<H; i++){ //最后一次遍歷
for(j=0; j<W; j+=2){ //最后一種情況,人機還未在棋盤上落子
if(map[i][j] == 1){
int s;
s = rand()%2;
gotoxy(i-1+2*s,j);
printf("##");
ai_chess[ai_chess_num][0] = i-1+2*s;
ai_chess[ai_chess_num][1] = j;
map[ai_chess[ai_chess_num][0]][ai_chess[ai_chess_num][1]] = 2;
ai_chess_num++;
goto here;
}
}
}
here:;
}
void deleter()
{
//先判斷玩家是否獲勝
int i, j, k;
for(i=0; i<H; i++)
for(j=0; j<W; j+=2){
if(map[i][j] == 1){
if((map[i+1][j] == 1)&&(map[i+2][j] == 1)&&(map[i+3][j] == 1)&&(map[i+4][j] == 1)){
for(k=0; k<5; k++){
gotoxy(i+k,j);
printf(" ");
}
Sleep(1000); //延時1秒
system("cls"); //清屏
gotoxy(10,10);
printf("win!");
system("pause"); //暫停
}
if((map[i][j+2] == 1)&&(map[i][j+4] == 1)&&(map[i][j+6] == 1)&&(map[i][j+8] == 1)){
for(k=0; k<5; k++){
gotoxy(i,j+2*k);
printf(" ");
}
Sleep(1000);
system("cls");
gotoxy(10,10);
printf("win!");
system("pause");
}
if((map[i+1][j+2] == 1)&&(map[i+2][j+4] == 1)&&(map[i+3][j+6] == 1)&&(map[i+4][j+8] == 1)){
for(k=0; k<5; k++){
gotoxy(i+k,j+2*k);
printf(" ");
}
Sleep(1000);
system("cls");
gotoxy(10,10);
printf("win!");
system("pause");
}
if((map[i+1][j-2] == 1)&&(map[i+2][j-4] == 1)&&(map[i+3][j-6] == 1)&&(map[i+4][j-8] == 1)){
for(k=0; k<5; k++){
gotoxy(i+k,j-2*k);
printf(" ");
}
Sleep(1000);
system("cls");
gotoxy(10,10);
printf("win!");
system("pause");
}
}
}
//判斷人機是否獲勝
for(i=0; i<H; i++)
for(j=0; j<W; j+=2){
if(map[i][j] == 2){
if((map[i+1][j] == 2)&&(map[i+2][j] == 2)&&(map[i+3][j] == 2)&&(map[i+4][j] == 2)){
for(k=0; k<5; k++){
gotoxy(i+k,j);
printf(" ");
}
Sleep(1000);
system("cls");
gotoxy(10,10);
printf("fail!");
system("pause");
}
if((map[i][j+2] == 2)&&(map[i][j+4] == 2)&&(map[i][j+6] == 2)&&(map[i][j+8] == 2)){
for(k=0; k<5; k++){
gotoxy(i,j+2*k);
printf(" ");
}
Sleep(1000);
system("cls");
gotoxy(10,10);
printf("fail!");
system("pause");
}
if((map[i+1][j+2] == 2)&&(map[i+2][j+4] == 2)&&(map[i+3][j+6] == 2)&&(map[i+4][j+8] == 2)){
for(k=0; k<5; k++){
gotoxy(i+k,j+2*k);
printf(" ");
}
Sleep(1000);
system("cls");
gotoxy(10,10);
printf("fail!");
system("pause");
}
if((map[i+1][j-2] == 2)&&(map[i+2][j-4] == 2)&&(map[i+3][j-6] == 2)&&(map[i+4][j-8] == 2)){
for(k=0; k<5; k++){
gotoxy(i+k,j-2*k);
printf(" ");
}
Sleep(1000);
system("cls");
gotoxy(10,10);
printf("fail!");
system("pause");
}
}
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/271464.html
標籤:其他
上一篇:6翻了與沙漏列印
下一篇:C語言撰寫數獨小游戲
