C++控制台五子棋(初级面向过程版,带详细注释)

一个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;
			}

		}
	}

	

}```

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值