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;

}

}

程序截图

结束语

在该程序中,多处用了标志位来解决问题,例如打子,棋子闪烁等.该作品是个人初作,也

是本人毕业设计中的一部分。