EasyX C++ 井字棋游戏

#include <graphics.h>
#include <iostream>

//圆心基准位置
#define CENTER_X 120
#define CENTER_Y 200
//顶点基准位置
#define	VERTEX_X 0
#define VERTEX_Y 80
//步长
#define STEP 240
//屏幕宽高
#define WIDTH 720
#define HEIGHT 800

//记录步数
int gl_index = 0;

struct point
{
	point() {}
	point(int x, int y) :x(x), y(y) {}
	point(const point& other) {
		this->x = other.x;
		this->y = other.y;
	}
	int x = -1;
	int y = -1;
};

//穷举圆心位置
point Centers[9] = {
	point(CENTER_X, CENTER_Y), point(CENTER_X + STEP, CENTER_Y), point(CENTER_X + STEP * 2, CENTER_Y),
	point(CENTER_X, CENTER_Y + STEP), point(CENTER_X + STEP, CENTER_Y + STEP), point(CENTER_X + STEP * 2, CENTER_Y + STEP),
	point(CENTER_X, CENTER_Y + STEP * 2), point(CENTER_X + STEP , CENTER_Y + STEP * 2), point(CENTER_X + STEP * 2,CENTER_Y + STEP * 2),
};

point Vertexs[9] = {
	point(VERTEX_X, VERTEX_Y), point(VERTEX_X + STEP, VERTEX_Y), point(VERTEX_X + 2 * STEP, VERTEX_Y),
	point(VERTEX_X, VERTEX_Y + STEP), point(VERTEX_X + STEP, VERTEX_Y + STEP), point(VERTEX_X + 2 * STEP, VERTEX_Y + STEP),
	point(VERTEX_X, VERTEX_Y + STEP * 2), point(VERTEX_X + STEP, VERTEX_Y + STEP * 2), point(VERTEX_X + 2 * STEP, VERTEX_Y + STEP * 2),
};


void DrawLine(const point& start, const point& end)
{
	line(start.x, start.y, end.x, end.y);
}

//初始化画布
void initBord()
{
	DrawLine(point(VERTEX_X, VERTEX_Y), point(WIDTH, VERTEX_Y));
	DrawLine(point(VERTEX_X, VERTEX_Y + STEP), point(WIDTH, VERTEX_Y + STEP));
	DrawLine(point(VERTEX_X, VERTEX_Y + STEP * 2), point(WIDTH, VERTEX_Y + STEP * 2));
	DrawLine(point(STEP, VERTEX_Y), point(STEP, HEIGHT));
	DrawLine(point(STEP * 2, VERTEX_Y), point(STEP * 2, HEIGHT));
}

//绘制标注
void drawFlag(char flag)
{
	if (flag == 'x')
	{
		line(340, 20, 380, 60);
		line(340, 60, 380, 20);
	}
	else
	{
		circle(360, 40, 20);
	}
}

//绘制叉形
void drawX(int index)
{
	point left_top (Vertexs[index].x + 10, Vertexs[index].y + 10);
	point right_top(left_top.x + STEP - 20, left_top.y);
	point left_bottom(left_top.x, left_top.y + STEP - 20);
	point right_bottom(left_top.x + STEP - 20, left_top.y + STEP - 20);
	DrawLine(left_top, right_bottom);
	DrawLine(left_bottom, right_top);
}

//绘制圆形
void drawCircle(int index)
{
	circle(Centers[index].x, Centers[index].y, 100);
}

//判断谁赢
bool isWin(char(*arr)[3], char flag)
{
	if (arr[0][0] == flag && arr[0][1] == flag && arr[0][2] == flag)
	    return true;
    if (arr[1][0] == flag && arr[1][1] == flag && arr[1][2] == flag)
	    return true;
    if (arr[2][0] == flag && arr[2][1] == flag && arr[2][2] == flag)
	    return true;
    if (arr[0][0] == flag && arr[1][0] == flag && arr[2][0] == flag)
	    return true;
    if (arr[0][1] == flag && arr[1][1] == flag && arr[2][1] == flag)
	    return true;
    if (arr[0][2] == flag && arr[1][2] == flag && arr[2][2] == flag)
	    return true;
    if (arr[0][0] == flag && arr[1][1] == flag && arr[2][2] == flag)
	    return true;
    if (arr[0][2] == flag && arr[1][1] == flag && arr[2][0] == flag)
	    return true;

	return false;
}

//判断平局
bool isDraw()
{
	if (gl_index == 9) return true;
	else return false;
}

point coord2Matrix(int x, int y)
{
	point Matrix;
	if (0 < x && x < 240 && 80 < y && y < 320)
	{
		Matrix.x = 0;
		Matrix.y = 0;
	}
	else if (240 < x && x < 480 && 80 < y && y < 320)
	{
		Matrix.x = 0;
		Matrix.y = 1;
	}
	else if (480 < x && x < 720 && 80 < y && y < 320)
	{
		Matrix.x = 0;
		Matrix.y = 2;
	}
	else if (0 < x && x < 240 && 320 < y && y < 560)
	{
		Matrix.x = 1;
		Matrix.y = 0;
	}
	else if (240 < x && x < 480 && 320 < y && y < 560)
	{
		Matrix.x = 1;
		Matrix.y = 1;
	}
	else if (480 < x && x < 720 && 320 < y && y < 560)
	{
		Matrix.x = 1;
		Matrix.y = 2;
	}
	else if (0 < x && x < 240 && 560 < y && y < 800)
	{
		Matrix.x = 2;
		Matrix.y = 0;
	}
	else if (240 < x && x < 480 && 560 < y && y < 800)
	{
		Matrix.x = 2;
		Matrix.y = 1;
	}
	else if (480 < x && x < 720 && 560 < y && y < 800)
	{
		Matrix.x = 2;
		Matrix.y = 2;
	}
	return Matrix;
}

void showMatrix(char (*arr)[3])
{
	for (int i = 0; i < 3; i++) 
	{
		for (int j = 0; j < 3; j++) 
		{
			if (arr[i][j] == 'x')
			{
				drawX(i * 3 + j);
			}

			if(arr[i][j] == 'o')
			{
				drawCircle(i * 3 + j);
			}
		}
	}
}

int main()
{
	bool isOver = true;
	char ChessMatrix[3][3] = { 0 };
	char Chess[2] = {'x', 'o'};
	//保存格子
	point matrix;
	initgraph(WIDTH, HEIGHT);
	BeginBatchDraw();

	while (isOver)
	{
        DWORD start_time= GetTickCount();
		//捕捉设备输入
		ExMessage Message;
		while (peekmessage(&Message))
		{
			if (Message.message == WM_LBUTTONDOWN)
			{
				matrix = coord2Matrix(Message.x, Message.y);
				if (ChessMatrix[matrix.x][matrix.y] == 0)
				{
					ChessMatrix[matrix.x][matrix.y] = Chess[(gl_index++)%2];
				}
			}
		}

		//画图
		cleardevice();
		initBord();
		if (gl_index % 2)
			drawFlag('o');
		else
			drawFlag('x');
		showMatrix(ChessMatrix);
		FlushBatchDraw();

		//判断结束条件
		if (isWin(ChessMatrix, 'x'))
		{
			MessageBox(GetHWnd(), _T("x 玩家获胜!"), _T("恭喜!"), MB_OK);
			isOver = false;
		}
		else if (isWin(ChessMatrix, 'o'))
		{
			MessageBox(GetHWnd(), _T("o 玩家获胜!"), _T("恭喜!"), MB_OK);
			isOver = false;
		}
		else if (isDraw())
		{
			MessageBox(GetHWnd(), _T("平局!"), _T("游戏结束!"), MB_OK);
			isOver = false;
		}

        DWORD end_time = GetTickCount();
        DWORD deal_time = start_time - end_time;
        if (deal_time < 1000 / 60)
        {
	        Sleep(1000 / 60 - deal_time);
        }
	}
	EndBatchDraw();

	return 0;
}
跟着b站大佬学习制作,代码水平有限,欢迎指出程序问题和提出改进建议,谢谢!

学习链接


经过学习后:修改游戏结束判断的方法;降低CPU占用率

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值