前言
这好像是大一时候参加的一个短期课程的最后部分。
理解程序,不建议充当ctrlCV素材。
思路
步骤:
一、画棋盘
1.数组初始化
2.pos设置光标,实现换行
二、画棋子,实现循环下棋
三、判断五子连珠
四、游戏结束
源代码
#include<stdio.h>
#include<Windows.h>
#include<conio.h>
#include<stdlib.h>
//全局变量:)
char board[20][20];//棋盘
int x,y;//代表的是棋盘(数组)下标为x的行 和 下标为y列的一个交点
//函数的声明:)
void initBoard();//棋盘的初始化
void Pos(int x,int y);//设置光标的位置
void printBoard();//打印棋盘
void startGame();//开始游戏
int checkWin(int x,int y);//判断是不是有人胜出
int showWhoWin()//看看到底是谁赢了
void whitePlayer();//白方玩家
void blackPlayer();//黑方玩家
void printNumber();//打印数字模板
//函数的使用:)
//打印数字模板
void printNumber()
{
int i;
Pos(2,0);
for(i=0;i<20;i++)
{
printf("%2d",i);
}
for(i=0;i<20;i++)
{
Pos(0,1+i);
printf("%2d",i);
}
}
//棋盘的初始化
void initBoard()
{
int i,j;
for(i=0;i<20;i++)
{
for(j=0;j<20;j++)
{
board[i][j]='*';
}
}
}
//设置光标的位置,从哪里开始输出
void Pos(int x,int y)
{
COORD pos;
pos.X=x;
pos.Y=y;
HANDLE hOutput;//句柄
//返回标准的输入、输出或错误的设备的句柄,也就是获得输入、输出/错误的屏幕缓冲区的句柄
hOutput=GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleCursorPosition(hOutput, pos);
}
//打印棋盘
void printBoard()
{
int j,i;
printNumber();//打印数字
for(i=0;i<20;i++)
{
Pos(2,1+i);//自动换行的输出功能,代替printf("\n");
for(j=0;j<20;j++)
{
printf("%c",board[i][j]);
}
}
}
//判断是不是有人胜出
int checkWin(int x,int y)
{
char temp;//保存下棋方的颜色,w b
int count=1;//统计个数,针对的同一个线(水平线),下棋的时候一下就有了。
int i=1;//走一格
int j=1;//和i同时用来代表走斜的
int whoWin=0;//1代表白方,2代表黑方
temp=board[x][y];
//解决水平方向
//水平 左边
while(temp==board[x][y-i] && x>=0 && x<=20 && y>=0 && y<=20 && count<5)
{
i++;
count++;
if(count==5)//首先count是5才能来判断谁赢了,不然连资格都没有
{
if(temp=='白')
{
whoWin=1;
}
else
{
whoWin=2;
}
}
}
//水平 右边
i=1;//从右边开始重新计算
while(temp==board[x][y+i] && x>=0 && x<20 && y>=0 && y<20 && count<5)
{
i++;
count++;
if(count==5)//首先count是5才能来判断谁赢了,不然连资格都没有
{
if(temp=='白')
whoWin=1;
else
whoWin=2;
}
}
//解决垂直方向
i=1;
count=1;//清理之前的数据
//垂直 上方
while(temp==board[x-i][y] && x>=0 && x<20 && y>=0 && y<20 && count<5)
{
i++;
count++;
if (count==5)
{
if (temp=='白')
{
whoWin=1;
}
else
{
whoWin=2;
}
}
}
//垂直 下方
i=1;
while(temp==board[x+i][y] && x>=0 && x<20 && y>=0 && y<20 && count<5)
{
i++;
count++;
if (count==5)
{
if (temp=='白')
{
whoWin=1;
}
else
{
whoWin=2;
}
}
}
//解决左上的斜线 上方
i=1;
j=1;
count=1;
while(temp==board[x-i][y-j] && x>=0 && x<20 && y>=0 && y<20 && count<5)
{
i++;
j++;
count++;
if (count==5)
{
if (temp=='白')
{
whoWin=1;
}
else
{
whoWin=2;
}
}
}
//解决左上的斜线 下方
i=1;
j=1;
while(temp==board[x+i][y+j] && x>=0 && x<20 && y>=0 && y<=20 && count<5)
{
i++;
j++;
count++;
if (count==5)//首先count是5才能来判断谁赢了,不然连资格都没有
{
if (temp =='白')
whoWin=1;
else
whoWin=2;
}
}
//解决右上的斜线 上方
i=1;
j=1;
count=1;
while(temp==board[x-i][y+j] && x>=0 && x<20 && y>=0 && y<20 && count<5)
{
i++;
j++;
count++;
if (count==5)//首先count是5才能来判断谁赢了,不然连资格都没有
{
if (temp =='白')
whoWin=1;
else
whoWin=2;
}
}
//解决右上的斜线 下方
i=1;
j=1;
while(temp==board[x+i][y-j] && x>=0 && x<20 && y>=0 && y<20 && count<5)
{
i++;
j++;
count++;
if (count==5)//首先count是5才能来判断谁赢了,不然连资格都没有
{
if (temp=='白')
whoWin=1;
else
whoWin=2;
}
}
return whoWin;
}
//白方玩家
void whitePlayer()
{
printf("\n请落白色棋子,按下行与列的坐标,以空格或者逗号隔开:");
scanf_s("%d%d",&x,&y);
while(1)//解决一直下错子的问题
{
if(board[x][y]=='*' && x>=0 && x<20 && y>=0 && y<20)//下子的地方没有其他子
{
board[x][y]='白';
break;//解决while(1)
}
else
{
printf("您下子错误\n");
printf("请白方落子,按下行与列的坐标:");
scanf_s("%d%d",&x,&y);//坐标的值
}
}
printBoard();
}
//黑方玩家
void blackPlayer()
{
printBoard();
printf("\n请落黑色棋子,按下行与列的坐标,以空格或者逗号隔开:");
scanf_s("%d%d",&x,&y);
while(1)//解决一直下错子的问题
{
if(board[x][y]=='*' && x>=0 && x<20 && y>=0 && y<20)//下子的地方没有其他子
{
board[x][y]='黑';
break;//解决while(1)
}
else
{
printf("您下子错误\n");
printf("请黑方落子,按下行与列的坐标:");
}
scanf_s("%d%d",&x,&y);//坐标的值
}
printBoard();
}
//看看到底是谁赢了
int showWhoWin()
{
int overLeap=0;//1代表结束
int leap;//用来接收谁赢了。
leap=checkWin(x,y);
if(leap==1)
{
overLeap = 1;
system("cls");
printBoard();
printf("\n白方胜利\n");
system("pause");
}
if(leap==2)
{
overLeap = 1;
system("cls");
printBoard();
printf("\n黑方胜利\n");
system("pause");
}
return overLeap;
}
//开始游戏
void startGame()
{
initBoard();
printBoard();
while(1)//加入循环,重复下棋。直到有人胜出--暂时先不管
{
whitePlayer();
if(showWhoWin()==1)
break;
system("cls");//清理屏幕,使屏幕上的字不重复
blackPlayer();
if(showWhoWin()==1)
break;
system("cls");
printBoard();
}
system("cls");
Pos(30, 9); printf("游戏结束,欢迎再来!");
Pos(30, 16); printf("继续努力!");
Pos(30, 23); printf("前走三,后走四。");
}
//主函数,程序的入口
int main()
{
startGame();
return 0;
}
end