当前位置: 首页 > article >正文

C++EasyX之井字棋

视频链接

井字棋

用EasyX和C++实现井字棋小游戏

源码及注释

#include<graphics.h>

char board_data[3][3] =
{
	{'-','-','-'},
	{'-','-','-'},
	{'-','-','-'},
};

char current_piece = 'O';

//检测指定棋子的玩家是否获胜
bool CheckWin(char c)
{
	// 检查每一行
	for (int i = 0; i < 3; i++)
	{
		if (board_data[i][0] == c && board_data[i][1] == c && board_data[i][2] == c)
			return true;
	}
	// 检查每一列
	for (int j = 0; j < 3; j++)
	{
		if (board_data[0][j] == c && board_data[1][j] == c && board_data[2][j] == c)
			return true;
	}
	// 检查对角线
	if (board_data[0][0] == c && board_data[1][1] == c && board_data[2][2] == c)
		return true;
	if (board_data[0][2] == c && board_data[1][1] == c && board_data[2][0] == c)
		return true;
	// 如果没有匹配,则返回 false
	return false;
}

//检测当前是否出现平局
bool CheckDraw()
{
	for (size_t i = 0; i < 3; i++) {
		for (size_t j = 0; j < 3; j++) {
			if (board_data[i][j] == '-')
				return false;
		}
	}
	return true;
}

//棋盘
void DrawBoard()
{
	line(0, 200, 600, 200);
	line(0, 400, 600, 400);
	line(200, 0, 200, 600);
	line(400, 0, 400, 600);

}

//棋子
void DrawPiece()
{
	for (size_t i = 0; i < 3; i++) {
		for (size_t j = 0; j < 3; j++) {
			switch (board_data[i][j])
			{
			case 'O':
					circle(200 * j + 100, 200 * i + 100, 100);
					break;
			case 'X':
				line(200 * j, 200 * i, 200 * (j + 1), 200 * (i + 1));
				line(200 * (j+1), 200 * i, 200 * j , 200 * (i + 1));
				break;
			case '-':
				break;
			default:
				break;
			}
		}
	}
}

//提示
void DrawTipText()
{
	static TCHAR str[64];
	_stprintf_s(str, _T("当前棋子类型: %c"), current_piece);

	settextcolor(RGB(225, 175, 45));
	outtextxy(0, 0, str);
}

int main()
{
	initgraph(600, 600);
	bool running = true;

	ExMessage msg;

	BeginBatchDraw();

	while (running)
	{
		DWORD start_time = GetTickCount();//自系统启动以来经历的毫秒数
		while (peekmessage(&msg))
		{
			//检查鼠标左键按下的信息
			if (msg.message == WM_LBUTTONDOWN)
			{
				//计算点击位置
				int x = msg.x;
				int y = msg.y;

				int index_x = x / 200;
				int index_y = y / 200;

				//落子操作
				if (board_data[index_y][index_x] == '-') {
					board_data[index_y][index_x] = current_piece;

					//切换棋子类型
					if (current_piece == 'O') current_piece = 'X';
					else current_piece = 'O';
				}

			}
		}
		cleardevice();

		DrawBoard();
		DrawPiece();
		DrawTipText();

		FlushBatchDraw();

		if (CheckWin('X'))
		{
			MessageBox(GetHWnd(), _T("X 玩家获胜"), _T("游戏结束"), MB_OK);
			running = false;
		}
		else if (CheckWin('O'))
		{
			MessageBox(GetHWnd(), _T("Y 玩家获胜"), _T("游戏结束"), MB_OK);
			running = false;
		}
		else if (CheckDraw())
		{
			MessageBox(GetHWnd(), _T("平局!"), _T("游戏结束"), MB_OK);
			running = false;
		}

		DWORD end_time = GetTickCount();//自系统启动以来经历的毫秒数
		DWORD delta_time = end_time - start_time;//作差的到这次循环所消耗的时间

		if (delta_time < 1000 / 60) // 为了确保60hz刷新
		{
			Sleep(1000 / 60 - delta_time);//控制每次循环的时间消耗,而进行线程休眠
		}
		
	}
	EndBatchDraw();
	return 0;
}

http://www.kler.cn/a/160287.html

相关文章:

  • 飞牛云fnOS本地部署WordPress个人网站并一键发布公网远程访问
  • Excel筛选的操作教程
  • 如何判定linux系统CPU的核心架构
  • 将Excel文件的两个表格经过验证后分别读取到Excel表和数据库
  • 鸿蒙HarmonyOS 地图不显示解决方案
  • Qwen2-VL:发票数据提取、视频聊天和使用 PDF 的多模态 RAG 的实践指南
  • 【华为数据之道学习笔记】3-1 基于数据特性的分类管理框架
  • 大数据可视化项目——基于Python豆瓣电影数据可视化分析系统的设计与实现
  • AIGC: 关于ChatGPT中基于Whisper模型实现音频转文本
  • Java利用UDP实现简单群聊
  • 做题笔记:SQL Sever 方式做牛客SQL的题目--VQ35
  • Java开源工具库Guava使用指南详解
  • sqlite3.44.2的编译
  • centos7安装rabbitMQ
  • Jenkins UI 自动化持续化集成测试
  • linux缓冲区(buff/cache)内存占用过高解决办法
  • 从零开发短视频电商 Jmeter压测示例模板详解(无认证场景)
  • 2023年山东省职业院校技能大赛信息安全管理与评估第一阶段样题
  • ffmpeg与opencv-python处理视频
  • 聚观早报 |东方甄选将上架文旅产品;IBM首台模块化量子计算机
  • 准确!!!在 CentOS 8 上配置 PostgreSQL 14 的主从复制
  • 2024年江苏省职业院校技能大赛信息安全管理与评估 第三阶段学生组(样卷)
  • Qt进程和线程
  • B 站基于 StarRocks 构建大数据元仓
  • 后端返回数据前端保留两位小数
  • 8-tornado中模板的使用(通过字符串返回、通过模板Template返回、通过模板render返回)、模板案例