首先感谢您能打开我的文章,希望您能看完,有不对或者可以改进的地方,留言在下面,再次感谢。把之前写的的一个五子棋游戏共享出来,希望大家喜欢。自己把学习过程的一些方法和笔记,以及针对出现的各种错误解决方法共享在博客里面。虽然自己很菜,但我还是会一如既往的,努力变的优秀,会一直努力不断地改进。希望对您有帮助。 VS2013 先绘制菜单,然后绘制棋盘 获取鼠标点击事件 计算鼠标点击的位置 导入一下这个图标 完成五子棋游戏,需要安装图形库,以及它里面的相关知识,思路理清楚啦,写起来就容易多了。注意最后导入图标是.ico格式的,看代码的时候横屏看效果好点。
前言
开发工具
easyx图形库 官网下载效果展示
流程图
构建框架
#include<easyx.h> #include<stdio.h> void drawMenu()//菜单 { } void init()//初始化 { } void draw()//绘制 { } bool is_win()//游戏是否结束 { } void play_game()//玩家交互 { } void run_game()//开始游戏 { init();//初始化 while (true) { play_game();//玩游戏 draw();//绘制 if (is_win())//判断一下是否结束 { //重新开始或者跳出 } } } int main() { drawMenu();//菜单 run_game(); system("pause"); return 0; }
逻辑关系
画棋子
使用循环语句结合判断语句实现五子棋效果for (int i = 0; i < N; i++)//N行 for (int j = 0; j < N; j++)//N列 if (chess[i][j] == 0) continue; if (chess[i][j] == 1)//画黑棋 setfillcolor(BLACK); if (chess[i][j] == 2)//画白棋 setfillcolor(WHITE); solidcircle(size*(j+1), size*(i+1), size / 4);//棋子大小
MOUSEMSG msg = GetMouseMsg(); msg.uMsg == WM_LBUTTONDOWN//鼠标操作左键按下
设置棋盘数据
胜利判断:黑棋或者白棋,出现五个棋子连在一起即胜利。
从玩家点击事件上确定点击的位置
从每次的点击位置进行判断
胜利后重新开始游戏
x轴是左向右的,y轴是从上往下的。在数学中(x,y)
而在计算机中数组arr[i][j] i的值放在第一位。
源代码
#include<stdio.h> #include<stdlib.h> #include<easyx.h>//图形库头文件 #include<mciapi.h>//音乐播放头文件 #pragma comment(lib,"winmm.lib") #define N 15 //格子数目15*15 int length = 500;//棋盘大小 float size;//每一个格子大小 int chess[N][N];//棋位置 bool is_init;//是否初始化 bool is_black;//是否黑棋 bool is_gameover;//是否游戏结束 void drawMenu()//菜单 { initgraph(500, 500);//菜单窗口大小 500 500 setbkcolor(WHITE);//背景颜色 cleardevice();//屏幕填充成背景色 setfillcolor(BLUE);//填充颜色 settextstyle(25, 0, L"宋体");//字体样式 setbkmode(TRANSPARENT);//样式 fillrectangle(190, 100, 310, 150);//在指定位置画矩形 fillrectangle(190, 100 + 60, 310, 150 + 60); outtextxy(190+ 10, 100 + 13, L"开始游戏");//在指定位置输出文字 outtextxy(190 + 10, 100 + 13 + 60, L"退出游戏"); settextcolor(RED);//字体颜色 outtextxy(130, 280, L"追梦五子棋游戏v1.2.0版本"); MOUSEMSG m;//鼠标事件 while (1) { m = GetMouseMsg(); if (m.x >= 190 && m.x <= 310 && m.y >= 100 && m.y <= 150) { setlinecolor(BLACK); rectangle(190 - 5, 100 - 5, 310 + 5, 150 + 5); if (m.uMsg == WM_LBUTTONDOWN)//鼠标左键按下 { break; } } else if (m.x >= 190 && m.x <= 310 && m.y >= 160 && m.y <= 210) { setlinecolor(BLACK); rectangle(190 - 5, 160 - 5, 310 + 5, 210 + 5); if (m.uMsg == WM_LBUTTONDOWN) { exit(0); } } else { setlinecolor(WHITE); rectangle(190 - 5, 100 - 5, 310 + 5, 150 + 5); rectangle(190 - 5, 160 - 5, 310 + 5, 210 + 5); } } closegraph(); } void init()//初始化 { initgraph(length, length); if (!is_init)//是否初始化 { memset(chess, 0, sizeof(chess)); } is_init= true; memset(chess, 0, sizeof(chess)); size = (float)length / (N + 1); is_black = true; is_gameover = false; } void draw_chess()//画棋子 { for (int i = 0; i < N; i++)//N行 { for (int j = 0; j < N; j++)//N列 { if (chess[i][j] == 0) { continue; } if (chess[i][j] == 1)//黑棋 { setfillcolor(BLACK); } if (chess[i][j] == 2)//白棋 { setfillcolor(WHITE); } solidcircle(size*(j+1), size*(i+1), size / 4);//棋子大小 } } } void draw_background()//画棋盘 { setbkcolor(BLUE);//棋子颜色 cleardevice();//屏幕填充成背景色 setlinecolor(BLACK);//线条颜色 settextcolor(RED);//数字颜色 for (int i = 1; i <= N; i++)//画线 { line(size, size*i, length - size, size*i);//横线 line(size*i, size, size*i, length - size);//竖线 TCHAR nums[3]; wsprintf(nums, _T("%d"), i); outtextxy(size - size / 2, size*i - size / 8, nums); outtextxy(size*i - size / 8, size - size / 2, nums); } //绘制圆点 setfillcolor(0x0); int m = 3; fillcircle(size*m, size*m, size / 8); fillcircle(size*m, size*(N - m + 1), size / 8); fillcircle(size*(N - m + 1), size*m, size / 8); fillcircle(size*(N - m + 1), size*(N - m + 1), size / 8); fillcircle(size*(N / 2 + 1), size*(N / 2 + 1), size / 8); } void draw()//批量加载绘制 { BeginBatchDraw(); draw_background(); draw_chess(); EndBatchDraw(); } bool is_win(int x,int y)//是否胜利 { if (chess[y][x] == 0) { return false; } int dir[][2] = { { 0, 1 }, { 1, 0 }, { 1, 1 }, { 1, -1 } }; for (int i = 0; i < 4; i++) { int contion = 1; bool f1 = true, f2 = true; for (int j = 1; j < 5; j++) { int dx = x + dir[i][1] * j; int dy = y + dir[i][0] * j; int rx = x - dir[i][1] * j; int ry = y - dir[i][0] * j; if (dx >= 0 && dx < N&&dy >= 0 && dy < N&&chess[dy][dx] == chess[y][x]) { contion++; } else { f1=false; } if (rx >= 0 && ry < N&&rx < N&&ry >= 0 && chess[y][x] == chess[ry][rx]) { contion++; } else { f2=false; } } if (contion >= 5) { return true; } } return false; } void play_game()//游戏过程 玩家交互 { MOUSEMSG msg = GetMouseMsg(); if (msg.uMsg == WM_LBUTTONDOWN)//鼠标操作左键按下 { int x = (msg.x-size/2) / size; int y = (msg.y-size/2) / size; if (chess[y][x] == 0 && x >= 0 && x < N&&y >= 0 && y < N) { chess[y][x]=is_black ? 1 : 2; if (is_win(x, y)) { is_gameover = true; return; } is_black = !is_black; } } } void run_game()//开始游戏 { init(); while (true) { play_game(); draw(); if (is_gameover) { if (is_black)//黑棋胜利 { MessageBox(GetHWnd(), _T("黑棋胜利"), _T("游戏结束"), 0); } else { MessageBox(GetHWnd(), _T("白棋胜利"), _T("游戏结束"), 0); } init(); } } } int main()//主函数 { mciSendString(L"open txz.mp3", 0, 0, 0);//打开音乐 mciSendString(L"play txz.mp3", 0, 0, 0);//播放音乐 drawMenu();//菜单 run_game();//游戏过程 system("pause"); return 0; }
导入图标
第一步
第二步
总结
本网页所有视频内容由 imoviebox边看边下-网页视频下载, iurlBox网页地址收藏管理器 下载并得到。
ImovieBox网页视频下载器 下载地址: ImovieBox网页视频下载器-最新版本下载
本文章由: imapbox邮箱云存储,邮箱网盘,ImageBox 图片批量下载器,网页图片批量下载专家,网页图片批量下载器,获取到文章图片,imoviebox网页视频批量下载器,下载视频内容,为您提供.
阅读和此文章类似的: 全球云计算