这个是五子棋,可以直接运行的,但是这个只是单机的,而且你得自己算出行和列….
#include <stdio.h>
//定义一个宏,表示棋盘大小
#define SIZE 20
//表示黑色的棋子
#define BLACK "●"
//表示白色的棋子
#define WHITE "○"
//定义一个全局的二维数组,用于表示棋盘
char* board[SIZE][SIZE];
// 定义一个枚举类型,表示玩家
typedef enum{
PlayerOne,
PlayerTwo
}Player;
//定义一个枚举类型,表示输入正确与否
typedef enum{
false,
true
}BOOL;
//函数,用于初始化棋盘
void initBoard()
{
int i;
for(i=0;i<SIZE;i++) //i表示行的下标
{
int j;
for(j=0;j<SIZE;j++) //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(i==SIZE-1)//最后一列行
{
board[i][j]="┻";
}
else if(j==0)//第一列
{
board[i][j]="┣";
}
else if(j==SIZE-1)//最后一列
{
board[i][j]="┫";
}
else//其它
{
board[i][j]="╋";
}
}
}
}
//函数,打印棋盘
void printboard()
{
int i,j;
for(i=0;i<SIZE;i++)
{
for(j=0;j<SIZE;j++)
{
printf("%s",board[i][j]);
}
printf("\n");
}
}
//函数,判断下棋的坐标正确与否
BOOL PlayCorrect(int rightNum,int x,int y)
{
//如果输入数据类型不对
if(rightNum!=2)
return false;
//越界
if(x>SIZE || x<0 || y>=SIZE || y<0)
return false;
//重复
if(strcmp(board[x][y],BLACK)==0 || strcmp(board[x][y],WHITE)==0 )
return false;
return true;
}
//获胜函数1-横线函数
BOOL horizationWin(int x)
{
//遍历当前行,看此行中有没有5个连续的黑子或白子
int i; //i表示列的下标
for(i=0;i<=SIZE-5;i++)
{
//查看i和后面4个连续的棋子是不是都是黑或者白
int blackNum = 0; //表示连续的黑子的个数
int whiteNum = 0; //表示连续的白子的个数
int j; //表示与i子间隔的距离
for(j=0;j<5;j++)
{
blackNum += strcmp ( board[x][i+j],BLACK )==0 ? 1 : 0 ;
whiteNum += strcmp ( board[x][i+j],WHITE )==0 ? 1 : 0 ;
}
if( blackNum == 5 || whiteNum == 5)
{
return true;
}
}
return false;
}
//获胜函数2-竖线函数
BOOL verticalWin(int y)
{
//查看i和后面4个连续的棋子是不是都是黑或者白
int i; //i表示列的下标
for(i=0;i<=SIZE-5;i++)
{
int blackNum = 0; //表示连续的黑子的个数
int whiteNum = 0; //表示连续的白子的个数
int j; //表示与i子间隔的距离
for(j=0;j<5;j++)
{
blackNum += strcmp ( board[i+j][y],BLACK )==0 ? 1 : 0 ;
whiteNum += strcmp ( board[i+j][y],WHITE )==0 ? 1 : 0 ;
}
if( blackNum == 5 || whiteNum == 5)
{
return true;
}
}
return false;
}
//获胜函数3-反斜线函数
BOOL reverseDiagonalWin()
{
int i; //表示行的下标
for(i=0;i<=SIZE-5;i++)
{
int j; //表示列的下标
for(j=0;j<=SIZE-5;j++)
{
int numWhite = 0; //表示5个棋子中白子的个数
int numBlack = 0; //表示5个棋子中黑子的个数
int k; //表示与上一个棋子的坐标的距离
for(k=0;k<5;k++)
{
numBlack += strcmp ( board[i+k][j+k],BLACK )==0 ? 1 : 0 ;
numWhite += strcmp ( board[i+k][j+k],WHITE )==0 ? 1 : 0 ;
}
if( numBlack == 5 || numWhite == 5)
{
return true;
}
}
}
return false;
}
//获胜函数4-正斜线函数
BOOL diagonalWin()
{
int i;//表示行的下标
for(i=0;i<SIZE-5;i++)
{
int j;
for(j=4;j<=SIZE;j++)
{
int k;
int numWhite = 0; //表示5个棋子中白子的个数
int numBlack = 0; //表示5个棋子中黑子的个数
for(k=0;k<5;k++) //表示与上一个棋子的坐标的距离
{
numBlack += strcmp (board[i+k][j-k],BLACK) == 0 ? 1 : 0 ;
numWhite += strcmp (board[i+k][j-k],WHITE) == 0 ? 1 : 0 ;
}
if( numBlack == 5 || numWhite == 5)
{
return true;
}
}
}
return false;
}
//函数,判断下棋获胜的函数
BOOL win(int x,int y)
{
if( horizationWin(x) || verticalWin(y) || reverseDiagonalWin() || diagonalWin() )
return true;
return false;
}
//开始下棋
BOOL play(Player* p)
{
int x,y;//表示下棋的坐标
//定义变量,表示输入正确与否
BOOL intputright;
do{
char *name = (*p==PlayerOne) ? "玩家1" :"玩家2";
printf("请%s输入旗子下标,样式:(5,6): ",name);
int flag = scanf("%d,%d",&x,&y);
//判断输入正确与否,赋值给变量inputRight
intputright = PlayCorrect(flag,x,y);
//提示用户
if(!intputright)
{
printf("输入的下标有误,请重新输入!\n");
//清空缓存
fflush(stdin);
}
}while(!intputright);
if(*p == PlayerOne)
{
board[x][y] =BLACK;
}
else
{
board[x][y] =WHITE;
}
printboard();
//判断游戏是否结束(即判断有没有玩家获胜)
if( win(x,y) ) //如果获胜了,return一个值
{
return true;
}
else
{
//切换玩家
*p = *p==PlayerOne ? PlayerTwo : PlayerOne;
//没有获胜,返回另一个值
return false;
}
}
int main()
{
initBoard();
printboard();
Player gamer = PlayerOne;
//定义一个表示游戏结束的变量
BOOL gameOver;
do{
gameOver = play(&gamer);
}while(!gameOver);
printf("%s获胜!\n",gamer==PlayerOne?"玩家1":"玩家2");
printf("游戏结束!\n");
return 0;
}