滨州淘宝网站建设,免费做问卷的网站,哪些网站可以做外链,wdcp怎么上传做好的网站大家好#xff0c;有没有觉得写了好多c语言代码#xff0c;面对的都是黑框框控制台#xff0c;当我们学习了基础的c语言知识#xff0c;和EasyX图形库后#xff0c;终于可以和黑框框saygoodbye,今天要分享给大家的是小游戏五子棋#xff0c;跟着小张一起学习吧 EasyX图形… 大家好有没有觉得写了好多c语言代码面对的都是黑框框控制台当我们学习了基础的c语言知识和EasyX图形库后终于可以和黑框框saygoodbye,今天要分享给大家的是小游戏五子棋跟着小张一起学习吧 EasyX图形库安装
图形库链接 1.点击下载 2.安装你对应集成开发环境对应的安装包我用的是vs2019 3.ok,我们使用库函数加上头文件即可 棋盘的绘制
注意创建必须是.cpp,要不然图形库用不了 棋盘大小我们搞成15*15的格子每个格子长宽为30每个棋子半径搞成13棋盘格长450宽450为了防止边界下的棋子显示不完全每个边在向外延申15界面总大小为480×480 1.棋盘木板
initgraph(480, 480);//初始化一个窗口窗口大小480*480;此时窗口闪一下就消失了尝试加一个while循环 #includegraphics.h//包含图形库头文件
int main()
{initgraph(480, 480);while (1){}}编译运行 这个并非控制台的黑框框 五子棋背景一般是棕色我们需要自己画一个棕色背景图片贴上去,大小和界面大小480*480一样大 IMAGE p;//定义一个图片变量
loadimage(p, ./background.png, 480, 480);//加载图片函数参数1图片地址参数2图片的位置图片大小./为当前目录下和.c文件放在一个目录下面
putimage(0, 0, p);//贴图片到界面上去参数12为图片从界面的哪个位置开始贴#includegraphics.h//包含图形库头文件
IMAGE p;
int main()
{initgraph(480, 480);loadimage(p, ./background.png, 480, 480);putimage(0, 0, p);while (1){}}如果出现该问题调试属性高级字符集改为多字符集就行了 编译运行 2.开始画线
setlinecolor(BLACK);//设置线颜色的函数黑线
for (int x 15; x 480; x 30)//循环画竖线{line(x, 15, x, 465);//画线函数前两个参数为起始点x,y,后两个参数为终点x,y}for (int y 15; y 480; y 30)//循环画横线{line(15, y, 465,y);}#includegraphics.h//包含图形库头文件
IMAGE p;
int main()
{initgraph(480, 480);loadimage(p, ./background.png, 480, 480);putimage(0, 0, p);setlinecolor(BLACK);for (int x 15; x 480; x 30){line(x, 15, x, 465);}for (int y 15; y 480; y 30){line(15, y, 465, y);}while (1){}}编译运行 3.专业棋盘好像有5个黑点点圆 对应五个点的坐标 setfillcolor(BLACK);//设置圆的颜色fillcircle(15 3 * 30, 15 3 * 30, 3);前两个参数为圆的圆心坐标第三个参数为圆的半径fillcircle(15 3 * 30, 15 11 * 30, 3);fillcircle(15 11 * 30, 15 3 * 30, 3);fillcircle(15 7 * 30, 15 7 * 30, 3);fillcircle(15 11 * 30, 15 11 * 30, 3);编译运行 #includegraphics.h//包含图形库头文件
IMAGE p;
int main()
{initgraph(480, 480);loadimage(p, ./background.png, 480, 480);putimage(0, 0, p);setlinecolor(BLACK);for (int x 15; x 480; x 30){line(x, 15, x, 465);}for (int y 15; y 480; y 30){line(15, y, 465, y);}setfillcolor(BLACK);fillcircle(15 3 * 30, 15 3 * 30, 3);fillcircle(15 3 * 30, 15 11 * 30, 3);fillcircle(15 11 * 30, 15 3 * 30, 3);fillcircle(15 7 * 30, 15 7 * 30, 3);fillcircle(15 11 * 30, 15 11 * 30, 3);while (1){}}获取鼠标点击
ExMessage msg;//消息结构体变量
if (peekmessage(msg, EX_MOUSE)) //偷瞄消息第一个消息结构体地址第二个参数鼠标消息{switch (msg.message) //鼠标消息{case WM_LBUTTONDOWN: //左键draw(msg.x, msg.y);//鼠标光标位置坐标break;}}当鼠标左键按下时将此时的鼠标在对应界面的坐标传递给draw函数需要随时获取鼠标的消息将上述代码放在循环里面 while (1){if (peekmessage(msg, EX_MOUSE)) //偷瞄消息第一个消息结构体地址鼠标消息{switch (msg.message) //鼠标消息{case WM_LBUTTONDOWN: //左键draw(msg.x, msg.y);break;}}}
画棋子
将鼠标点击的坐标传到draw函数中来定义一个全局变量num,判断是黑子还是白子num1,黑子下num-1,白子下。
int num 1;void draw(int m, int n)
{if (num -1){setfillcolor(WHITE);//设置圆的填充色白色白棋}else if (num 1){setfillcolor(BLACK);//设置圆的填充色黑色黑棋}fillcircle(m - m % 30 15, n - n % 30 15, 13);//画圆圆的x,y,半径棋子的绘制num * -1;//黑白棋轮着下每次调用draw,改变num值实现黑白黑白黑白}
为什么棋子坐标是m - m % 30 15, n - n % 30 15因为鼠标不可能一点就是要下的坐标只能鼠标点在某一个范围就把该棋子落在离鼠标点的位置最近的位置如果鼠标的坐标为4848传给draw时 我们知道应该下在这个位置经过处理后是4545刚好是要下的位置避免棋子落在不该落的位置。 编译运行 解决棋子可以下在棋子上面的问题
在点一次黑色棋子被覆盖 我们可以定义一个二维数组15*15刚开始初始化为0如果数组下标对应棋盘的地方有黑棋把对应二维数组中的值放1如果数组下标对应棋盘的地方有白棋把对应二维数组中的值放-1如果鼠标点击的位置有棋子的话直接return掉不进行绘制棋子 二维数组的初始化: int arr[15][15];//全局变量好操作
void initboard()
{for (int i 0; i 15; i){for (int j 0; j 15; j){arr[i][j] 0;//循环初始化二维数组}}
}int full(int x, int y)
{if (arr[x][y] ! 0)//如果不等于0表示下过棋了return 0;return 0;else//如果等于0表示没下过棋了将该数组对应位置放num,return 1;arr[x][y] num;return 1;
}
void draw(int m,int n)
{if (num -1){ setfillcolor(WHITE);}else if (num 1){ setfillcolor(BLACK);}int x;int y;yx m / 30;//二维数组横坐标m鼠标横坐标如果m48,x就是1y n / 30;//二维数组纵坐标n鼠标纵坐标如果n48,y就是1if (full(x,y) 0)//等于0表示下过棋了直接return跳出draw,如果1跳过这个条件判断语句开始下棋return;fillcircle(m - m % 30 15, n - n % 30 15, 13);//下棋num * -1;}
此时不能下下过的位置
判断输赢
int check_over()
{for (int i 0; i 15; i){for (int j 0; j 15; j){if (arr[i][j] 0)continue;if (check_five(i, j) 1){q arr[i][j];return 1;}}}}因为二维数组记录了下棋的状况对应位置为1则是黑棋-1为白棋0是未下循环遍历每个数组元素先是找到下过棋的位置没下过棋的位置直接跳过因为我们是通过这个函数将下过棋的坐标传给 check_five(int x, int y)然后根据下x,y坐标相邻的五个是否一样如果没下的话直接跳过防止五个相邻位置没下棋都是0进入check_five(int x, int y)五个0也是一样然后游戏就结束了 int check_five(int x, int y)
{//检查一个下过棋的坐标相邻五个是否一样if (arr[x][y] arr[x - 1][y] arr[x][y] arr[x - 2][y] arr[x][y] arr[x 1][y] arr[x][y] arr[x 2][y])//横行判断return 1;if (arr[x][y] arr[x][y-1] arr[x][y] arr[x][y-2] arr[x][y] arr[x][y1] arr[x][y] arr[x][y2])//纵行判断return 1;if (arr[x][y] arr[x - 1][y-1] arr[x][y] arr[x - 2][y-2] arr[x][y] arr[x 1][y1] arr[x][y] arr[x 2][y2])以该坐标为中心主对角线判断return 1;if (arr[x][y] arr[x - 1][y1] arr[x][y] arr[x2][y-2] arr[x][y] arr[x 1][y-1] arr[x][y] arr[x-2][y2])以该坐标为中心副对角线判断return 1;
//相同则返回1
//不同返回0return 0;
}在check_over()中如果check_five(i, j) 返回一则有五个连成将该坐标对应二维数组中的值保存在q全局变量中然后check_over()返回1
if (check_over() 1){outtextxy(180, 180, 游戏结束);//输出文字,参数一参数二为文字左上角坐标参数三为文字内容//change();//消息盒子函数,提示谁赢了system(pause);//退出程序头文件windows.h}在调用之前必须 settextstyle(40, 20, 隶书);//设置字体高度宽度字体的格式setbkmode(TRANSPARENT);//字体后面设置透明背景模式编译运行 提示输赢
void change()//消息盒子函数,提示谁赢了
{HWND hnd GetHWnd(); //获取窗口句柄相当于窗口的指针SetWindowText(hnd, 五子棋); //设置窗口标题int isok;if(q1)//q获取的是赢家对应二维数组的消息黑子为1 //isok MessageBox(NULL, 黑子胜, 提示, MB_OKCANCEL); //弹出消息盒子,提示用户操作else if(q-1)isok MessageBox(NULL, 白子胜, 提示, MB_OKCANCEL);if (IDOK isok) //返回点了哪里{ //点了ok}else if (IDCANCEL isok) //点了取消{}
}编译运行 背景音乐函数
这里可以去看动态通讯录那一篇加音乐有具体步骤
#includegraphics.h//包含图形库头文件
#includemmsystem.h//包含多媒体设备接口头文件#pragma comment(lib,winmm.lib)//加载静态库
void bgm()
{ //打开音乐mciSendString(open ./music.MP3, 0, 0, 0);//后面参数不用管//播放音乐mciSendString(play ./music.MP3, 0, 0, 0);//后面参数不用管
}整体代码展示 #include windows.h
#includegraphics.h//包含图形库头文件
#includemmsystem.h//包含多媒体设备接口头文件#pragma comment(lib,winmm.lib)//加载静态库
IMAGE p;
int num 1;
int q;
int arr[15][15];
void change()
{HWND hnd GetHWnd(); //获取窗口句柄相当于窗口的指针SetWindowText(hnd, 五子棋); int isok;//设置窗口标题if(q1) //isok MessageBox(NULL, 黑子胜, 提示, MB_OKCANCEL); //弹出消息盒子,提示用户操作else if(q-1)isok MessageBox(NULL, 白子胜, 提示, MB_OKCANCEL);if (IDOK isok) //返回点了哪里{ //点了ok}else if (IDCANCEL isok) //点了取消{}
}
void bgm()
{ //打开音乐mciSendString(open ./music.MP3, 0, 0, 0);//后面参数不用管//播放音乐mciSendString(play ./music.MP3, 0, 0, 0);//后面参数不用管
}
void initboard()
{for (int i 0; i 15; i){for (int j 0; j 15; j){arr[i][j] 0;}}
}
int full(int x, int y)
{if (arr[x][y] ! 0)return 0;elsearr[x][y] num;return 1;
}
void draw(int m,int n)
{if (num -1){ setfillcolor(WHITE);}else if (num 1){ setfillcolor(BLACK);}int x;int y;x m / 30;y n / 30;if (full(x,y) 0)return;fillcircle(m - m % 30 15, n - n % 30 15, 13);num * -1;}
int check_five(int x, int y)
{//if (x 2 || y 2 || x12 || y12)//return 0;if (arr[x][y] arr[x - 1][y] arr[x][y] arr[x - 2][y] arr[x][y] arr[x 1][y] arr[x][y] arr[x 2][y])return 1;if (arr[x][y] arr[x][y-1] arr[x][y] arr[x][y-2] arr[x][y] arr[x][y1] arr[x][y] arr[x][y2])return 1;if (arr[x][y] arr[x - 1][y-1] arr[x][y] arr[x - 2][y-2] arr[x][y] arr[x 1][y1] arr[x][y] arr[x 2][y2])return 1;if (arr[x][y] arr[x - 1][y1] arr[x][y] arr[x2][y-2] arr[x][y] arr[x 1][y-1] arr[x][y] arr[x-2][y2])return 1;return 0;
}
int check_over()
{for (int i 0; i 15; i){for (int j 0; j 15; j){if (arr[i][j] 0)continue;if (check_five(i, j) 1){q arr[i][j];return 1;}}}}
int main()
{bgm();ExMessage msg;initgraph(480, 480);loadimage(p,./background.png,480,480);putimage(0, 0, p);setlinecolor(BLACK);for (int x 15; x 480; x 30){line(x, 15, x, 465);}for (int y 15; y 480; y 30){line(15, y, 465,y);}setfillcolor(BLACK);fillcircle(15 3 * 30, 15 3 * 30, 3);fillcircle(15 3 * 30, 15 11 * 30, 3);fillcircle(15 11 * 30, 15 3 * 30, 3);fillcircle(15 7 * 30, 15 7 * 30, 3);fillcircle(15 11 * 30, 15 11 * 30, 3);settextstyle(40, 20, 隶书);setbkmode(TRANSPARENT);while (1){if (peekmessage(msg, EX_MOUSE)) //偷瞄消息第一个消息结构体地址鼠标消息{switch (msg.message) //鼠标消息{case WM_LBUTTONDOWN: //左键draw(msg.x, msg.y);break;}}if (check_over() 1){outtextxy(180, 180, 游戏结束);change();system(pause);}}
}效果展示 20230821_194813