`
Jonathan樊
  • 浏览: 75026 次
  • 性别: Icon_minigender_2
  • 来自: 上海
社区版块
存档分类
最新评论

仿QQ五子棋,人人对战,及人机对战 的实现

 
阅读更多

                         仿照QQ五子棋的实现
 
一:首先完善界面。
   
    界面分成了4个部分: 上,左,右,下。
  
    没有实现网络版。如果实现了网络版,那么聊天功能才能实现,所以在界面中砍去了那一部    分。

    上,左,均是截取了QQ五子棋的图片:五子棋的标题和两个用户的头像部分。然后在窗口上添加图片。图片的添加使用了JLabel。五子棋的棋盘和棋子,也是截取了QQ五子棋的图片。

   窗体使用了流式布局。为了使图片排布合理,需要精准的计算大小。
 
   其实,QQ五子棋的“开始”“悔棋”“认输”等功能,给我的感觉是,点击一张图片的不同位置,可以调用相应的算法,就像是,在一张图片的不同位置添加不同的监听。我没有查到这个方法,怎么实现。我的想法是用JLabel,添加图片拼接,然后在JLabel上添加鼠标监听。暂时还没有实现,只是做好了界面。

 

 

二:算法的实现

 

    1. 人人对战

 

         人人对战的思路就是,A先下子,而后B下子。在任一条直线上,有连续相同颜色的大于等于五个棋子,则,执相应颜色的棋子的人获胜。

 

       为了实现这个思路,首先:落子。程序默认黑子先下。落子的实现就是,在棋盘图片上添加鼠标监听,点击欲落的位置后,则绘制相应颜色的棋子图片。

 

       第二:控制棋子颜色。可以使用计数器来控制,可以设置计数器默认数值为0,此时绘制黑子,为1,绘制白子。

 

       第三:判断输赢。判断输赢的标准是,在任一条直线上,有连续相同颜色的大于等于五个棋子,则,执相应颜色的棋子的人获胜。为了实现这一目的,就需要对棋盘上棋子分布情况进行保存。这时,可以选用一个二维数组,在棋盘坐标的位置保存相对应的棋子信息。如,黑子保存为1,白子为-1,无子则为0.然后,可以以最后一子为标准,在横向,纵向,45度,135度方向进行遍历,判断是否有相同连续的五子,出现,则游戏结束。

 

       第四:误差以及细节的处理。我们很难点击到交叉点,因此,需要设定一定的误差标准,在误差范围内,即可在对应的交叉点绘制图片。细节方面,设置范围,不可在棋盘外绘制棋子,相同的位置不可重复绘子,注意代码的优化等等。

 

 

   2.人机对战

 

      人机对战其实是人人对战的升级。人脑可以判断棋盘局势,选取最重要的一个位置下子。而电脑,则需要我们编写算法,告诉计算机判断标准,模仿人的思维来处理问题。人机对战基本思路与人人对战相同,只不过,电脑代替一个人而已,因此,两者差别仅仅在于编写一个机器落子的算法。

 

      机器落子,首先要判断己方与对手的局势。根据两者的局势,判断是该进攻或者防守。当机器占优势时,将棋子放置于自己最有可能获胜的位置,进攻。当对手占据优势时,将棋子放置于对方最有可能获胜的位置,防守。为了达到这一目的,只要找出最重要的一个位置即可。即,要找出,权值最大的那一个空点,即是,在当前境况下,机器的最优选择。

 

      现在写的算法还很差劲,正正在完善中。

 


分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics