2024年3月21日发(作者:)
成三棋(人对人版)
作者:梦承成
成三棋游戏规则
1 首先双方在棋盘上轮流投子。
2 在投子期间,如果有某一方的某一行或一列,都为该方棋子(也就是成三)该方选择打子
(打掉必须是对方的非成三子,如果对方的棋子都是成三子,便换手)。该打子位置被贴上一
张大小与棋子一样大小的图片(表示该位置不能投子。在挪子部分的时候,该位置被撤销)。
3 当后手方投下第九子,开始由先手方移动棋子,进入挪子部分,开始轮流挪子。
4 挪子期间的规则是:当需要点击想移动某一棋子时,该棋子便闪动。再点击它将去的位
置时,原来的位置棋子消失新位置出现该方棋子。当点击某棋子使其闪动时,但此时觉得点
错子了,便可以将闪动棋子再点击一下。棋子便不闪动,便可以选择新的棋子了。该期间的
打子规则与投子期间几乎一样,就是被打子位置不会被贴图,而会直接消失。
5 当一方棋子数少于3或该方走棋时发现无棋可移动(也就该方是没气),则该方为输了,
棋局结束。
棋盘定义
整个棋盘建立一张表格用以记录棋子信息,我们使用一个7*7的二维数组board[7][7]
(7*7是成三棋棋盘的大小),设想棋盘由覆盖在把由长有宽都为7小正方形组成(60×60的
小正方形),也就是棋盘背景区域左上角坐标(0,0)右下角坐标为(420,420),棋盘上有
效区用下面控制输出。
If(m!=3)||(n!=3)
If(m-n)==0||(m+n)==0|| m==3 || n==3)
if(x > 0 && x < 420 && y> 0 && y < 420)
m表示横向的第几个格子 在API中LOWORD(lparam))/60
n表示纵向的第几个格子 在API中HOWORD(lparam))/60
x = LOWORD(lParam) y = HIWORD(lParam)
在下图中横纵两条直线的焦点为产生棋子的中心区,在最外层的60×60的小正方形为有效
的产生棋子的区域 ,里面的两层的有效区域与外层一样,故此没画。
全局变量介绍
//用board结构体数组来表示棋盘上棋子的信息
struct stu
{
int data;// 0表示空格 1第一方 2第二方
int flag ;//1显示棋字 0不显示
};
struct stu board[7][7];
bool board1[7][7];
bool board2[7][7];
bool board3[7][7]; //记录被打子的位置
bool board4[7][7]; //将要移动的棋子
int flag_panduandaizi=0;
int a=0,b=0;//x第1人被拿棋的个数 y第2人
int flag_daizi;//1 调用打子函数 0不调用
int flag_shanpaint=1;//起闪烁作用
int flag_dianjidian=0;// //判断点击是否为 有效
int flag_fristshan=2;//0闪 1 为停闪或把该点变空格 2为初始值
int t1=-1,t2=-1,t3,t4;//t3 t4 当前坐标 t1 t2上次坐标
bool p1[7][7][16];//玩家的获胜表
bool p2[7][7][16];//计算机获胜表
int win[2][17];//前面表示某方 后面表示某个组合 win的值表示在某方某个组合中存在几
个该方的棋子
int num[2];//记录投子数目
bool turn,touziend;
int nuozipart;//nuozipart 0 没开始 1开始 2结束
int winner;
函数简介
yidong();// 判断移动的合法性
panduanexistkedaizi();// 判断是否存在可打子
shifouqi();// 本方是否有气
oneziqi();// 判断一个子的气
void daizichange();// 打子改变函数
void luozichange();// 落子改变函数
程序中,定义数据的方式,大部分参考五子棋的程序。
程序流程图
游戏开始
轮流投子
换手
否
棋局结
束
投子是否有效
是
双方开始挪
子 恢复被
打子的位置
是
是否后手方
已下第9子
是
某方棋子数目
小于3
否
否
改变相关记录
否
是否成三
是
是
该棋开始闪烁
准备下一步的
落子位置
是否没有可打子
否
选择拿调对方非成三子 在该
位置上贴上一张图片表示该位
置不能投子 改变相关记录
移动是否合法
是
否
点击的棋子
是否有效
否
是
消除原来显示新位置相
关记录改变
换手
是否成三
是
选择拿调对方 非成三
子相关记录改变
否
介绍投子期间的第一方代码
if(turn)
{
//如果flag_daizi=1 调用打子函数
if(flag_daizi==1)
{//拿掉的必须是对方的棋子 不能是对方成三的棋子
//是否是对方的成三子
for(i=0;i<16;i++)
{
if(win[1][i]==3&&p2[m][n][i])
{
flag_chengsanzi=1;// flag_chengsanzi为局部变量初始值为零
break;
}
// p2[m][n][i]=false;
}
if(flag_chengsanzi==1)
break;//选择的棋子为对方的成三子 跳出该消息 重新选择打子
if( board2[m][n])
{
if(flag_chengsanzi==0)
{
daizichange(m,n);
break;
}
}
}
else
{
}
}
。
else
break;
if(board[m][n].data == 2)//为空格 且此位置不是记录被打子的位置
str =" ";
TextOut(hdc,100,590,str,strlen(str));
if(board3[m][n]==true)
{
//弹出对话框说明 此位置不能下子
MessageBox(hWnd,"此位置不能走!","提示",MB_OK);
break;
}
luozichange(m,n);
if(flag_panduandaizi==1)
{
if( panduanexistkedaizi())
{
flag_daizi=1;
flag_panduandaizi=0;
break;
}
else
{
str = "由于无子可打 该第二走 ";
TextOut(hdc,100,490,str,strlen(str));
flag_daizi=0;
turn=false;
flag_panduandaizi=0;
break;
}
}
程序截图
结束语
在该程序中,多处用了标志位来解决问题,例如打子,棋子闪烁等.该作品是个人初作,也
是本人毕业设计中的一部分。


发布评论