首先声明:
在我的电脑(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;
}
测试运行: