C语言、Eazy_X——五子棋

news2024/11/16 17:41:41

//五子棋

#include<graphics.h>

#define board_size 20
#define pixel 600
int pr = pixel / board_size;
char board_data[board_size][board_size];
char current_piece = 'o';
int count = 0;

//检测指定玩家是否获胜
bool CheckWin(char c)
{
	int i, j;

	//检查行
	for (i = 0; i < board_size; i++)
	{
		for (j = 0; j < board_size - 4; j++)
		{
			if (board_data[i][j] == c &&
				board_data[i][j + 1] == c &&
				board_data[i][j + 2] == c &&
				board_data[i][j + 3] == c &&
				board_data[i][j + 4] == c)
				return true;
		}
	}

	//检查列
	for (i = 0; i < board_size - 4; i++)
	{
		for (j = 0; j < board_size; j++)
		{
			if (board_data[i][j] == c &&
				board_data[i + 1][j] == c &&
				board_data[i + 2][j] == c &&
				board_data[i + 3][j] == c &&
				board_data[i + 4][j] == c)
				return true;
		}
	}

	//检查主对角线
	for (i = 0; i < board_size - 4; i++)
	{
		for (j = 0; j < board_size - 4; j++)
		{
			if (board_data[i][j] == c &&
				board_data[i + 1][j + 1] == c &&
				board_data[i + 2][j + 2] == c &&
				board_data[i + 3][j + 3] == c &&
				board_data[i + 4][j + 4] == c)
				return true;
		}
	}

	//检查副对角线
	for (i = 0; i < board_size - 4; i++)
	{
		for (j = 4; j < board_size; j++)
		{
			if (board_data[i][j] == c &&
				board_data[i + 1][j - 1] == c &&
				board_data[i + 2][j - 2] == c &&
				board_data[i + 3][j - 3] == c &&
				board_data[i + 4][j - 4] == c)
				return true;
		}
	}

	return false;
}

//检测是否平局
bool CheckDraw()
{
	if (count <= board_size * board_size) return false;
	return true;
}

//绘制网格
void DrawBoard()
{
	setlinestyle(PS_SOLID, 1);
	setlinecolor(WHITE);
	for (int i = 1; i <= board_size-1; i++)
	{
		line(0, pr * i, pixel, pr * i);
		line(pr * i, 0, pr * i, pixel);
	}
}

//绘制棋子
void DrawPiece()
{
	setlinestyle(PS_SOLID, 3);
	for (int i = 0; i < board_size; i++)
	{
		for (int j = 0; j < board_size; j++)
		{
			switch (board_data[i][j])
			{
			case 'o':
				setlinecolor(YELLOW);
				circle(j * pr + (pr / 2), i * pr + (pr / 2), pr / 2 - 4);
				break;
			case 'x':
				setlinecolor(LIGHTRED);
				line(j * pr + 4, i * pr + 4, (j + 1) * pr - 4, (i + 1) * pr - 4);
				line((j + 1) * pr - 4, i * pr + 4, j * pr + 4, (i + 1) * pr - 4);
				break;
			case '-':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(pixel, pixel);
	setbkcolor(RGB(0,220,220));

	ExMessage msg;

	bool running = true;

	memset(board_data, '-', sizeof(board_data));

	BeginBatchDraw();
	while (running)
	{
		DWORD start_time = GetTickCount();

		while (peekmessage(&msg))
		{
			if (msg.message == WM_LBUTTONDOWN)
			{
				count++;

				int x = msg.x;
				int y = msg.y;

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

				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('o'))
		{
			MessageBox(GetHWnd(), _T("O玩家获胜"), _T("游戏结束"), MB_OK);
			running = false;
		}
		else if (CheckWin('x'))
		{
			MessageBox(GetHWnd(), _T("X玩家获胜"), _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)
		{
			Sleep(1000 / 60 - delta_time);
		}
	}
	EndBatchDraw();
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2184912.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

位运算(6)_只出现一次的数字 II

个人主页&#xff1a;C忠实粉丝 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 C忠实粉丝 原创 位运算(6)_只出现一次的数字 II 收录于专栏【经典算法练习】 本专栏旨在分享学习算法的一点学习笔记&#xff0c;欢迎大家在评论区交流讨论&#x1f48c; 目录 …

自动驾驶系列—解析自动驾驶汽车的“大脑”:电子电气架构详解与选型指南

&#x1f31f;&#x1f31f; 欢迎来到我的技术小筑&#xff0c;一个专为技术探索者打造的交流空间。在这里&#xff0c;我们不仅分享代码的智慧&#xff0c;还探讨技术的深度与广度。无论您是资深开发者还是技术新手&#xff0c;这里都有一片属于您的天空。让我们在知识的海洋中…

【折半查找】

目录 一. 折半查找的概念二. 折半查找的过程三. 折半查找的代码实现四. 折半查找的性能分析 \quad 一. 折半查找的概念 \quad 必须有序 \quad 二. 折半查找的过程 \quad \quad 三. 折半查找的代码实现 \quad 背下来 \quad 四. 折半查找的性能分析 \quad 记住 比较的是层数 …

python如何显示数组

np.set_printoptions方法的相关属性&#xff1a; <span style"background-color:#272822"><span style"color:#f8f8d4">set_printoptions(precisionNone, thresholdNone, edgeitemsNone, linewidthNone, suppressNone, nanstrNone, infstrNo…

【论文精度——长尾问题】Long-Tailed Learning as Multi-Objective Optimization

&#x1f308; 个人主页&#xff1a;十二月的猫-CSDN博客 &#x1f525; 系列专栏&#xff1a; &#x1f3c0;论文精读_十二月的猫的博客-CSDN博客 &#x1f4aa;&#x1f3fb; 十二月的寒冬阻挡不了春天的脚步&#xff0c;十二点的黑夜遮蔽不住黎明的曙光 目录 1. Abstract …

Python数据分析篇--NumPy--进阶

人有一种天生的、难以遏制的欲望&#xff0c;那就是在理解之前就评判。 -- 米兰昆德拉 多维数组 1. 一维数组只有行&#xff0c;二维数组相比一维数组多了列这个维度&#xff0c;而三维数组则类似多个二维数组堆叠在一起&#xff0c;形如一个立方体。 二维数组的创建 1. 二…

Java中的顺序控制、分支控制、嵌套分支if-else

if-else 顺序控制分支控制if-else单分支1.基本语法2.说明&#xff1a;3.案例说明4.流程图 双分支1.基本语法2.说明&#xff1a;3.案例说明4.流程图5.练习 多分支1.基本语法2.说明&#xff1a;3.流程图4.练习 嵌套分支1.基本介绍2.基本语法3.练习 顺序控制 1.介绍&#xff1a;程…

CMake所学

向大佬lyf学习&#xff0c;先把其8服务器中所授fine 文章目录 前言一、CMakeList.txt 命令1.1 最外层CMakeLists1.1.1 cmake_minimum_required&#xff08;&#xff09;1.1.2 project&#xff08;&#xff09;1.1.3 set&#xff08;&#xff09;1.1.4 add_subdirectory&#xf…

小红书制作视频如何去原视频音乐,视频如何去原声保留背景音乐?

在视频编辑、音乐制作或个人娱乐中&#xff0c;有时我们希望去掉视频中的原声&#xff08;如对话、解说等&#xff09;&#xff0c;仅保留背景音乐。这种处理能让观众更加聚焦于视频的氛围或节奏&#xff0c;同时也为创作者提供了更多创意空间。选择恰当的背景音乐&#xff0c;…

【tower-boot 系列】开源RocketMQ和阿里云rockerMq 4.x和5.x集成 (一)

RocketMQ 简单介绍 阿里云rockerMq 4.x和5.x集成 一、云平台创建实例 参考文档&#xff1a; 阿里云api 阿里云 创建实例 二、skd集成思路 公司用的RocketMQ一般是自建开源apache的RocketMQ和上阿里云的RocketMQ&#xff0c;目前阿里云支持4.x和5.x版本 项目集成思路&…

【MAUI】CollectionView之 垂直网格

App主页或者导航页面中动态按钮的垂直网格布局 在 XAML 中,CollectionView 可以通过将其 ItemsLayout 属性设置为 VerticalGrid,在垂直网格中显示其项: <CollectionView ItemsSource="{Binding Monkeys}"ItemsLayout

链表面试编程题

1. 删除链表中等于给定值 val 的所有节点。 203. 移除链表元素 - 力扣&#xff08;LeetCode&#xff09; 2. 反转一个单链表。206. 反转链表 - 力扣&#xff08;LeetCode&#xff09; 3. 给定一个带有头结点 head 的非空单链表&#xff0c;返回链表的中间结点。如果有两个中间…

FOCShield v2.0.4原理图

1.FOCShield v2.0.4原理图,开源原文件用AD制作。用 AD09可以打开。 主要部分为 1.电机驱动芯片部分 2.电流采样部分

2024 全新体验:国学心理 API 接口来袭

在当今快节奏的生活中&#xff0c;人们对于心理健康越来越重视。而研究发现&#xff0c;国学心理学乃至传统文化中的思想智慧&#xff0c;对于人们的心理健康有着独特且深远的影响。为了让更多人能够体验到国学心理的魅力&#xff0c;2024年全新推出的国学心理 API 接口&#x…

Efficient Knowledge Infusion via KG-LLM Alignment

文章目录 题目摘要引言相关作品方法论实验设置和结果分析结论局限性附录 题目 通过KG-LLM比对实现高效的知识注入 论文地址&#xff1a;https://aclanthology.org/2024.findings-acl.176.pdf 摘要 为了解决大型语言模型中特定领域知识匮乏的问题&#xff0c;知识图检索扩充方…

27 Vue3之unocss原子化

前置知识 什么是原子化 CSS 原子化 CSS 是一种 CSS 的架构方式&#xff0c;它倾向于小巧且用途单一的 class&#xff0c;并且会以视觉效果进行命名。 为什么使用 原子化 CSS 传统方案 制作原子化 CSS 的传统方案其实就是提供所有你可能需要用到的 CSS 工具。例如&#xff0c…

ES索引生命周期管理

基于如何 定时删除ES索引过期数据 而引发的一系列关于ES索引生命周期管理ILM(Index Lifecycle Management)的学习 快速上手 &#xff1a;定时删除ES索引中的过期数据 1. ILM解决什么问题&#xff1f; ES从6.7版本引入ILM&#xff0c;通过ILM可以解决哪些问题呢? 自动新建…

Python 课程22-Pillow

前言 Pillow 是一个 Python 图像处理库&#xff0c;是 Python Imaging Library (PIL) 的升级版。Pillow 提供了对常见图像文件格式&#xff08;如 PNG、JPEG、GIF 等&#xff09;的支持&#xff0c;并允许你进行图像裁剪、调整大小、旋转、滤镜应用、文本添加等操作。Pillow 广…

Applio:颠覆语音克隆的AI黑科技!

Applio&#xff1a;颠覆语音克隆的AI黑科技&#xff01; Applio是一个神奇的AI语音克隆工具✨&#xff0c;提供超过20,000种声音模型&#x1f3a4;&#xff0c;让你轻松创造独特音色&#x1f3b6;&#xff01;开源社区欢迎所有人参与&#xff0c;共同探索AI音频的无限可能&…

蓝桥杯备赛---2.新建工程

推荐根据视频进行工程建立 开发板资源简介&工程模板建立_哔哩哔哩_bilibili 目录 推荐根据视频进行工程建立 1.点击"File"下的"New Project"新建一个工程 ​编辑 2. 查看官方给的数据手册&#xff0c;选择对于的单片机型号 3. 查看原理图&#…