java走棋_java五子棋的开发

五子棋,又名五子连珠棋,是一项有趣、益智的棋类游戏,世界上已有数十个国家开展此项活动。世界五子连珠棋锦标赛已举办过几届,并进入世界智力体育奥林匹克比赛,它的影响越来越大。五子连珠棋易学难精,但妙趣横生。下一局棋所费时间不多,工余饭后“杀上一盘”,开发智力,勤于动脑,调剂感情,有利于开发智商居家必备。作为一个程序爱好者,肯定会思考如何用程序来实现一个五子棋小游戏,以下文章即为探讨五子棋的功能的实现。

1.画出五子棋盘

要实现五子棋,首先我们得先实现它的棋盘界面,然后要做的是在这个棋盘界面上加上一些必要的组件,如监听器,按钮,JPanel,这些步骤都比较简单,无需多言,接着就是在JPanel上画出五子棋棋盘了,其实五子棋盘的实现很简单,一个两层的循环来划线就行了,注意订好棋盘格子的宽度即可。(x,y为初始点的位置)

for (int i = 0; i < 15; i++) {

g.drawLine(x, y + i * size, x + 14 * size, y + i * size);

g.drawLine(x + i * size, y, x + i * size, y + 14 * size);

}

2.重绘

画完棋盘后,我们会发现,如果我们改变JFrame的大小,棋盘将会消失,这是我们就要用到重绘,首先我们在实现五子棋的界面里让类继承JPanel组件,然后在这个类里定义一个重绘的方法paint,只要写上核心代码

super.paint(g);

在paint方法中将棋盘再画一遍,即可实现重绘的功能。

3.绘制棋子

棋盘绘制完全后,就是绘制棋子,画一颗棋子容易,用画笔Graphics中的filloval即可实现,但是,绘制棋子的难点在于他的位置,我们首先分析一下,你点击一下棋盘,会下一颗子,这颗子只能在棋盘两条直线的交点出,但是我们不可能保证点击的位置刚好在那个位置,所以我们需要用到强制转型,当我们没用精准的点到交点位置时,棋子能下在离他最近的一个点。

x1 = e.getX();

y1 = e.getY();

int c = (x1 - x + size / 2) / size;

int r = (y1 - y + size / 2) / size;

x1,y1为你点击的位置,x,y为棋盘最左上角的的位置,c,r即为交点。这时我们可以画出棋子。

g.filloval(c * size - size / 2 + x, r * size - size / 2 + y,size ,size );

棋子画完后,我们需要考虑到画黑棋和白棋的问题,这里我们引用一个计数器count1,每下一颗子就加一,加上一个判断,当count为奇数时下黑棋,偶数时下白棋。

4.棋子的保存

我们可以发现,棋子是和c,r有关的,我们可以很自然地联想到用一个二维数组来保存棋子,这时我们定义一个chess的二维数组,并把它传到监听事件的类里去,为了保存棋子,我们需要在画棋子前给棋子赋值,例如给黑棋赋1,白棋赋2。在棋子重绘的时候,遍历二维数组,在值为1的地方下黑棋,值为2的地方下白棋,以下有保存黑棋的方法。

if (chess[c][r] == 0) {

if (count1 % 2 == 0) {

chess[c][r] = 1;

g.setColor(Color.black);

g.filloval(c * size - size / 2 + x, r * size - size / 2 + y,size ,size );

}

}

5.判断输赢

因为前面赋值过,所以我们只需要对棋盘上每一个棋子向八个方向找相同的值即可,值相同继续找,值不相同就break,这时还要用到一个计数的count,当count>=5时,就判断一方获胜。以下代码是从左右两边找棋子是否相同的方法,上下,斜边找的方法可类比。

public int check1(int x, int y) {

int count = 0;

for (int i = x + 1; i < chess.length; i++) {

if (chess[i][y] == chess[x][y]) {

count++;

} else

break;

}

for (int i = x; i >= 0; i--) {

if (chess[i][y] == chess[x][y]) {

count++;

} else

break;

}

return count;

}

6.AI

其实完成以上5步时,一个简单的人人对战五子棋已经实现,那么现在讨论的是如何实现人机对战的方法,这里用到的是HashMap,利用其中的键值对和权值来让电脑判断下棋的位置。在五子棋中,棋子的位置情况可以用字符串来表示,不同的情况赋予不同的权值,这样让电脑找到最大权值的点下棋。以下是本人创的一个hashmap表(ps:电脑很蠢)

public class MyhashMap{

HashMap hm = new HashMap();

}

public MyHashMap() {

hm.put("1", 10);

hm.put("11", 100);

hm.put("111", 1000);

hm.put("1111", 10000);

hm.put("2", 20);

hm.put("22", 200);

hm.put("222", 2000);

hm.put("2222", 20000);

hm.put("12", 5);

hm.put("112", 50);

hm.put("1112", 500);

hm.put("11112", 5000);

hm.put("21", 15);

hm.put("221", 150);

hm.put("2221", 1500);

hm.put("22221", 15000);

}

AI的方法是找棋子的位置情况并且累加它的权值,String找的是棋子的相连情况,int则是表示棋子的颜色,以向右找为例

// 定义两个变量,记录当前棋子的颜色(int),记录棋子的相连情况(String)

// 从当前位置分别找它八个方向上的棋子情况

// 向右

String str = "";

int color = 0;

for (int k = i + 1; k < chess.length; k++) {

if (chess[k][j] == 0) {

break;

} else {

if (color == 0) {

color = chess[k][j];

str += chess[k][j];

} else if (chess[k][j] == color) {

str += chess[k][j];

} else {

str += chess[k][j];

break;

}

}

}

// 根据棋子相连情况,从hm取出权值累加

Integer value = hm.get(str);

if (value != null) {

chessValue[i][j] += value;

}

每个点的权值都确定后,用一个二维数组排序找到最大的权值的点,即可下棋。记得每下一颗棋子要记得把记录权值的数组都清零。

以上基本功能的实现,要想美化这个游戏,还要优化棋子,棋盘,添加声音,做悔棋等,总之还有很多路要走,有兴趣的大家可以自己去摸索,相信会有很多的收获。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值