【精选】适合初学者小游戏井字棋(三子棋)(C语言),Easyx图形库应用+源代码分享

article/2025/1/10 16:39:16

【精选】井字棋(三子棋,C语言)


目录

  • 【精选】井字棋(三子棋,C语言)
    • 游戏展示
      • 一、项目环境
        • 简单介绍一下easyx图形库
        • Easyx图形库
      • 二、游戏规则介绍
      • 三、运行效果展示
      • 四、项目介绍
      • 五、项目源代码分享
      • 总结与思考
      • Bug遗留问题
      • Bug调试图如下:
      • 如图所示:可以在原本叉叉的上面直接覆盖,就是说玩家绝对输不了,必赢的游戏。


游戏展示

三子棋


一、项目环境

1.Visual Studio 2022
2.安装easyx图形库,可以调用头文件

#include<easyx.h>


简单介绍一下easyx图形库

EasyX库是一个基于C语言的图形界面库,可以用于Windows操作系统下的图形界面应用程序开发。该库提供了一些易于使用的图形绘制函数和简单的事件处理功能,可以帮助开发者快速地创建各种图形应用程序,如游戏、图形编辑器等。
EasyX库提供了丰富的绘图功能,如直线、矩形、圆形、椭圆、多边形等基本形状的绘制,同时还支持图片、文字、音频等多种媒体资源的加载和处理。此外,EasyX库还支持鼠标、键盘等多种事件的处理,可以让用户与应用程序进行交互。
EasyX库的另一个特点是易于学习和使用。它提供了简单的API,使得初学者也可以轻松地入门,并且具有丰富的在线文档和示例程序,帮助开发者快速地学习和理解如何使用这个库。除此之外,EasyX库还可以和Visual Studio等常见的集成开发环境进行配合使用,使得开发工作更加高效。
总之,EasyX库是一款简单易用、功能强大的图形界面库,适用于初学者和有一定编程基础的开发者,可以用于快速开发各种图形应用程序。


Easyx图形库

点击跳转到easyx图形库下载官网


二、游戏规则介绍

井字棋是一种简单的二人棋类游戏,通常在3x3的棋盘上进行,其中一方执X,另一方执O。游戏的目标是在棋盘上先将自己的符号排成一条直线,横线、竖线或斜线即可获胜。
具体游戏规则如下:
1、玩家与电脑轮流下棋,先手执O,后手执X;
2、玩家在空位上下棋,不能在已经有棋子的位置下;
3、当任意一方在棋盘上成功排成三个相同的符号直线时,该方获胜;
4、如果棋盘被下满但是没有任何一方成功排成一条直线,则平局。


三、运行效果展示

Step1:获胜
请添加图片描述
Step2:失败
请添加图片描述
Step3:平局
请添加图片描述


四、项目介绍

三子棋是一种经典的棋类游戏,玩家通过在棋盘上落子,以先在横、竖、斜线上连成三个相同棋子为胜利条件。为了让更多的人了解和体验三子棋的乐趣,本文使用C语言和EASYX图形库开发了一款三子棋项目。


五、项目源代码分享

井字棋游戏代码如下:

#include<stdio.h>
#include<easyx.h>
#include<graphics.h>
#include <windows.h>
#include <stdlib.h>
#include <string.h>
#include<iostream>
#include<Windows.h>
using namespace std;
int jingziqi(int &kk)
{//画格子setlinestyle(PS_SOLID, 4);setlinecolor(BLACK);//横线line(-300, 298, 300, 298);line(-300, 100, 300, 100);line(-300, -100, 300, -100);line(-300, -298, 300, -298);//竖线line(-298, 300, -298, -300);line(-100, 300, -100, -300);line(100, 300, 100, -300);line(298, 300, 298, -300);//将格子初始化为0int a[3][3];for (int i = 0; i < 3; i++){for (int j = 0; j < 3; j++){a[i][j] = 0;}}//鼠标消息——由于玩家先手标记并画圈圈//用1来标记圆圈//用2来标记叉叉int f = 2;while (1){if (MouseHit())//判断是否有鼠标信息{MOUSEMSG msg = GetMouseMsg();//接收鼠标信息 	printf("坐标(%d,%d)\n", msg.x, msg.y);switch (msg.uMsg){case WM_LBUTTONDOWN://第一行if (msg.x > 1 && msg.x < 199 && msg.y>1 && msg.y < 199){a[0][0] = 1;setlinecolor(BLUE);fillcircle(-200, 200, 100);f = f + 1;continue;}if (msg.x > 200 && msg.x < 400 && msg.y>1 && msg.y < 199){a[0][1] = 1;setlinecolor(BLUE);fillcircle(0, 200, 100);f = f + 1;continue;}if (msg.x > 400 && msg.x < 600 && msg.y>1 && msg.y < 199){a[0][2] = 1;setlinecolor(BLUE);fillcircle(200, 200, 100);f = f + 1;continue;}//第二行if (msg.x > 1 && msg.x < 200 && msg.y>200 && msg.y < 400){a[1][0] = 1;setlinecolor(BLUE);fillcircle(-200, 0, 100);f = f + 1;continue;}if (msg.x > 200 && msg.x < 400 && msg.y>200 && msg.y < 400){a[1][1] = 1;setlinecolor(BLUE);fillcircle(0, 0, 100);f = f + 1;continue;}if (msg.x > 400 && msg.x < 600 && msg.y>200 && msg.y < 400){a[1][2] = 1;setlinecolor(BLUE);fillcircle(200, 0, 100);f = f + 1;continue;}//第三行if (msg.x > 1 && msg.x < 200 && msg.y>400 && msg.y < 600){a[2][0] = 1;setlinecolor(BLUE);fillcircle(-200, -200, 100);f = f + 1;continue;}if (msg.x > 200 && msg.x < 400 && msg.y>400 && msg.y < 600){a[2][1] = 1;setlinecolor(BLUE);fillcircle(0, -200, 100);f = f + 1;continue;}if (msg.x > 400 && msg.x < 600 && msg.y>400 && msg.y < 600){a[2][2] = 1;setlinecolor(BLUE);fillcircle(200, -200, 100);f = f + 1;continue;}}}//随机画叉叉int x1 = -300, y1 = 300, x2 = -100, y2 = 100;//撇int x3 = -100, y3 = 300, x4 = -300, y4 = 100;//捺int i, j;i = rand() % 3;//取0~2的随机数j = rand() % 3;//取0~2的随机数if (a[j][i] == 0 && f % 2 != 0 && a[j][i] != 1){a[j][i] = 2;//标记叉叉为2setlinecolor(RED);line(-300 + i * 200, 300 - j * 200, -100 + i * 200, 100 - j * 200);line(-100 + i * 200, 300 - j * 200, -300 + i * 200, 100 - j * 200);f++;continue;}//横向if (a[0][0] == 1 && a[0][1] == 1 && a[0][2] == 1){//cout << "xiaoa wins.";setlinecolor(RGB(0, 240, 255));setlinestyle(PS_ENDCAP_ROUND, 8);line(-200, 200, 200, 200);break;}if (a[1][0] == 1 && a[1][1] == 1 && a[1][2] == 1){//cout << "xiaoa wins.";setlinecolor(RGB(0, 240, 255));setlinestyle(PS_ENDCAP_ROUND, 8);line(-200, 0, 200, 0);break;}if (a[2][0] == 1 && a[2][1] == 1 && a[2][2] == 1){//cout << "xiaoa wins.";setlinecolor(RGB(0, 240, 255));setlinestyle(PS_ENDCAP_ROUND, 8);line(-200, -200, 200, -200);break;}//竖向if (a[0][0] == 1 && a[1][0] == 1 && a[2][0] == 1){//cout << "xiaoa wins.";setlinecolor(RGB(0, 240, 255));setlinestyle(PS_ENDCAP_ROUND, 8);line(-200, 200, -200, -200);break;}if (a[0][1] == 1 && a[1][1] == 1 && a[2][1] == 1){//cout << "xiaoa wins.";setlinecolor(RGB(0, 240, 255));setlinestyle(PS_ENDCAP_ROUND, 8);line(0, 200, 0, -200);break;}if (a[0][2] == 1 && a[1][2] == 1 && a[2][2] == 1){//cout << "xiaoa wins.";setlinecolor(RGB(0, 240, 255));setlinestyle(PS_ENDCAP_ROUND, 8);line(200, 200, 200, -200);break;}//斜向if (a[0][0] == 1 && a[1][1] == 1 && a[2][2] == 1){//cout << "xiaoa wins.";setlinecolor(RGB(0, 240, 255));setlinestyle(PS_ENDCAP_ROUND, 8);line(-200, 200, 200, -200);break;}if (a[0][2] == 1 && a[1][1] == 1 && a[2][0] == 1){//cout << "xiaoa wins.";setlinecolor(RGB(0, 240, 255));setlinestyle(PS_ENDCAP_ROUND, 8);line(-200, -200, 200, 200);break;}//输了if (a[0][0] == 2 && a[0][1] == 2 && a[0][2] == 2){setlinecolor(RGB(0, 240, 255));setlinestyle(PS_ENDCAP_ROUND, 8);line(-200, 200, 200, 200);kk = 1;break;}if (a[1][0] == 2 && a[1][1] == 2 && a[1][2] == 2){setlinecolor(RGB(0, 240, 255));setlinestyle(PS_ENDCAP_ROUND, 8);line(-200, 0, 200, 0);kk = 1;break;}if (a[2][0] == 2 && a[2][1] == 2 && a[2][2] == 2){setlinecolor(RGB(0, 240, 255));setlinestyle(PS_ENDCAP_ROUND, 8);line(-200, -200, 200, -200);kk = 1;break;}//竖向if (a[0][0] == 2 && a[1][0] == 2 && a[2][0] == 2){setlinecolor(RGB(0, 240, 255));setlinestyle(PS_ENDCAP_ROUND, 8);line(-200, 200, -200, -200);kk = 1;break;}if (a[0][1] == 2 && a[1][1] == 2 && a[2][1] == 2){setlinecolor(RGB(0, 240, 255));setlinestyle(PS_ENDCAP_ROUND, 8);line(0, 200, 0, -200);kk = 1;break;}if (a[0][2] == 2 && a[1][2] == 2 && a[2][2] == 2){setlinecolor(RGB(0, 240, 255));setlinestyle(PS_ENDCAP_ROUND, 8);line(200, 200, 200, -200);kk = 1;break;}//斜向if (a[0][0] == 2 && a[1][1] == 2 && a[2][2] == 2){setlinecolor(RGB(0, 240, 255));setlinestyle(PS_ENDCAP_ROUND, 8);line(-200, 200, 200, -200);kk = 1;break;}if (a[0][2] == 2 && a[1][1] == 2 && a[2][0] == 2){setlinecolor(RGB(0, 240, 255));setlinestyle(PS_ENDCAP_ROUND, 8);line(-200, -200, 200, 200);kk = 1;break;}//平局现象if (a[0][0] != 0 && a[0][1] != 0 && a[0][2] != 0 && a[1][0] != 0 && a[1][1] != 0 && a[1][2] != 0 && a[2][0] != 0 && a[2][1] != 0 && a[2][2] != 0){kk = 2;break;}}return kk;
}
int Interactioninthecheckerswindow(int kk,int &kaishichongqi)
{setlinestyle(PS_ENDCAP_ROUND, 3);setlinecolor(BLACK);setfillcolor(WHITE);fillrectangle(-250, 80, 250, -80);LOGFONT fontstyle;gettextstyle(&fontstyle);fontstyle.lfQuality = ANTIALIASED_QUALITY;//抗锯齿setaspectratio(1, 1);RECT rect;rect.left = -250;rect.top = -250;rect.right = 250;rect.bottom = 250;settextstyle(&fontstyle);setbkmode(TRANSPARENT);//设置字体背景settextcolor(BLACK);//字体颜色settextstyle(45, 0, "微软雅黑");//设置字体样式//赢了if (kk == 0){drawtext(_T("恭喜玩家成功通过第1关(*^__^*)"), &rect, DT_CENTER | DT_VCENTER | DT_SINGLELINE);//获取句柄HWND hnd = GetHWnd();//设置窗口标题SetWindowText(hnd, "井字棋");//弹出窗口int isok = MessageBox(hnd, "是否进入第2关", "游戏提示", MB_YESNO);if (isok == IDYES){printf("你点击了YES\n");}else if (isok == IDNO){printf("你点击了NO\n");closegraph();return 0;}}//输了if (kk == 1){drawtext(_T("你输了是否选择重新再来!"), &rect, DT_CENTER | DT_VCENTER | DT_SINGLELINE);//获取句柄HWND hnd = GetHWnd();//设置窗口标题SetWindowText(hnd, "井字棋");//弹出窗口int isok = MessageBox(hnd, "是否重新开始游戏!", "游戏提示", MB_YESNO);if (isok == IDYES){printf("你点击了YES\n");kaishichongqi = 1;return kaishichongqi;}else if (isok == IDNO){printf("你点击了NO\n");closegraph();return 0;}}//平局现象if (kk == 2){drawtext(_T("平局是否选择重新开始!"), &rect, DT_CENTER | DT_VCENTER | DT_SINGLELINE);//获取句柄HWND hnd = GetHWnd();//设置窗口标题SetWindowText(hnd, "井字棋");//弹出窗口int isok = MessageBox(hnd, "是否重新开始游戏!", "游戏提示", MB_YESNO);if (isok == IDYES){printf("你点击了YES\n");kaishichongqi = 1;return kaishichongqi;}else if (isok == IDNO){printf("你点击了NO\n");closegraph();return 0;}}
}
int Tickgamewindow()
{int kk = 0,kaishichongqi=0;initgraph(600, 600);setbkcolor(WHITE);cleardevice();setorigin(300, 300);setaspectratio(1, -1);jingziqi(kk);cout << kk;Interactioninthecheckerswindow(kk,kaishichongqi);cout << kaishichongqi << endl;if (kaishichongqi == 1){Tickgamewindow();}return kk;
}
int main()
{Tickgamewindow();getchar();closegraph();return 0;
}

总结与思考

刚学完easyx库后就开始拿经典的井字棋游戏开始练习了,大概用了五六个小时左右,中途也遇到了些问题但最后都顺利的解决了。


Bug遗留问题

项目中有一处bug并未修改,感觉无伤大雅就放那了


Bug调试图如下:

请添加图片描述


如图所示:可以在原本叉叉的上面直接覆盖,就是说玩家绝对输不了,必赢的游戏。

当然想要修改也可以试着改一下文中的源代码,这个用的是二维数组写的,加了些判断条件,改也很容易把判断条件简单修改一下即可,追求完美的猿子们可以尝试一下哦🤭


http://chatgpt.dhexx.cn/article/arS3paif.shtml

相关文章

C语言图形库——EasyX基本贴图

在C语言的学习过程中&#xff0c;接触最多的就是黑乎乎的DOS窗口&#xff0c;这也是在消磨学习者的兴趣&#xff0c;学到最后可能还不知道C语言到底能做什么&#xff0c;难道就是输入输出数据吗&#xff1f;当然不是&#xff0c;C的用处很广泛&#xff0c;这里不做讨论。我们能…

#C语言或C++中强大的图形库——easyx

1.了解easyx图形库 EasyX Graphics Library 是针对 Visual C 的免费绘图库&#xff0c;支持 VC6.0 ~ VC2022&#xff08;以及VS2013~VS2022)&#xff0c;简单易用&#xff0c;学习成本极低&#xff0c;应用领域广泛。目前已有许多大学将 EasyX 应用在教学当中。 使用范围&…

产品 • B端和C端产品经理有什么区别?

一些概念 to-C产品分类&#xff1a; 直接触达型&#xff1a;类似一级市场——微信、微博等平台&#xff1b;间接触达型&#xff1a;二级市场——广告、公众号等 &#xff1b; 总的市场规模&#xff1a; 用户规模可用时间 —— 御豪同学 • 京东金融 • 数据产品经理 每位用户每…

B端产品思维全解析,提升产品经理核心竞争力

产品思维和用户思维组成了产品经理两大核心思维方法论。对两者的理解也代表了产品经理的产品理解方向。 很多人把产品思维和用户思维混在一起说&#xff0c;我觉得是不合适的&#xff0c;因为两个是互相搭配的关系&#xff0c;你也可以把产品思维理解成智商&#xff0c;用户思维…

全方位解析 C 端和 B 端的产品特性

近年来&#xff0c;互联网进入下半场&#xff0c;C 端流量红利逐渐消退&#xff0c;很多企业转向了 B 端服务&#xff0c;随之而来的是产品设计者的转型&#xff0c;现在越来越多的 C 端产品设计师开始涉足到 B 端产品的设计&#xff0c;这是一个知识迁移的过程&#xff0c;需要…

B端产品经理,应从哪些方面理解业务?

新人入职新公司后&#xff0c;第一个工作就是了解公司业务&#xff0c;一般都是看公司项目PPT、产品需求文档&#xff0c;根据现有系统功能梳理功能结构图、产品流程等方式&#xff0c;但并不能系统化地帮助我们了解公司业务&#xff0c;容易流于表面。 由于TO B业务往往具有鲜…

B端和C端产品区别

一、定义 B端的B是单词Business的缩写&#xff0c;即企业用户。 C端的C是单词Consumer的缩写&#xff0c;即个人用户。 二、区别 B端产品&#xff08;如**管理系统&#xff09;&#xff1a; B端产品注重操作的实用性&#xff0c;注重功能的实现效率&#xff0c;是为了工作而…

新入行的产品做C端还是B端?

作为一名产品经理&#xff0c;你是否曾思考过&#xff1a;新入行的产品&#xff0c;做C端还是B端发展前景更好&#xff1f; C端产品需要对用户需求有深刻的了解。你需要研究市场趋势、用户行为、竞争对手&#xff0c;然后设计出符合用户期望的产品。同时&#xff0c;你需要面对…

【产品经理】B端产品经理需知道几个市场概念

美国市场营销协会称&#xff1a;“市场是指一种货物或劳务的潜在购买者的集合需求。”简单的说市场是买卖双方交易的领域&#xff0c;有买方、有卖方、有商品或服务、有需求。我们可以简单的了解市场竞争程度、需求和供给模型和边际成本模型。 01市场竞争程度 《西方经济学》里…

为什么说用C端产品的思维做B端产品就是死路一条?

经常听行业大佬说起&#xff1a;如果用C端产品的思维做B端产品就是死路一条&#xff0c;那原因究竟是什么呢&#xff1f; 首先&#xff0c;需要明确的是C端产品和B端产品的用户群体和需求存在很大差异。C端产品的用户主要是消费者&#xff0c;更多的是被情感驱动。而B端产品的…

B端产品:通过线上渠道增长

老于笔记11.29 征服畏惧建立自信的最快最确实的方法&#xff0c;就是去做你害怕的事&#xff0c;直到你获得成功的经验。 前言 疫情让我们越来越重视线上流量。作为B端产品的市场运营&#xff0c;每天我有多少流量&#xff0c;从哪些地方来、转化情况如何&#xff0c;以及数据驱…

B端与C端产品区别

目录 一、B端与C端产品特点二、B端与C端产品区别三、B端和C端业务调研的区别四、B端和C端产品运营的区别五、产品的客户与用户六、两类用户的行为动机差异&#xff0c;决定了产品经理关注侧重点的差异七、决策优先级的差异 霸占大众视线的产品普遍都是C&#xff08;Customer&am…

C端产品和B端产品的区别

什么是B端产品&#xff1f; 典型的B端产品有CRM、ERP、OA、中台等。 什么是C端产品&#xff1f; C端则是微信、抖音、京东淘宝等。 B端产品和C端产品的区别&#xff1f; 一、面向用户不同 B端客户是企业级用户&#xff0c;用户群是稳定的、统一的。 B端产品面向的客户是企业…

企业中B端常用的十大产品分类详情

一、 引言 所谓B端产品&#xff0c;就是面向企业用户的互联网产品&#xff0c;是Bussiness的缩写。随着信息化时代的进步&#xff0c;人工的统计管理已经不能满足企业的管理需求&#xff0c;企业发展也越来越依赖于信息系统。 随着信息化时代的发展&#xff0c;涌现出越来越多的…

B端产品

文章目录 一、B端产品基础概念1、什么是B端产品2、B端产品分类方式3、核心工作内容4、需要掌握的能力 二、互联网底层知识1、产品方向2、互联网盈利模式3、B端产品细分 B端产品总体建设流程B和C总体建设流程的区别案例&#xff1a;M电商公司渠道分销产品设计制定工作计划业务调…

B端产品运营:获客渠道和方法

好的运营离不开精细化运营和打磨产品。 今天是2022年2月22日 星期二,互联网科技股全线飘绿。B端产品获客费用高,转化率低;初创公司成本打不平,下不来。B端产品运营难以接触真正使用者,难以洞察真正的需求。 一、B端与C端的获客差异 C端产品通过朋友圈等广告投放拉新、应…

B端产品如何进行业务全场景的需求梳理?

文章转载链接&#xff1a;http://www.51testing.com/html/12/n-7793012.html C端重体验B端重逻辑基本已经成为大部分产品世界的共识了&#xff0c;因此需求梳理成为了B端产品经理重要的工作场景。而如何进程需求梳理&#xff0c;首选应该先确定你是设计的一款标准化商业垂直型…

linux环境oracle冷备份,Oracle 热备份和冷备份的区别

一、 热备份 冷备份发生在数据库已经正常关闭的情况下&#xff0c;当正常关闭时会提供给我们一个完整的数据库。冷备份时将关键性文件拷贝到另外的位置的一种说法。对于备份Oracle信息而言&#xff0c;冷备份时最快和最安全的方法。冷备份的优点是&#xff1a; 1、 是非常快速的…

SQL Server数据库冷备份迁移

背景&#xff1a;现在要求把本地服务器的sql server数据库到另外一台服务器上时&#xff0c;一时摸不到头脑&#xff0c;但最后还是用备份还原的方式来完成了数据库的迁移。 注意事项 迁移之前需保证目的实例 SQL Server 版本不低于源实例版本。迁移库不能与云数据库 SQL Ser…