- 浏览: 18595 次
- 性别:
最新评论
-
smallboby:
fxrz12 写道知道为什么会被踩吗?java根本不需要链表, ...
java链表 -
javafound:
好,就这样继续!
文件的压缩与解压缩 -
fxrz12:
知道为什么会被踩吗?java根本不需要链表,应该讲不需要去写。 ...
java链表 -
javatozhang:
最后的throw、throws总结非常适用。谢谢!!!
java 异常机制总结 -
夏末忆逝:
错别字不少.
java 异常机制总结
今天终于是把五子棋之人人大战的基本功能实现了,本来是想把界面美化一下再写总结的。唉,后来发现还是算了吧。这个java搞界面真的不适合啊,于是乎先把总结写了再说,那些美化,以及功能的完善什么的等晚点在慢慢去弄吧。
那么,下面咱们进入正题,一起探讨一下其实现方法。
一、界面
界面这东西java真心不适合弄啊,方正我是觉得好费心的。我的棋盘界面很简单朴素,就是由rows根横线和columns根竖线组成。具体代码如下:
1.棋盘的绘制
我的棋盘绘制是放在paint方法里面的。大家也看到了我的棋盘是用一根根横线和竖线组成的。 当然,肯定会有同学问,这段代码中诸如config.x0、y0、size、rows、colmns等变量都是哪来的,为什么不直接用数值体现呢,写的那么抽象。 呵呵,别急,下面我大家介绍一下我的这些变量。 首先还是看一段代码。
2.变量的设置
嗯,没错,这些变量的值都是我事先定义好的,我之所以这么做是为了便于以后程序的扩展和调整。比如哪天我希望我的棋盘是15*15的大小,在这里我就只需要改2个地方。rows和colums的值。是不是很方便呢。
二、鼠标监听
做好界面,接下来要做的事情就是为我们的界面添加一个鼠标监听器,当我们在棋盘网格上点击时,就会相应的放上一颗棋子。
1.添加鼠标监听器
这个不用多说了吧,相信大家也练了很多了。
2,改写鼠标监听中,鼠标释放的方法
[/align][/color]
三、判断输赢
下五子棋,总有输赢,我们不可能不停地下下去,当一方获胜后(并告知用户谁获胜),本局就应该结束,重新开始新的一轮比赛。具体代码如下:
好啦,到这里,我的简单的五子棋之人人对战程序已经写好啦。。。当然在功能和界面上还有很多需要完善的,这都会在我今后慢慢进行改进的。。
那么,下面咱们进入正题,一起探讨一下其实现方法。
一、界面
界面这东西java真心不适合弄啊,方正我是觉得好费心的。我的棋盘界面很简单朴素,就是由rows根横线和columns根竖线组成。具体代码如下:
1.棋盘的绘制
public void paint(Graphics g){ //调用父类paint方法 super.paint(g); //绘制棋盘 //划横线 for(int i=0;i<config.rows;i++){ g.drawLine(config.x0, config.y0+i*config.size,config.x0+ (config.columns-1)*config.size, config.y0+i*config.size); //划竖线 for(int j=0;j<11;j++){ g.drawLine(config.x0+j*config.size,config.y0, config.x0+j*config.size, config.y0+(config.rows-1)*config.size); } }
我的棋盘绘制是放在paint方法里面的。大家也看到了我的棋盘是用一根根横线和竖线组成的。 当然,肯定会有同学问,这段代码中诸如config.x0、y0、size、rows、colmns等变量都是哪来的,为什么不直接用数值体现呢,写的那么抽象。 呵呵,别急,下面我大家介绍一下我的这些变量。 首先还是看一段代码。
2.变量的设置
/** * 用于协定五子棋界面所需的一些数据常量 如线条个数 大小 直径。。。目的是便于今后修改 * @author Administrator * */ public interface config{ public static final int x0=50;//表格左上角起点的X值 public static final int y0=50;//表格左上角起点的y值 public static final int rows=11;//横向线的条数 public static final int columns=11;//纵向线的条数 public static final int chess_size=40;//棋子直径 public static final int size=50;//单元格的大小 }
嗯,没错,这些变量的值都是我事先定义好的,我之所以这么做是为了便于以后程序的扩展和调整。比如哪天我希望我的棋盘是15*15的大小,在这里我就只需要改2个地方。rows和colums的值。是不是很方便呢。
二、鼠标监听
做好界面,接下来要做的事情就是为我们的界面添加一个鼠标监听器,当我们在棋盘网格上点击时,就会相应的放上一颗棋子。
1.添加鼠标监听器
//给画布添加鼠标监听 this.addMouseListener(new chesslistener(g,this));
这个不用多说了吧,相信大家也练了很多了。
2,改写鼠标监听中,鼠标释放的方法
import java.awt.Color; import java.awt.Graphics; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; public class chesslistener extends MouseAdapter{ private chessBorad chessborad; private Graphics g[color=red];// 绘制棋子的对象 public static int [][]array=new int [config.rows][config.columns];// 存储 棋子的对象 private boolean state = true;// 表示黑白棋的标识,true!@@@@@@@@@@@黑棋,false@@@@@@@@@@@@@@白棋 //构造函数 public chesslistener(Graphics g,chessBorad chessborad){ this.g=g; this.chessborad=chessborad; } [/color] public void mouseReleased(MouseEvent e) { // 获取到鼠标释放的坐标值 int x = e.getX(); int y = e.getY(); // 计算当前棋子所在的行和列 int row = (y - config.y0) / config.size; if[align=left][/align] ((y - config.y0) % config.size > config.size / 2) { row += 1; } int column = (x - config.x0) / config.size; if ((x - config.x0) % config.size > config.size / 2) { column += 1; } // 计算坐标 int x1 = column * config.size + config.x0; int y1 = row * config.size + config.y0; if ((row < config.rows && row >= 0) && (column < config.columns && column >= 0)) // 如果等于0,则表示该位置没有下过棋子 if (array[row][column] == 0) { if (state) {// 表示下黑棋 g.setColor(Color.BLACK); //计算,棋子画在交叉点位置 g.fillOval(x1 - config.size / 2, y1 - config.size / 2, config.chess_size, config.chess_size); state = false; // 存储棋子 array[row][column] = -1; } else { // 表示下白棋 g.setColor(Color.WHITE); g.fillOval(x1 - config.size / 2, y1 - config.size / 2, config.chess_size, config.chess_size); state = true; // 存储棋子 array[row][column] = 1; } //判断输赢 if(win.ISHwin(row, column,array,chessborad)) state=true; // 将状态再次改为黑棋先下 if(win.ISSwin(row, column,array,chessborad)) state=true; // 将状态再次改为黑棋先下 if(win.ISXwin(row, column,array,chessborad)) state=true; // 将状态再次改为黑棋先下 } } }
[/align][/color]
三、判断输赢
下五子棋,总有输赢,我们不可能不停地下下去,当一方获胜后(并告知用户谁获胜),本局就应该结束,重新开始新的一轮比赛。具体代码如下:
import java.awt.Component; import javax.swing.JOptionPane; /** * 判断胜负 * @author 吴泽鑫 * ISHwin() 判断是否为横向五子连心 * ISSwin() 判断是否为竖向五子连心 * ISXwin() 判断是否为斜向五子连心 * */ public class win { //判断横向 public static boolean ISHwin(int row,int column,int [][]array,chessBorad chessborad){ int count = 1;// 用于统计所连棋子个数,默认为一 // 遍历这一行的右边列 for (int i = column + 1; i < array[row].length; i++) { // 判断是否是相同的棋子 if (array[row][column] == array[row][i]) { count++; } else { break; } } // 遍历这一行的左边列 for (int i = column - 1; i >= 0; i--) { // 判断是否是相同的棋子 if (array[row][column] == array[row][i]) { count++; } else { break; } } // 如果count等于5,说明五子连心,胜负已定 if(count >= 5){ if(array[row][column]==1&&array[row][column]!=0) //弹出一个消息框,告诉用户结果 JOptionPane.showMessageDialog(null, "白棋赢啦"); else if(array[row][column]==-1) //弹出一个消息框,告诉用户结果 JOptionPane.showMessageDialog(null, "黑棋赢啦"); //胜负已定,需重新初始化界面,即将arry数组全部赋0 for(int i=0;i<array.length;i++) for(int j=0;j<array[i].length;j++) array[i][j]=0; //刷新界面repaint() chessborad.repaint(); return true; } else return false; } public static boolean ISSwin(int row,int column,int [][]array,chessBorad chessborad){ int count = 1;// 统计棋子个数的 // 遍历这一列的右边行 for (int i = row + 1; i < array.length; i++) { // 判断是否是相同的棋子 if (array[row][column] == array[i][column]) { count++; } else { break; } } // 遍历这一列的左边行 for (int i = row - 1; i >= 0; i--) { // 判断是否是相同的棋子 if (array[row][column] == array[i][column]) { count++; } else { break; } } if(count >= 5){ if(array[row][column]==1&&array[row][column]!=0) //弹出一个消息框,告诉用户结果 JOptionPane.showMessageDialog(null, "白棋赢啦"); else if(array[row][column]==-1) //弹出一个消息框,告诉用户结果 JOptionPane.showMessageDialog(null, "黑棋赢啦"); //胜负已定,需重新初始化界面,即将arry数组全部赋0 for(int i=0;i<array.length;i++) for(int j=0;j<array[i].length;j++) array[i][j]=0; //重新刷新界面repaint() chessborad.repaint(); return true; } else return false; } //判断斜线方向 public static boolean ISXwin(int row,int column,int [][]array,chessBorad chessborad){ int count = 1;// 统计棋子个数的 // 遍历左斜下部分 for (int i = row + 1,j=column+1; i < array.length&&j<array[i].length; i++,j++) { // 判断是否是相同的棋子 if (array[row][column] == array[i][j]) { count++; } else { break; } } // 遍历左斜上部分 for (int i = row - 1,j=column-1; i >= 0&&j>=0; i--,j--) { // 判断是否是相同的棋子 if (array[row][column] == array[i][j]) { count++; } else { break; } } //// 遍历右斜下部分 for(int i=row+1,j=column-1;i<array.length&&j>=0;i++,j--){ if (array[row][column] == array[i][j]) { count++; } else { break; } } //// 遍历右斜上部分 for(int i=row-1,j=column+1;i>=0&&j<array[i].length;i--,j++){ if (array[row][column] == array[i][j]) { count++; } else { break; } } if(count >= 5&&array[row][column]!=0){ if(array[row][column]==1) //弹出一个消息框,告诉用户结果 JOptionPane.showMessageDialog(null, "白棋赢啦"); else if(array[row][column]==-1) //弹出一个消息框,告诉用户结果 JOptionPane.showMessageDialog(null, "黑棋赢啦"); //胜负已定,需重新初始化界面,即将arry数组全部赋0 for(int i=0;i<array.length;i++) for(int j=0;j<array[i].length;j++) array[i][j]=0; //重新刷新界面repaint() chessborad.repaint(); return true; } else return false; } }
好啦,到这里,我的简单的五子棋之人人对战程序已经写好啦。。。当然在功能和界面上还有很多需要完善的,这都会在我今后慢慢进行改进的。。
评论
7 楼
lancelotwjq
2012-11-07
http://kight.gobang.jit.su/
6 楼
kidding87
2012-11-07
我觉得判断win的条件就是所走的那个子决定的,判断应该从它出发
5 楼
mfkvfn
2012-11-07
判断胜负那个写得不好。应该将判断和结果显示分开。
一个类只负责绘图,一个类进行控制,一个类维护数据模型,一个工具类(判断落子是否有效,判断是否有1方胜出)
一个类只负责绘图,一个类进行控制,一个类维护数据模型,一个工具类(判断落子是否有效,判断是否有1方胜出)
public final class ChessUtils{ public static boolean ISWin(Point lastChessPoint,Model chessDatas){ return IsHWin(lastChessPoint,chessDatas) || IsSWin(lastChessPoint,chessDatas) || IsXWin(lastChessPoint,chessDatas); } private static boolean IsHWin(Point lastChessPoint,Model chessDatas){...} private static boolean IsSWin(Point lastChessPoint,Model chessDatas){...} private static boolean IsXWin(Point lastChessPoint,Model chessDatas){...} } public enum ChessType{ BLACK,WHITE,NONE; } public final class Model{ public Model(Config config){...} public boolean setChessAt(Point point,ChessType userType){...} public ChessType getChessAt(Point point){...} } public final class UI{ public static void init(Graphics g,Config config){...} public static void drawChessAt(Graphics g,Point point,ChessType userType){...} public static void printResult(Graphics g,ChessType userType){...} public static void indicateCannotDo(Graphics g,ChessType userType){...} } public final class ChessEventListener{ ... //监听落子动作 if(getChessAt(point)==ChessType.NONE){ //这里可以下子 model.setChessAt(point,chessType); //修改model UI.drawChessAt(g,point,chessType); //ui中画出这颗子 if(ChessUtils.ISWin(point,model)){ //最后下子胜了 UI.printResult(g,chessType); } }else{ UI.indicateCannotDo(g,chessType); //提示那个地方已经有子了,不可以在那里下 } ... } public class Chess{ public static void main(String args[]){ Graphics g=new XXXX(); Config config=YYYYY; Model model=new Model(config); UI.init(g,config); g.addListener(new ChessEventListener()); ... } }
4 楼
yscyfy
2012-11-07
其实java的界面设计是很优美的,你不能只会拖拽是生成吧,那根本就不是一个合格的程序员该干的事情。
建议楼主看看论坛上有个叫“Swing 第X刀” 的帖子。
建议楼主看看论坛上有个叫“Swing 第X刀” 的帖子。
3 楼
javaboy8282
2012-11-06
楼主 分享一下源代码
2 楼
须等待
2012-11-06
感觉LZ判断输赢的算法效率比较低啊
1 楼
lvwenwen
2012-11-06
哥们,辛苦了,把工程打包共享下,谢谢
发表评论
-
文件的压缩与解压缩
2013-05-21 23:34 1654上篇博客学习了哈夫曼树,也自己动手建立了一棵 ... -
再次学习哈弗曼
2013-05-21 17:23 825还记得第一次接触哈夫曼树是在大二的数据结构课 ... -
java链表
2013-05-06 20:18 7257好久没有上新课啦~ 今天学习了链表方面的内容,完成了一些作业 ... -
java 异常机制总结
2012-12-05 16:44 1318今天学习了java的异常机制,下面对此做一个小小的总结 ... -
java集合框架课 总结
2012-11-18 18:33 2160今天老师为我们讲了集合框架的一些内容,下面我从这几个方面 ... -
五子棋 人机对战 思路
2012-11-11 18:36 1326五子棋之人机对战思路: 1,棋盘与棋子的实现 2,玩家下 ... -
五子棋
2012-11-06 18:01 0今天终于是把五子棋之人人大战的基本功能实现了,本来是想 ... -
继承课后总结
2012-10-17 19:52 917今天学习了关于继承的一些东西,之前学C++的时候也有一 ... -
关于类和对象
2012-08-21 12:37 923第一次接触了java这门变成语言,感觉它挺有意思,很新 ...
相关推荐
弈心——最强的五子棋引擎 尽管五子棋先后于1992年、2001年被计算机证明原始无禁手、原始有禁手规则下先手必胜,在五子棋专业比赛中采用现代开局规则(如基于无禁手的两次交换规则(Swap-2),基于有禁手的索索夫-8...
本论文主要阐述以面向对象的程序开发语言eclipse为开发工具, 基于智能手机Android之上设计一个五子棋游戏。五子棋起源于中国古代的传统黑白棋种之一,它不仅能增强思维能力 提高智力,而且富含哲理,有助于修身养性。本...
五子棋源码.很不错的一个游戏!五子棋源码.五子棋源码.五子棋源码.五子棋源码.五子棋源码.五子棋源码.五子棋源码.五子棋源码. 五子棋源码.很不错的一个游戏!五子棋源码.五子棋源码.五子棋源码.五子棋源码.五子棋源码....
五子棋是全国智力运动会竞技项目之一,是一种两人对弈的纯策略型棋类游戏。 五子棋有两种玩法。玩法一:双方分别使用黑白两色的棋子,下在棋盘直线与横线的交叉点上,先形成五子连线者获胜。玩法二:自己形成五子...
本文所做的主要工作是采用Python语言编写写一个双人对弈的五子棋游戏,要求有GUI界面、能够判断输赢、提示游戏结束,能重新开局且不受计算机环境所限制(即计算机不要求安装Python环境也可以进行五子棋游戏)。...
java小游戏 (源码)swing五子棋源代码java小游戏 (源码)swing五子棋源代码java小游戏 (源码)swing五子棋源代码java小游戏 (源码)swing五子棋源代码java小游戏 (源码)swing五子棋源代码java小游戏 (源码)swing五子棋源...
uniapp五子棋纯页面无接口微信小程序源码,纯页面哦,直接运行就可以使用。 uniapp五子棋纯页面无接口微信小程序源码,纯页面哦,直接运行就可以使用。 uniapp五子棋纯页面无接口微信小程序源码,纯页面哦,直接运行...
带网络功能的,用mfc编写的,很强大的比较全面的五子棋。带网络功能的,用mfc编写的,很强大的比较全面的五子棋。带网络功能的,用mfc编写的,很强大的比较全面的五子棋。带网络功能的,用mfc编写的,很强大的比较...
小型的五子棋游戏,实现了12*12的矩形区域的五子棋游戏,不过可任意增大面积
java毕业设计——基于java的五子棋游戏的设计与开发(源代码+论文).zip java毕业设计——基于java的五子棋游戏的设计与开发(源代码+论文).zip java毕业设计——基于java的五子棋游戏的设计与开发(源代码+论文).zip ...
简单使用c#实现五子棋!使用c#联机五子棋
此课程设计通过五子棋算法设计,加深对机器学习中强化学习概念的理解与应用。本次课程设计的任务如下: 1. 给出“自己与自己程序的对抗”的视频,给自己的棋盘加上自己特有的标签,作为你自己程序的论证(防抄袭),...
五子棋.java五子棋.java五子棋.java五子棋.java五子棋.java五子棋.java五子棋.java五子棋.java五子棋.java五子棋.java五子棋.java五子棋.java五子棋.java五子棋.java五子棋.java五子棋.java五子棋.java五子棋.java...
编写本文档的目的在于说明五子棋游戏各个模块之间的关系,分析程序的流程,为以后的编码测试提供依据。 特别说明:本软件开发采用快速原型模型,其理由在于此模型的特点,即有助于获取用户需求,加强对需求的理解,...
java五子棋java五子棋java五子棋
五子棋MFC 五子棋MFC 五子棋MFC
五子棋的实现(UML建模图)五子棋的实现(UML建模图)五子棋的实现(UML建模图)五子棋的实现(UML建模图)五子棋的实现(UML建模图)五子棋的实现(UML建模图)
一个简单的五子棋游戏 具有以下功能:①数据结构的设计;五子棋棋盘的绘制。②人机下棋时,计算机下棋算法的设计。③人机下棋时,判断任一方获胜的算法的设计。
用VC编写的一个五子棋:五子棋源代码,全部代码!
网络五子棋设计报告 大家下载着看看吧 网络五子棋设计报告 网络五子棋设计报告