EasyX自学笔记2(井字棋)

井字棋规则,鼠标点击交替落下“o”和“x”,在横3、竖3、斜3下判定获胜,如没有任意一方三连判定平局。

分析规则需求(初始化、绘画界面、游戏输入、游戏逻辑)

1.绘画棋盘格、o、x

2.鼠标移动九个格子内点击即放置棋子

3.o与x交替放置、已放置处不可放置

4.判断三连即胜利、九格子占满未胜利则平局

搭建框架

#include <iostream>
#include <windows.h>
using namespace std;
bool GameOver = false;

void Setup()//初始化
{

}
void Draw()//绘图
{

}
void Input()//输入
{

}
void Logic()//游戏逻辑
{

}
int main()
{
	Setup();
	while (!GameOver)
	{
		Draw();
		Input();
		Logic();
		Sleep(15);
	}
	cin.get();
}

四个函数实现初始化、绘制图片、对输入处理、游戏逻辑

在while循环中反复“绘制图片、对输入处理、游戏逻辑”,其中sleep函数在windows文件中使图片刷新不那么快减少CPU占据。GameOver标志位标志游戏结束与否,在游戏中要习惯创建标志位。

Setup函数

void Setup()
{
	GameOver = false;
	initgraph(720, 720);

	line(240, 0, 240, 720);
	line(480, 0, 480, 720);
	line(0, 240, 720, 240);
	line(0, 480, 720, 480);


}

初始化initgraph函数创建720x720窗口,line画井字线,GameOver标志位设置为“游戏进行”,运行为。

Draw函数

 

void Draw()
{
	if (LMouse == true && DrawCircleFlag == true)
	{
		if (CircleY < 240 && CircleX>0 && CircleX < 240) 
		{circle(120, 120, 100); Tictactoe[0] = 1;}
		if (CircleY < 240 && CircleX>240 && CircleX < 480) 
		{circle(360, 120, 100); Tictactoe[1] = 1;}
		if (CircleY < 240 && CircleX>480 && CircleX < 720)
		{circle(600, 120, 100); Tictactoe[2] = 1;}

		if (CircleY>240&&CircleY < 480 && CircleX>0 && CircleX < 240)
		{circle(120, 360, 100);Tictactoe[3] = 1;}
		if (CircleY > 240 && CircleY < 480 && CircleX>240 && CircleX < 480)
		{circle(360, 360, 100); Tictactoe[4] = 1;}
		if (CircleY > 240 && CircleY < 480 && CircleX>480 && CircleX < 720)
		{circle(600, 360, 100); Tictactoe[5] = 1;}

		if (CircleY > 480 && CircleY < 720 && CircleX>0 && CircleX < 240)
		{circle(120, 600, 100); Tictactoe[6] = 1;}
		if (CircleY > 480 && CircleY < 720 && CircleX>240 && CircleX < 480)
		{circle(360, 600, 100); Tictactoe[7] = 1;}
		if (CircleY > 480 && CircleY < 720 && CircleX>480 && CircleX < 720)
		{circle(600, 600, 100); Tictactoe[8] = 1;}

		LMouse = false;
		DrawCircleFlag = false;
		CrossFlag = true;
	}

	if (LMouse == true && CrossFlag == true)
	{
		if (CircleY < 240 && CircleX>0 && CircleX < 240) 
		{ line(0, 0, 240, 240); line(240, 0, 0, 240); Tictactoe[0] = -1;}
		if (CircleY < 240 && CircleX>240 && CircleX < 480) 
		{ line(240, 0, 480, 240); line(480, 0, 240, 240); Tictactoe[1] = -1;}
		if (CircleY < 240 && CircleX>480 && CircleX < 720) 
		{ line(480, 0, 720, 240); line(720, 0, 480, 240); Tictactoe[2] = -1;}

		if (CircleY > 240 && CircleY < 480 && CircleX>0 && CircleX < 240)
		{ line(0, 240, 240, 480); line(240, 240, 0, 480); Tictactoe[3] = -1;}
		if (CircleY > 240 && CircleY < 480 && CircleX>240 && CircleX < 480)
		{ line(240, 240, 480, 480); line(480, 240, 240, 480); Tictactoe[4] = -1;}
		if (CircleY > 240 && CircleY < 480 && CircleX>480 && CircleX < 720) 
		{ line(480, 240, 720, 480); line(720, 240, 480, 480); Tictactoe[5] = -1;}

		if (CircleY > 480 && CircleY < 720 && CircleX>0 && CircleX < 240) 
		{ line(0, 480, 240, 720); line(240, 480, 0, 720); Tictactoe[6] = -1;}
		if (CircleY > 480 && CircleY < 720 && CircleX>240 && CircleX < 480)
		{ line(240, 480, 480, 720); line(480, 480, 240, 720); Tictactoe[7] = -1;}
		if (CircleY > 480 && CircleY < 720 && CircleX>480 && CircleX < 720)
		{ line(480, 480, 720, 720); line(720, 480, 480, 720); Tictactoe[8] = -1;}

		LMouse = false;
		DrawCircleFlag = true;
		CrossFlag = false;
	}
}

我们下棋顺序是先o后x交替落子。if语句判断格子位置然后根据坐标绘制O与X,并将O处标记为1,X处标记为-1。我们看下整体代码。

#include <iostream>
#include <graphics.h>
#include <windows.h>
using namespace std;
bool GameOver = false;
bool LMouse;
bool DrawCircleFlag;
bool CrossFlag;

int Tictactoe[9] =
{
0,0,0,
0,0,0,
0,0,0
};

void Setup()//初始化
{
	GameOver = false;
	initgraph(720, 720);

	line(240, 0, 240, 720);
	line(480, 0, 480, 720);
	line(0, 240, 720, 240);
	line(0, 480, 720, 480);

	DrawCircleFlag = true;
	CrossFlag = false;
}
void Draw()//绘画
{
	if (LMouse == true && DrawCircleFlag == true)
	{
		if (CircleY < 240 && CircleX>0 && CircleX < 240) 
		{circle(120, 120, 100); Tictactoe[0] = 1;}
		if (CircleY < 240 && CircleX>240 && CircleX < 480) 
		{circle(360, 120, 100); Tictactoe[1] = 1;}
		if (CircleY < 240 && CircleX>480 && CircleX < 720)
		{circle(600, 120, 100); Tictactoe[2] = 1;}

		if (CircleY>240&&CircleY < 480 && CircleX>0 && CircleX < 240)
		{circle(120, 360, 100);Tictactoe[3] = 1;}
		if (CircleY > 240 && CircleY < 480 && CircleX>240 && CircleX < 480)
		{circle(360, 360, 100); Tictactoe[4] = 1;}
		if (CircleY > 240 && CircleY < 480 && CircleX>480 && CircleX < 720)
		{circle(600, 360, 100); Tictactoe[5] = 1;}

		if (CircleY > 480 && CircleY < 720 && CircleX>0 && CircleX < 240)
		{circle(120, 600, 100); Tictactoe[6] = 1;}
		if (CircleY > 480 && CircleY < 720 && CircleX>240 && CircleX < 480)
		{circle(360, 600, 100); Tictactoe[7] = 1;}
		if (CircleY > 480 && CircleY < 720 && CircleX>480 && CircleX < 720)
		{circle(600, 600, 100); Tictactoe[8] = 1;}

		LMouse = false;
		DrawCircleFlag = false;
		CrossFlag = true;
	}

	if (LMouse == true && CrossFlag == true)
	{
		if (CircleY < 240 && CircleX>0 && CircleX < 240) 
		{ line(0, 0, 240, 240); line(240, 0, 0, 240); Tictactoe[0] = -1;}
		if (CircleY < 240 && CircleX>240 && CircleX < 480) 
		{ line(240, 0, 480, 240); line(480, 0, 240, 240); Tictactoe[1] = -1;}
		if (CircleY < 240 && CircleX>480 && CircleX < 720) 
		{ line(480, 0, 720, 240); line(720, 0, 480, 240); Tictactoe[2] = -1;}

		if (CircleY > 240 && CircleY < 480 && CircleX>0 && CircleX < 240)
		{ line(0, 240, 240, 480); line(240, 240, 0, 480); Tictactoe[3] = -1;}
		if (CircleY > 240 && CircleY < 480 && CircleX>240 && CircleX < 480)
		{ line(240, 240, 480, 480); line(480, 240, 240, 480); Tictactoe[4] = -1;}
		if (CircleY > 240 && CircleY < 480 && CircleX>480 && CircleX < 720) 
		{ line(480, 240, 720, 480); line(720, 240, 480, 480); Tictactoe[5] = -1;}

		if (CircleY > 480 && CircleY < 720 && CircleX>0 && CircleX < 240) 
		{ line(0, 480, 240, 720); line(240, 480, 0, 720); Tictactoe[6] = -1;}
		if (CircleY > 480 && CircleY < 720 && CircleX>240 && CircleX < 480)
		{ line(240, 480, 480, 720); line(480, 480, 240, 720); Tictactoe[7] = -1;}
		if (CircleY > 480 && CircleY < 720 && CircleX>480 && CircleX < 720)
		{ line(480, 480, 720, 720); line(720, 480, 480, 720); Tictactoe[8] = -1;}

		LMouse = false;
		DrawCircleFlag = true;
		CrossFlag = false;
	}
}
void Input()//输入
{

}
void Logic()//游戏逻辑
{

}
int main()
{
	Setup();
	while (!GameOver)
	{
		Draw();
		Input();
		Logic();
		Sleep(15);
	}
	cin.get();
}

至此我们完成了绘画棋盘、O、X并对数组进行标记。DrawCircleFlag与CrossFlag交替设置为true则可以交替绘画OX。

Input函数

void Input()
{
	ExMessage msg;
	while (peekmessage(&msg,EX_MOUSE))
	{
		if (msg.message == WM_LBUTTONDOWN)
		{
			LMouse = msg.lbutton;
			CircleX = msg.x;
			CircleY = msg.y;
		}
	}
}

EasyX文档中有消息结构体,peekmessage函数获取鼠标消息,如果获取到鼠标左键将LMouse标志位置为1,获取坐标交给O的xy,此时运行效果已经是

但是我们看到既是O或X三联,游戏也没有结束,所以我们继续编写逻辑函数

Logic函数

记得我们的额数组初始化0到8都置为0,格子标记O置为1,格子标记X置为-1,此时三联相加为3或-3就是有人获胜。 

void Logic()
{
	settextstyle(36, 0, _T("O WIN"));
	settextstyle(36, 0, _T("X WIN"));
		if ((Tictactoe[0] + Tictactoe[1] + Tictactoe[2]== 3)||
			(Tictactoe[3] + Tictactoe[4] + Tictactoe[5] == 3)||
			(Tictactoe[6] + Tictactoe[7] + Tictactoe[8] == 3))
		{
			outtextxy(360,360,"O WIN"); GameOver = true;
		}
		if ((Tictactoe[0] + Tictactoe[1] + Tictactoe[2] == -3) ||
			(Tictactoe[3] + Tictactoe[4] + Tictactoe[5] == -3) ||
			(Tictactoe[6] + Tictactoe[7] + Tictactoe[8] == -3))
		{
			outtextxy(360, 360, "X WIN"); GameOver = true;
		}
		if ((Tictactoe[0] + Tictactoe[3] + Tictactoe[6] == 3) ||
			(Tictactoe[1] + Tictactoe[4] + Tictactoe[7] == 3)||
			(Tictactoe[2] + Tictactoe[5] + Tictactoe[8] == 3) )
		{
			outtextxy(360, 360, "O WIN"); GameOver = true;
		}
		if ((Tictactoe[0] + Tictactoe[3] + Tictactoe[6] == -3) ||
			(Tictactoe[1] + Tictactoe[4] + Tictactoe[7] == -3) ||
			(Tictactoe[2] + Tictactoe[5] + Tictactoe[8] == -3) )
		{
			outtextxy(360, 360, "X WIN"); GameOver = true;
		}
		if((Tictactoe[0] + Tictactoe[4] + Tictactoe[8] == 3)|| (Tictactoe[2] + Tictactoe[4] + Tictactoe[6] == 3))
		{
			outtextxy(360, 360, "O WIN"); GameOver = true;
		}
		if ((Tictactoe[0] + Tictactoe[4] + Tictactoe[8] == -3) || (Tictactoe[2] + Tictactoe[4] + Tictactoe[6] == -3))
		{
			outtextxy(360, 360, "X WIN"); GameOver = true;
		}
}

至此井字棋游戏就制作完成了,

settextstyle(36, 0, _T("O WIN"));这个函数确立了打印字符串的大小详细函数解释可以去EasyX文档 

总结

初始化界面,输入鼠标函数设置鼠标标志位、O绘画标志位,对格子坐标分析绘画OX、对九宫格数组设置标志1与-1,对游戏获胜做判断。

  • 22
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
好的,下面是基于EASYX库的井字棋游戏的C语言代码: ```c #include <graphics.h> #include <conio.h> #include <stdio.h> #include <stdlib.h> #include <time.h> #define ROW 3 #define COL 3 #define SIZE 100 int board[ROW][COL]; // 棋盘数组,0表示空位,1表示玩家1,2表示玩家2 // 初始化棋盘 void init_board() { int i, j; for (i = 0; i < ROW; i++) { for (j = 0; j < COL; j++) { board[i][j] = 0; } } } // 绘制棋盘 void draw_board() { int i, j; setcolor(WHITE); for (i = 0; i <= ROW; i++) { line(SIZE, i * SIZE + SIZE, COL * SIZE + SIZE, i * SIZE + SIZE); } for (j = 0; j <= COL; j++) { line(j * SIZE + SIZE, SIZE, j * SIZE + SIZE, ROW * SIZE + SIZE); } } // 绘制棋子 void draw_piece(int row, int col, int player) { int x = col * SIZE + SIZE; int y = row * SIZE + SIZE; if (player == 1) { setcolor(YELLOW); circle(x, y, SIZE / 2 - 5); } else if (player == 2) { setcolor(RED); line(x - SIZE / 2 + 10, y - SIZE / 2 + 10, x + SIZE / 2 - 10, y + SIZE / 2 - 10); line(x - SIZE / 2 + 10, y + SIZE / 2 - 10, x + SIZE / 2 - 10, y - SIZE / 2 + 10); } } // 判断胜负 int check_win(int player) { int i, j; // 判断每一行 for (i = 0; i < ROW; i++) { if (board[i][0] == player && board[i][1] == player && board[i][2] == player) { return 1; } } // 判断每一列 for (j = 0; j < COL; j++) { if (board[0][j] == player && board[1][j] == player && board[2][j] == player) { return 1; } } // 判断对角线 if (board[0][0] == player && board[1][1] == player && board[2][2] == player) { return 1; } if (board[0][2] == player && board[1][1] == player && board[2][0] == player) { return 1; } return 0; } // 判断平局 int check_tie() { int i, j; for (i = 0; i < ROW; i++) { for (j = 0; j < COL; j++) { if (board[i][j] == 0) { return 0; } } } return 1; } int main() { int player = 1; // 当前玩家,初始为玩家1 int row, col; // 选择的行列 int win = 0; // 是否胜利 int tie = 0; // 是否平局 init_board(); initgraph(COL * SIZE + 2 * SIZE, ROW * SIZE + 2 * SIZE); draw_board(); while (!win && !tie) { if (player == 1) { outtextxy(10, ROW * SIZE + SIZE + 10, "玩家1,请选择位置:"); } else { outtextxy(10, ROW * SIZE + SIZE + 10, "玩家2,请选择位置:"); } while (1) { if (kbhit()) { char c = getch(); if (c == 'q') { closegraph(); exit(0); } row = (int) (c - '1') / COL; col = (int) (c - '1') % COL; if (row >= 0 && row < ROW && col >= 0 && col < COL && board[row][col] == 0) { break; } } delay(10); } board[row][col] = player; draw_piece(row, col, player); win = check_win(player); tie = check_tie(); player = (player == 1) ? 2 : 1; // 切换玩家 } if (win) { if (player == 1) { outtextxy(10, ROW * SIZE + SIZE + 10, "玩家2胜利!"); } else { outtextxy(10, ROW * SIZE + SIZE + 10, "玩家1胜利!"); } } else { outtextxy(10, ROW * SIZE + SIZE + 10, "平局!"); } while (1) { if (kbhit()) { char c = getch(); if (c == 'q') { break; } } delay(10); } closegraph(); return 0; } ``` 这个程序使用了EASYX库来实现图形界面,通过键盘输入来选择棋子的位置。你可以在开发环境中编译运行此程序,体验一下这个简单的井字棋游戏
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

少杰是小白

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值