活动地址:CSDN21天学习挑战赛
界面效果:
实现:
第一步:定义好设计该游戏要用到的组件以及相关数据;
第二步:组装组件,给组件设置相对应的功能;
第三步:调用init()方法;
具体
第一步
用到的组件:f游戏窗口,存放四张图的bufferedImage对象分别代表棋盘,黑棋,白棋,选中框;以及3个按钮button,还有结束界面result。
相关数据:例如:棋盘的宽(TABLE_WIDTH)高(TABLE_HEIGHT),棋盘横向纵向分别能下多少棋子BOARD_SIZE,每个棋子占用棋RATE,还有最棋子们对棋盘最左边框的偏移量X_OFFSET,对上边框的偏移量Y_OFFSET,棋子:board_type 值为0 -没有棋子 1-白棋 2-黑棋。
声明一个二维数组board[][]来记录棋子,如果board[ i ][ j ]值为0 -没有棋子 1-白棋 2-黑棋
定义一个选择框的坐标,用selected_X记录横坐标,用selected_Y记录纵坐标,默认值都为-1;
还自定义一个类:ChessBoard,重写paint方法用来绘画棋盘,棋子,选择框;
第二步
给按钮添加事件监听器,添加颜色变换效果,并通过改变board_type来选择下黑棋还是白棋或者是没有棋子,调用repaint方法;
给棋盘添加一个鼠标移动监听器,用来记录选选择框的位置;
定义一个判断是否获胜方法isOwn;
然后再给棋盘添加一个鼠标监听器,用来记录鼠标左击之后新棋子的坐标pos_X,pos_Y;
在左击之后,判断在玩家的棋子是否成五子,若成五子,则结束游戏,弹出(白/黑)玩家获胜;若不成五子,则继续比赛,并将选择框的坐标值select_X和select_Y重新赋值为-1;
最后设置checkboard的大小,checkboard添加到f窗口中,将f设置合适的大小,并使它可见
另外我额外给窗口添加了一个窗口关闭的事件监听器,方便大家关闭窗口;
第三步
调用init()方法
代码最核心的地方可能就是判断输赢(哪个玩家)
boolean isOwn(int pos_X,int pos_Y,int board_type)
pos_X :下的棋子横坐标,pos_Y:下的棋子纵坐标,board_type表示(执(白/黑)棋)玩家
主要思路:在玩家接下来一个棋子下落时,我们要立刻对下棋位置周围八个方向进行检验,其分大体来说是4条边,从上到下,从左到右,从左上到右下,从右上到左下;用count来记录每条边棋子的情况,当一种棋子在每条边上连续出现5个时,直接return true;结束该方法;记住在每一条边上遍历完之后要重新更新count,将其赋值为1.
isOwn()方法代码实现:
// 某玩家是否赢了
private boolean isOwn(int x,int y,int board_type) {
int temp=board[x][y]==board_type?1:0;
int count = temp;
int posX = 0;
int posY = 0;
// 水平方向
// 向左遍历
for (posX = x - 1; posX > 0; posX--) {
if (board[posX][y] == board_type) {
count++;
if (count >= 5) {
return true;
}
} else {
break;
}