一个cpp搞定,没有用类进行封装,适合初学者参考
#include <iostream>
#include <conio.h>
//宏
//定义了一个宏W,它的替换文本是10
//凡是这条语句之后出现W,都会在编译的时候替换为10
#define W 19
#define H 19
#define S (W*H)
//棋子的类型
#define KZ 0
#define HZ 1
#define BZ 2
#define PI 3.14
void main()
{
int map[S] = {};
int px = 0;
int py = 0;//光标
bool black = true;//落子的颜色
while (1)
{
system("cls");
//绘图
for (int y = 0; y < H; ++y)
{
for (int x = 0; x < W; ++x)
{
if (x == px && y == py)
std::cout<<"光";
else if (map[x+y*W] == 1)
std::cout<<"黑";
else if (map[x+y*W] == 2)
std::cout<<"白";
else if (map[x+y*W] == 0)
{
if (x == 0 && y == 0)
std::cout<<"┏";
else if (x == W-1 && y == 0)
std::cout<<"┓";
else if (x == 0 && y == H-1)
std::cout<<"┗";
else if (x == W-1 && y == H-1)
std::cout<<"┛";
else if (x == 0)
std::cout<<"┣";
else if (x == W-1)
std::cout<<"┫";
else if (y == 0)
std::cout<<"┳";
else if (y == H-1)
std::cout<<"┻";
else
std::cout<<"╋";
}
}
std::cout<<"\n";
}
//逻辑
int a = _getch();
if (a == 'w' || a == 'W')
{
if (py > 0)
py--;
}
else if (a == 's' || a == 'S')
{
if (py < H-1)
py++;
}
else if (a == 'a' || a == 'A')
{
if (px > 0)
px--;
}
else if (a == 'd' || a == 'D')
{
if (px < W-1)
px++;
}
else if (a == ' ')
{
//只能在空格上面落子
if (map[px+py*W] == KZ)
{
//根据black的真假判断落黑子还是白子
if (black)
map[px+py*W] = HZ;
else
map[px+py*W] = BZ;
bool win = false;
//胜负判断
//横。
int count1 = 0;
for (int x = px-1; x >= 0; --x)
{
if (map[x+py*W] == map[px+py*W])
count1++;
else
break;
}
for (int x = px+1; x < W; ++x)
{
if (map[x+py*W] == map[px+py*W])
count1++;
else
break;
}
if (count1 >= 4)
win = true;
//竖。
int count2 = 0;
for (int y = py-1; y >= 0; --y)
{
if (map[px+y*W] == map[px+py*W])
count2++;
else
break;
}
for (int y = py+1; y < H; ++y)
{
if (map[px+y*W] == map[px+py*W])
count2++;
else
break;
}
if (count2 >= 4)
win = true;
//左斜。
int count3 = 0;
for (int y = py-1,x=px-1; y >= 0 && x >= 0; --y,--x)
{
if (map[x+y*W] == map[px+py*W])
count3++;
else
break;
}
for (int y = py+1,x=px+1; y < H && x < W; ++y,++x)
{
if (map[x+y*W] == map[px+py*W])
count3++;
else
break;
}
if (count3 >= 4)
win = true;
//右斜
int count4 = 0;
for (int x = px+1,y = py-1; x < W && y >= 0; --y,++x)
{
if (map[x+y*W] == map[px+py*W])
count4++;
else
break;
}
for (int x = px-1, y = py + 1; x >= 0 && y < H; --x,++y)
{
if (map[x+y*W] == map[px+py*W])
count4++;
else
break;
}
if (count4 >= 4)
win = true;
if (win)
{
if (black)
std::cout<<"黑方胜利";
else
std::cout<<"白方胜利";
std::cout<<"是否继续游戏?Y/N";
int a;
do
{
a = _getch();
}while (a !='y'&& a != 'Y'&& a != 'n'&& a != 'N');
if (a =='y'|| a == 'Y')
{
for (int i = 0;i < S; ++i)
map[i] = KZ;
px = 0;
py = 0;
}
else
{
return;
}
}
//落子后颜色要变
black = !black;
}
}
}
}```