首先聲明:
在我的電腦(win10)和機房電腦(win7)棋盤排版不同???須小小的改動打印棋盤的表格符號,我會把在我的電腦(win10)運行代碼貼上!!!
代碼(win10):
#include <conio.h>
#include <windows.h> //遊戲結束彈跳提示窗口函數MessageBox所在的頭文件
#include<stdio.h>
#include<stdlib.h>
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevinstance, PSTR szCmdLine, int iCmdShow);//遊戲結束彈跳提示窗口
int main()
{
newgame:system("cls"); //遊戲結束時返回這一步,進行新遊戲
printf("\n\n\n\n\n\n\t\t\t五子棋遊戲\n\t\t\t退出遊戲請按Esc鍵"); //新遊戲提示
printf("\n\t\t\t開始新遊戲請按除Esc鍵任意鍵");
printf("\n\t\t\t\t遊戲出品----zeng");
int ng; //是否開始新遊戲
ng=getch();
if(ng==27) //如果輸入爲Esc鍵,結束遊戲
exit(1);
int w=1; //記錄玩家
int wei[70][70]={0}; //記錄已落棋子
int g[50][50]={0}; //記錄光標行走軌跡,1爲光標所在,每一次更新時須將1變爲0,只能有一個1
system("mode con cols=66 lines=35"); //控制遊戲窗口的大小,符合棋盤大小
void f(int w,int wei[70][70],int g[50][50]);// 打印棋盤
int pd(int w,int wei[70][70],int g[50][50]);// 判斷輸贏
int x=10,y=10; // 存放光標位置,初始化在棋盤中間
int gu; //記錄玩家操作,進行落子(光標)
g[x][y]=1; //方形光標初始化爲啓動程序可顯示
f(w,wei,g); // 啓動程序顯示棋盤
g[x][y]=0; // 方形光標記錄清除,防止下一次存留輸出上一次的操作
while(1) //開始玩家操作、輸入、判斷
{
gu=getch(); // 玩家在鍵盤操作上下左右鍵位,gu直接獲得鍵位的ASCLL碼用來進行判斷操作
if(gu==80&&x+1<30) //玩家按下且光標不會越界
{
x++;
while(wei[x][y]!=0) //要是下一個光標的落腳點有棋子,則光標落腳點繼續按照規律移動下一個,直至落腳點爲空
x++;
}//
else if(gu==72&&x-1>1) //玩家按上且光標不會越界
{
x--;
while(wei[x][y]!=0)
x--;
}
else if(gu==75&&y-1>0) //玩家按左且光標不會越界
{
y--;
while(wei[x][y]!=0)
y--;
}
else if(gu==77&&y+1<30) //玩家按右且光標不會越界
{
y++;
while(wei[x][y]!=0)
y++;
}
g[x][y]=1; //現在光標所在位置
if(gu==13&&w==1&&wei[x][y]==0) //進行落子操作,且此地爲空
wei[x][y]=1,w=-1; //落白子,換玩家
else if(gu==13&&w==-1&&wei[x][y]==0)
wei[x][y]=2,w=1;
f(w,wei,g);
if(gu==13&&pd(w,wei,g)==1) //落子之後,白棋玩家獲得勝利
{
MessageBox(NULL, TEXT("恭喜白棋玩家獲勝!\n單擊確定開始新遊戲"), TEXT("遊戲結束!"), MB_OK); // 彈出提示信息
goto newgame; //回到newgame開始語句,運行新遊戲
}
if(gu==13&&pd(w,wei,g)==2) //黑棋玩家獲得勝利
{
MessageBox(NULL, TEXT("恭喜黑棋玩家獲勝!\n單擊確定開始新遊戲"), TEXT("遊戲結束!"), MB_OK);
goto newgame;
}
g[x][y]=0; // 清除光標位置,準備下一步
}
return 0;
}
void f(int w,int wei[70][70],int g[50][50]) //
{
system("cls"); //清除一次屏幕所有
int i,t;
int x,y;
int n=15,m=15;
for(i=1;i<=n;i++) // 開始打印棋盤
{
if(i==1)printf("┌─");
else if(i==n)printf("└─");
else printf("├─");
for(t=1;t<m;t++)
{
if(i==1)printf("┬─");
else if(i==n)printf("┴─");
else if(wei[i][t]==1) // 遇到存放白棋的位置
printf("●");
else if(wei[i][t]==2) // 遇到存放黑棋的位置
printf("○");
else if(g[i][t]==1) // 遇到光標所在位置
printf("▉");
else if(g[i][t+1]==1)printf("┼ ");
else printf("┼-");
}
if(i==1)printf("┐");
else if(i==n)printf("┘");
else printf("┤");
printf("\n");
}
printf("操作說明:方向鍵移動方形光標,回車鍵在光標所在位置落子\n"); // 在棋盤下方顯示操作說明
printf("\n ");
return ;
}
int pd(int w,int wei[70][70],int g[50][50]) // 勝負判斷函數
{
int i,t;
int j,k;
int x=0,y=0; //分別存放白棋黑棋的連續棋子個數
for(i=1;i<=35;i++) // 判斷行
for(t=1;t<=35;t++)
{
if(wei[i][t]==1)x++; //遇到白棋,白棋計數加一
else x=0; //遇到黑棋或空格,計數清零
if(x>=5)return 1; //白棋超過五個,返回1代表白棋勝利
if(wei[i][t]==2)y++;//
else y=0;
if(y>=5)return 2;
}
for(i=1;i<=35;i++) // 判斷列
for(t=1;t<=35;t++)
{
if(wei[t][i]==1)x++;
else x=0;
if(x>=5)return 1;
if(wei[t][i]==2)y++;
else y=0;
if(y>=5)return 2;
}
for(i=-35;i<35;i++) //判斷正對角線與其平行斜線
for(t=1;t<=35;t++)
{
if(wei[t][t+i]==1&&t+i>=0)x++;
else x=0;
if(x>=5)return 1;
if(wei[t][t+i]==2&&t+i>=0)y++;
else y=0;
if(y>=5)return 2;
}
for(i=1;i<=66;i++) //判斷反對角線與其平行線
for(t=0;t<=66;t++) // 棋盤右下角的五子用整體斜線的話,需要判斷到接近兩倍棋盤行列數
{
if(wei[t][i-t]==1&&i-t>=0)x++;
else x=0;
if(x>=5)return 1;
if(wei[t][i-t]==2&&i-t>=0)y++;
else y=0;
if(y>=5)return 2;
}
return 0;
}
測試運行: