初始化棋盘:
void init()//初始化
{
for (int i = 0; i < 19; i++) for (int j = 0; j < 19; j++) map[i][j] = 0;//将棋盘初始化为0
flag=0;//将回合数初始化为0
}
判断是否胜利:
int isWin(int x,int y)//判断是否胜利
{
int dir[4][4]={//前面两个是x和y相对初始位置 。后面两个是x和y每次变化的情况
{0,-4,0,1},//从上到下
{-4,-4,1,1},//从左上到右下
{-4,0,1,0},//从左到右
{-4,4,1,-1},//从左下到右上
};
int cnt=0;//定义计数器
for(int i=0;i<4;i++)//上下左右四个方向都要判断
{
cnt=0;
for(int j=dir[i][0],k=dir[i][1],n=0;n<9;j+=dir[i][2],k+=dir[i][3],n++)//j代表x坐标,k代表y坐标,一共要判断9次,最后一栏是每次增加的情况
{
if(x+j>=19||y+k>=19||x+j<0||y+k<0)//判断是否越界
{
continue;//越界则继续
}
if(map[x+j][y+k]==(flag%2)+1)//判断当前位置的上下左右斜是否有相同颜色的棋子
{
cnt++;//如果有则计数器+1
if(cnt==5)//判断是否胜利
{
return (flag%2)+1;//胜利则返回胜利一方的棋子代数(黑子偶数回合,奇数代表黑子,所以%后加1)
}
}else{
cnt=0;//如果中间有间断则计数器清零
}
}
}
return 0;
}
判断落子情况:
int playerMove(int x,int y)//判断此处是否有落子
{
if(map[x][y])
{
return 0;
}
map[x][y]=(flag%2)+1;//没有落子则此处变成对应颜色
return 1;
}
展示落子情况以及打印棋盘:
int playerMove(int x,int y)//判断此处是否有落子
{
if(map[x][y])
{
return 0;
}
map[x][y]=(flag%2)+1;//没有落子则此处变成对应颜色
return 1;
}
void gameView_ShowMap(){//展示落子情况 ,以及打印棋盘
for (int i = 0; i < 19; i++) {
for (int j = 0; j < 19; j++) {
if((i==0&&j==0))
{
printf("┌");
}
else if(i==0&&j==18)
{
printf("┐");
}
else if(i==18&&j==0)
{
printf("└");
}
else if(i==18&&j==18)
{
printf("┘");
}
else if(i==0&&(j!=0)&&(j!=18))
{
printf("一");
}
else if((i!=0)&&j==0&&(i!=18))
{
printf("|");
}
else if((i!=0)&&j==18&&(i!=18))
{
printf("|");
}
else if(i==18&&(j!=0)&&(j!=18))
{
printf("一");
}
else{
printf(map[i][j] == 0 ? "十" : map[i][j] == 1 ? "龘" : "口");//画图,先判断是否有落子,再判断是黑子还是白子
}
}
printf("\n");
}
}
v
胜利展示:
void winView()//胜利展示
{
printf((flag%2)==0?"黑子胜利\n":"白子胜利\n");
}
游戏进行:
void gameView()
{
init();
int x=0,y=0;
while(1)
{
gameView_ShowMap();//打印地图
printf((flag%2)==0?"黑棋落子":"白棋落子");
printf("请输入xy的坐标(空格分格如:3 6):");
scanf("%d%d",&x,&y);
if(!playerMove(x,y))//判断时候能够落子
{
printf("这里不能落子,请从新输入\n");
continue;
}
if(isWin(x, y))//判断是否胜利
{
gameView_ShowMap();//打印棋盘
winView();//胜利展示
return;//结束
}
flag++;//否则就回合数加一
}
}
菜单:
void menuView()//整体菜单,我觉得放在主函数更加合适
{
int choose=0;
while(1)
{
printf("输入1进入游戏界面\n输入2进入设置界面\n输入0退出游戏\n");
scanf("%d",&choose);
switch(choose)//选择开关
{
case 1:{
gameView();//进入游戏
break;
}
case 2:{
printf("敬请期待......\n");
break;
}
case 0:{
exit(0);//退出
}
}
}
putchar('\n');
putchar('\n');
putchar('\n');
}
最后是整体的代码:
#pragma warning(disable: 4996)
#include <stdio.h>
#include <stdlib.h>
int map[19][19];//定义一个棋盘
int flag=0;//定义回合
void init()//初始化
{
for (int i = 0; i < 19; i++) for (int j = 0; j < 19; j++) map[i][j] = 0;//将棋盘初始化为0
flag=0;//将回合数初始化为0
}
int isWin(int x,int y)//判断是否胜利
{
int dir[4][4]={//前面两个是x和y相对初始位置 。后面两个是x和y每次变化的情况
{0,-4,0,1},//从上到下
{-4,-4,1,1},//从左上到右下
{-4,0,1,0},//从左到右
{-4,4,1,-1},//从左下到右上
};
int cnt=0;//定义计数器
for(int i=0;i<4;i++)//上下左右四个方向都要判断
{
cnt=0;
for(int j=dir[i][0],k=dir[i][1],n=0;n<9;j+=dir[i][2],k+=dir[i][3],n++)//j代表x坐标,k代表y坐标,一共要判断9次,最后一栏是每次增加的情况
{
if(x+j>=19||y+k>=19||x+j<0||y+k<0)//判断是否越界
{
continue;//越界则继续
}
if(map[x+j][y+k]==(flag%2)+1)//判断当前位置的上下左右斜是否有相同颜色的棋子
{
cnt++;//如果有则计数器+1
if(cnt==5)//判断是否胜利
{
return (flag%2)+1;//胜利则返回胜利一方的棋子代数(黑子偶数回合,奇数代表黑子,所以%后加1)
}
}else{
cnt=0;//如果中间有间断则计数器清零
}
}
}
return 0;
}
int playerMove(int x,int y)//判断此处是否有落子
{
if(map[x][y])
{
return 0;
}
map[x][y]=(flag%2)+1;//没有落子则此处变成对应颜色
return 1;
}
void gameView_ShowMap(){//展示落子情况 ,以及打印棋盘
for (int i = 0; i < 19; i++) {
for (int j = 0; j < 19; j++) {
if((i==0&&j==0))
{
printf("┌");
}
else if(i==0&&j==18)
{
printf("┐");
}
else if(i==18&&j==0)
{
printf("└");
}
else if(i==18&&j==18)
{
printf("┘");
}
else if(i==0&&(j!=0)&&(j!=18))
{
printf("一");
}
else if((i!=0)&&j==0&&(i!=18))
{
printf("|");
}
else if((i!=0)&&j==18&&(i!=18))
{
printf("|");
}
else if(i==18&&(j!=0)&&(j!=18))
{
printf("一");
}
else{
printf(map[i][j] == 0 ? "十" : map[i][j] == 1 ? "龘" : "口");//画图,先判断是否有落子,再判断是黑子还是白子
}
}
printf("\n");
}
}
void winView()//胜利展示
{
printf((flag%2)==0?"黑子胜利\n":"白子胜利\n");
}
void gameView()
{
init();
int x=0,y=0;
while(1)
{
gameView_ShowMap();//打印地图
printf((flag%2)==0?"黑棋落子":"白棋落子");
printf("请输入xy的坐标(空格分格如:3 6):");
scanf("%d%d",&x,&y);
if(!playerMove(x,y))//判断时候能够落子
{
printf("这里不能落子,请从新输入\n");
continue;
}
if(isWin(x, y))//判断是否胜利
{
gameView_ShowMap();//打印棋盘
winView();//胜利展示
return;//结束
}
flag++;//否则就回合数加一
}
}
void menuView()//整体菜单,我觉得放在主函数更加合适
{
int choose=0;
while(1)
{
printf("输入1进入游戏界面\n输入2进入设置界面\n输入0退出游戏\n");
scanf("%d",&choose);
switch(choose)//选择开关
{
case 1:{
gameView();//进入游戏
break;
}
case 2:{
printf("敬请期待......\n");
break;
}
case 0:{
exit(0);//退出
}
}
}
putchar('\n');
putchar('\n');
putchar('\n');
}
int main()
{
menuView();
return 0;
}