#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占用率