实例介绍
【实例截图】

【核心代码】#include<graphics.h>
char board_data[3][3] = //定义棋盘数据结构
{
{'-','-','-'},
{'-','-','-'},
{'-','-','-'},
};
char current_piece = 'o'; //标识当前落子类型
bool CheckWin(char c) //检测指定棋子的玩家是否获胜,共8种情况
{
if (board_data[0][0] == c && board_data[0][1] == c && board_data[0][2] == c)
return true;
if (board_data[1][0] == c && board_data[1][1] == c && board_data[1][2] == c)
return true;
if (board_data[2][0] == c && board_data[2][1] == c && board_data[2][2] == c)
return true;
if (board_data[0][0] == c && board_data[1][0] == c && board_data[2][0] == c)
return true;
if (board_data[0][1] == c && board_data[1][1] == c && board_data[2][1] == c)
return true;
if (board_data[0][2] == c && board_data[1][2] == c && board_data[2][2] == 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;
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;
defalt:
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; //消息处理,ExMessage是EasyX中,存储消息的结构体。
BeginBatchDraw(); //开启游戏批量绘图
while (running)
{
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';
}
}
}
//创建、显示并操作一个消息对话框,使用GetHWnd()函数获取句柄。
if (CheckWin('x'))
{
MessageBox(GetHWnd(), _T("X 玩家获胜"),_T("游戏结束"),MB_OK);
running = false;
}
else if (CheckWin('o'))
{
MessageBox(GetHWnd(), _T("O 玩家获胜"), _T("游戏结束"), MB_OK);
running = false;
}
else if (CheckDraw())
{
MessageBox(GetHWnd(), _T("平局!"), _T("游戏结束"), MB_OK);
running = false;
}
cleardevice();//清空绘图设备
DrawBoard(); //绘制棋盘网格
DrawPiece(); //绘制棋子
DrawTipText(); //绘制提示信息
FlushBatchDraw();//消除闪烁
}
EndBatchDraw();//刷新批量绘图的缓冲区
return 0;
}
标签: 井字棋游戏
小贴士
感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。
- 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
- 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
- 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
- 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。
关于好例子网
本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明
网友评论
我要评论