#include <stdio.h> //标准输入输出函数库
#include <windows.h> //屏幕光标操作等
#include<string.h> //字符串操作函数
//定义一个宏 ,宏名定义:单词大写,单词与单词之间用下划线隔开
#define SIZE 20
int xiaqipanduan(int x,int y);
int xiaqi(int *player );
void initBoard();
void printBoard();
int shuying(int x,int y);
int horizonWin();
int vertical();
int positiveDiagonalWin();
int negativeDiagonalWin();
//做一个全局的二维数组,表示棋盘
char * board[SIZE][SIZE];
//初始化棋盘的函数
void initBoard()
{
int i;
for(i=0;i<SIZE;i++)
{
int j;
for(j=0;j<SIZE;j++)
{
//左上角
if(i==0&&j==0)
{
board[i][j]="╔";
}
else if(i==0&&j==SIZE-1) //右上角
{
board[i][j]="╗";
}
else if(i==SIZE-1&&j==0) //左下角
{
board[i][j]="╚";
}
else if(i==SIZE-1&&j==SIZE-1) //右下角
{
board[i][j]="╝";
}
else if(i==0) //第一行
{
board[i][j]="╦";
}
else if(j==0) //第一列
{
board[i][j]="╠";
}
else if(i==SIZE-1) //最后一行
{
board[i][j]="╩";
}
else if(j==SIZE-1) //最后一列
{
board[i][j]="╣";
}
else //中间部分
{
board[i][j]="╬";
}
}
}
}
//打印棋盘的函数
void printBoard()
{
system("cls");
int i;
for(i=0;i<SIZE;i++)
{
int j;
for(j=0;j<SIZE;j++)
{
printf("%s",board[i][j]);
}
printf("\n");
}
}
//下棋函数
int xiaqi(int *player )
{
//做一个循环,如果玩家输入有误,循环执行
int x,y;
do
{
printf("请玩家%d输入棋子坐标:",*player);
scanf("%d,%d",&x,&y);
} while(!xiaqipanduan(x,y));
board[x][y]= (*player==1) ?"●":"○";
printBoard();
if(shuying(x,y))
{
printf("恭喜玩家%d获胜!\n",*player);
return 1; //其中一方获胜,返回1
}
*player=(*player==1)?2:1; //切换玩家
return 0; //返回0表示没有结束
}
//判断下棋位置是否正确
int xiaqipanduan(int x,int y)
{
//判断越界
int noOverStep;
noOverStep=(x<SIZE&&x>=0)&&(y<SIZE&&y>=0);
if(noOverStep==0)
{
printf("输入有误\n");
return 0;
}
//判断重复
int repeat;
repeat= (strcmp(board[x][y],"●")==0)||(strcmp(board[x][y],"○")==0);
//输入正确返回1
if((noOverStep)&&(!repeat))
{
return 1;
}
//输入错误返回0
else
{
printf("输入有误\n");
return 0;
}
return 0;
}
int shuying(int x,int y)//判断一方胜利
{
int h=horizonWin();
int v=vertical();
int positiveDiagonal=positiveDiagonalWin();
int negativeDiagonal=negativeDiagonalWin();
if(h||v||positiveDiagonal||negativeDiagonal)
{
return 1;
}
return 0;
}
int horizonWin() //横向获胜
{
int i;
for(i=0;i<SIZE;i++)
{
int j;
for(j=0;j<SIZE-4;j++)
{
int k;
int black=0;
int white=0;
for(k=0;k<5;k++)
{
black+=(strcmp(board[i][j+k],"●")==0);
white+=(strcmp(board[i][j+k],"○")==0);
}
if(black==5||white==5)
{
return 1;
}
}
}
return 0;
}
int vertical() //竖向赢
{
int i;
for(i=0;i<SIZE;i++)
{
int j;
for(j=0;j<SIZE-4;j++)
{
int k;
int black=0;
int white=0;
for(k=0;k<5;k++){
black+=(strcmp(board[j+k][i],"●")==0);
white+=(strcmp(board[j+k][i],"○")==0);
}
if(black==5||white==5)
{
return 1;
}
}
}
return 0;
}
//正斜线赢
int positiveDiagonalWin()
{
int i; //用来表示行的下标
for(i=0;i<=SIZE-5;i++)
{
int j; //用来表示列的下标
for(j=0;j<=SIZE-5;j++)
{
int black=0; //表示n个黑色棋子连续
int white=0; //表示n个白色棋子连续
int k;
for(k=0;k<5;k++)
{
if(strcmp(board[i+k][j+k],"●")==0)
{
black+=1;
}
if(strcmp(board[i+k][j+k],"○")==0)
{
white+=1;
}
if(black==5||white==5)
{
return 1;
}
}
}
}
return 0;
}
//反斜线赢
int negativeDiagonalWin()
{
int i;
for(i=4;i<SIZE;i++)
{
int j;
for(j=4;j<SIZE-4;j++)
{
int black=0; //表示n个黑色棋子连续
int white=0; //表示n个白色棋子连续
int k;
for(k=0;k<5;k++)
{
if(strcmp(board[i-k][j+k],"●")==0)
{
black+=1;
}
if(strcmp(board[i-k][j+k],"○")==0)
{
white+=1;
}
if(black==5||white==5)
{
return 1;
}
}
}
}
return 0;
}
int main()
{
//调用初始化的函数
initBoard();
//打印棋盘
printBoard();
int gameOver;
int player=1;
do
{
gameOver = xiaqi(&player);
}while(!gameOver);
printf("游戏结束\n");
return 0;
}
转载于:https://my.oschina.net/shizilaixi/blog/672853