黑白翻转棋怎么弄(黑白棋游戏)

首页教程更新时间:2023-06-19 02:40:46

每天一个C语言小项目,提升你的编程能力!

《黑白棋》也叫翻转棋或者奥赛罗,其游戏过程是相互翻转对方的棋子,最后以棋盘上谁的棋子多来判断胜负。虽然规则简单,但是变化复杂,是典型的易学难精,奥妙无穷,不信您就试试看吧!

黑白翻转棋怎么弄,黑白棋游戏(1)

游戏规则

轮到一方下棋时,必须把棋下在与对方棋子相邻的空位上,要求所下的棋子和原有的已方棋子夹住对方的至少一个棋子(横竖斜夹均可),然后把被夹住的子变成己方的颜色(也叫吃子)。下棋过程中,任何棋子既不会从棋盘上拿走,也不会从一个格子移到另一个格子。在轮到一方下棋时,如果该方无子可吃,就必须停一步,让对方继续下棋,这种情况叫pass;而当一方在有子可吃时,即使想pass也不允许pass 。

黑白翻转棋怎么弄,黑白棋游戏(2)

今天我们就用C语言来实现它!

由于项目包含很多图片,因此这里给出整个项目的压缩包:https://codebus.cn/f/a/0/0/1/reversi.zip

以下是项目的全部源代码:

#include <graphics.h> #include <cstdio> #include <stdio.h> /*******************************定义全局变量*****************************/ char map[8][8]; //棋盘 IMAGE img[6]; //保存图片 int black, white; //双方的棋子数 char today; //当前轮到谁走 /**********************************定义函数*****************************/ void load(void) //加载图片 { loadimage(&img[0], "图片\\黑空.jpg"); loadimage(&img[1], "图片\\白空.jpg"); loadimage(&img[2], "图片\\黑子黑空.jpg"); loadimage(&img[3], "图片\\黑子白空.jpg"); loadimage(&img[4], "图片\\白子黑空.jpg"); loadimage(&img[5], "图片\\白子白空.jpg"); } void print(void) //画棋盘 { int x, y; black = white = 0; for(x = 0; x < 8; x ) for(y = 0; y < 8; y ) switch(map[x][y]) { case 0: if((x y) % 2) putimage(60 * y, 60 * x, &img[0]); else putimage(60 * y, 60 * x, &img[1]); break; case 'B': if((x y) % 2) putimage(60 * y, 60 * x, &img[2]); else putimage(60 * y, 60 * x, &img[3]); black ; break; case 'W': if((x y) % 2) putimage(60 * y, 60 * x, &img[4]); else putimage(60 * y, 60 * x, &img[5]); white ; break; } } inline void print1(void) //画当前谁走的 { setcolor(WHITE); bar(530, 60, 590, 120); bar(530, 360, 590, 420); if(today == 'B') putimage(530, 60, &img[3]); else putimage(530, 360, &img[4]); } void draw(int x, int y, char a) //下当前子 { char b = ((a == 'B') ? 'W' : 'B'); //敌方子 int x1, y1, x2, y2; bool sign = false; //是否越过敌方子 for(x1 = x - 1; x1 >= 0 && map[x1][y]; x1--) //判断上方 { if(map[x1][y] == b) sign = true; else { if(sign) { for(x2 = x - 1; x2 > x1; x2--) //判断下方 map[x2][y] = a; } break; } } sign = false; for(x1 = x 1; x1 < 8 && map[x1][y]; x1 ) //判断右方 { if(map[x1][y] == b) sign = true; else { if(sign) { for(x2 = x 1; x2 < x1; x2 ) map[x2][y] = a; } break; } } sign = false; for(y1 = y - 1; y1 >= 0 && map[x][y1]; y1--) //判断左方 { if(map[x][y1] == b) sign = true; else { if(sign) { for(y2 = y - 1; y2 > y1; y2--) map[x][y2] = a; } break; } } sign = false; for(y1 = y 1; y1 < 8 && map[x][y1]; y1 ) //判断右方 { if(map[x][y1] == b) sign = true; else { if(sign) { for(y2 = y 1; y2 < y1; y2 ) map[x][y2] = a; } break; } } sign = false; for(x1 = x - 1, y1 = y - 1; x1 >= 0 && y1 >= 0 && map[x1][y1]; x1--, y1--) //左上方 { if(map[x1][y1] == b) sign = true; else { if(sign) { for(x2 = x - 1, y2 = y - 1; x2 > x1 && y2 > y1; x2--, y2--) map[x2][y2] = a; } break; } } sign = false; for(x1 = x 1, y1 = y 1; x1 < 8 && y1 < 8 && map[x1][y1]; x1 , y1 ) //右下方 { if(map[x1][y1] == b) sign = true; else { if(sign) { for(x2 = x 1, y2 = y 1; x2 < x1 && y2 < y1; x2 , y2 ) map[x2][y2] = a; } break; } } sign = false; for(x1 = x 1, y1 = y - 1; x1 < 8 && y1 >= 0 && map[x1][y1]; x1 , y1--) //左下方 { if(map[x1][y1] == b) sign = true; else { if(sign) { for(x2 = x 1, y2 = y - 1; x2 < x1 && y2 > y1; x2 , y2--) map[x2][y2] = a; } break; } } sign = false; for(x1 = x - 1, y1 = y 1; x1 >= 0 && y1 < 8 && map[x1][y1]; x1--, y1 ) //右上方 { if(map[x1][y1] == b) sign = true; else { if(sign) { for(x2 = x - 1, y2 = y 1; x2 > x1 && y2 < y1; x2--, y2 ) map[x2][y2] = a; } break; } } map[x][y] = a; print(); } bool judge(int x, int y, char a) //判断当前是否可以落下,同draw函数 { char b = ((a == 'B') ? 'W' : 'B'); int x1, y1; bool sign = false, sign1 = false; //sign1判断是否有效 if(map[x][y]) //如果当前不是空的返回假值 return false; for(x1 = x - 1; x1 >= 0 && map[x1][y]; x1--) { if(map[x1][y] == b) sign = true; else { if(sign) sign1 = true; break; } } sign = false; for(x1 = x 1; x1 < 8 && map[x1][y]; x1 ) { if(map[x1][y] == b) sign = true; else { if(sign) sign1 = true; break; } } sign = false; for(y1 = y - 1; y1 >= 0 && map[x][y1]; y1--) { if(map[x][y1] == b) sign = true; else { if(sign) sign1 = true; break; } } sign = false; for(y1 = y 1; y1 < 8 && map[x][y1]; y1 ) { if(map[x][y1] == b) sign = true; else { if(sign) sign1 = true; break; } } sign = false; for(x1 = x - 1, y1 = y - 1; x1 >= 0 && y1 >= 0 && map[x1][y1]; x1--, y1--) { if(map[x1][y1] == b) sign = true; else { if(sign) sign1 = true; break; } } sign = false; for(x1 = x 1, y1 = y 1; x1 < 8 && y1 < 8 && map[x1][y1]; x1 , y1 ) { if(map[x1][y1] == b) sign = true; else { if(sign) sign1 = true; break; } } sign = false; for(x1 = x 1, y1 = y - 1; x1 < 8 && y1 >= 0 && map[x1][y1]; x1 , y1--) { if(map[x1][y1] == b) sign = true; else { if(sign) sign1 = true; break; } } sign = false; for(x1 = x - 1, y1 = y 1; x1 >= 0 && y1 < 8 && map[x1][y1]; x1--, y1 ) { if(map[x1][y1] == b) sign = true; else { if(sign) sign1 = true; break; } } return sign1; } bool win(void) //判断是否有棋可走 { int x, y; for(x = 0; x < 8; x ) for(y = 0; y < 8; y ) if(judge(x, y, today)) return true; return false; } bool quit(void) //判断是否有棋 { int x, y; bool b = false, w = false; for(x = 0; x < 8; x ) for(y = 0; y < 8; y ) { if(map[x][y] == 'B') b = true; else if(map[x][y] == 'W') w = true; } return(b && w); } bool ask(void) //弹出对话框 { HWND wnd = GetHWnd(); int key; char str[30] = "黑:", s[2]; sprintf(s, "%d", black); strcat(str, s); strcat(str, " 白:"); sprintf(s, "%d", white); strcat(str, s); strcat(str, "\n是否重新开始?"); if(black == white) key = MessageBox(wnd, str, "和局", MB_YESNO | MB_ICONQUESTION); else if(black > white) key = MessageBox(wnd, str, "黑胜", MB_YESNO | MB_ICONQUESTION); else key = MessageBox(wnd, str, "白胜", MB_YESNO | MB_ICONQUESTION); if(key == IDYES) return true; else return false; } void play(void) //游戏过程 { MOUSEMSG m; int x, y; for(x = 0; x < 8; x ) for(y = 0; y < 8; y ) map[x][y] = 0; map[3][4] = map[4][3] = 'B'; map[3][3] = map[4][4] = 'W'; today = 'B'; print(); print1(); do { do { while(true) { m = GetMouseMsg(); //获取鼠标消息 if(m.uMsg == WM_LBUTTONDOWN) //如果左键点击 break; } x = m.y / 60; y = m.x / 60; if(judge(x, y, today)) //如果当前位置有效 { draw(x, y, today); //下子 today = ((today == 'B') ? 'W' : 'B'); print1(); //交换 } }while(win() && quit()); //如果当前无棋可走 today = ((today == 'B') ? 'W' : 'B'); print1(); }while(win() && quit()); //双层判断 } int main(void) //主函数 { initgraph(640, 480); load(); setbkcolor(WHITE); cleardevice(); do { play(); }while(ask()); closegraph(); return 0; }

大家赶紧去动手试试吧!

此外,我也给大家分享我收集的其他资源,从最零基础开始的教程到C语言C 项目案例,帮助大家在学习C语言的道路上披荆斩棘!

编程学习书籍分享:

黑白翻转棋怎么弄,黑白棋游戏(3)

编程学习视频分享:

黑白翻转棋怎么弄,黑白棋游戏(4)

整理分享(多年学习的源码、项目实战视频、项目笔记,基础入门教程)最重要的是你可以在群里面交流提问编程问题哦!

对于C/C 感兴趣可以关注小编在后台私信我:【编程交流】一起来学习哦!可以领取一些C/C 的项目学习视频资料哦!已经设置好了关键词自动回复,自动领取就好了!

,
图文教程
相关文章
热门专题
推荐软件
奇热小说
奇热小说
下载
QQ2019手机版
QQ2019手机版
下载
王者荣耀
王者荣耀
下载
百度浏览器迷你版
百度浏览器迷你版
下载
2345浏览器手机版
2345浏览器手机版
下载
网易邮箱
网易邮箱
下载
爱奇艺
爱奇艺
下载
网易云音乐
网易云音乐
下载
WPSOffice
WPSOffice
下载
优酷
优酷
下载
谷歌浏览器(Chrome)
谷歌浏览器(Chrome)
下载
迅雷看看播放器
迅雷看看播放器
下载
UC浏览器
UC浏览器
下载
QQ音乐
QQ音乐
下载
阿里旺旺买家版v9.12.10C官方版
阿里旺旺买家版v9.12.10C官方版
下载
360安全卫士v12.1官方版
360安全卫士v12.1官方版
下载
猜你喜欢
火柴人英雄怪物时代
火柴人英雄怪物时代
下载
脚下功夫足球汉化版
脚下功夫足球汉化版
下载
校园签到
校园签到
下载
微信多窗口合并管理器v1.2官方版
微信多窗口合并管理器v1.2官方版
下载
捕鱼归来3
捕鱼归来3
下载
经典繁超宋
经典繁超宋
下载
晓搜题iOS
晓搜题iOS
下载
穿行三国
穿行三国
下载
钻石的中海挑战ios版
钻石的中海挑战ios版
下载
Pingle省省吧app
Pingle省省吧app
下载
TotalCommanderV7.0
TotalCommanderV7.0
下载
到家客商家版
到家客商家版
下载
乐视1s驱动程序官方版
乐视1s驱动程序官方版
下载
八哥五笔打字员v2018官方版
八哥五笔打字员v2018官方版
下载
木材厂闲置
木材厂闲置
下载
军团纷争
军团纷争
下载