- 浏览: 62681 次
- 性别:
- 来自: 福建
-
最新评论
-
netwelfare:
相比较而言,这篇文章讲解的更深入更详细:异常的深入研究与分析
java中异常机制总结 -
zendly:
参考最新的百度API吧
android实现百度地图定位 -
lixiongzhi_m:
这个估计快两年前的了,百度地图api都更新了不少了。不知道还能 ...
android实现百度地图定位 -
zendly:
学习啦。楼主赞。!!
android实现百度地图定位 -
120970289:
SB,你是李雄志???
初识android开发
学了画板、画图重绘已经有些时日的,一直没写好总结。前几天过去蓝杰补了一节课,学习了五子棋的人人对战,自己在考试周期间用了写琐碎的时间把那些代码都捉摸了一遍,今天写些自己的体会。也顺便帮自己复习一下。
在学习仿xp画板的时候,我最大的困惑就是一个类中为什么要声明这样或那样的属性或者是顶这样或那样的方法,以及参数传递方面的一些问题。而关于方法的方法体还是能比较容易接受的。这次总结我也这要谈谈自己对这个困惑关于自己的一些见解。
我们就拿画板来说。仿xp画板,一共用了五个类:
1.画板界面类(DrawingFrame)(拥有主函数的类)
2.图形形状选择工具类(ToolsPanel)
3.颜色选择类(ColorsPanel)
4.画图区域类(DrawingPanel)
5.画板鼠标监听器类(DrawingPanel)
1.画板界面类;该类继承了JFrame类,本身就是一个界面,该类中除了主函数外还要定义一个初始界面的方法,在该方法中根据xp画板的一些属性来设置面板的属性(大小、布局等)。
2.图形形状面板类;该类继承JPanel类,该类能实现的功能就是提供图形形状的选择,所以该类必须声明形状属性(value),而且必须定义有获取形状的方法(getValue()),根据xp画板我们知道图形形状必须在鼠标点击相应的图形形状按钮时获得,所以就必须有动作监听器,在该类中以匿名内部类的形式创建。而关于按钮的添加可以利用数组,而为了动作监听器能起作用,就必须给按钮相应形状的动作命令值,关于按钮上图形的设置,可参考按钮JButton的构造方法(jdk1.6中可查)。(别忘了给按钮添加上动作监听器对象)
以下代码可供参考:
3。颜色选择类:该类同样继承了JPanel类,同理该类提供颜色选择功能,固必须声明颜色属性(color),和定义获取颜色的方法(getColor),同理颜色也是在点击按钮时获得,固也应该有动作监听器,该监听器也是用匿名内部类的形式创建,而按钮上的颜色使用按钮的背景颜色,所以在想要获取该颜色必须将鼠标点击获取的事件源强制转化成按钮对象,用按钮对象获取背景颜色的方法(getBackground)即可获得。
以下的代码可参考:
4.画图区域类:该类同样继承了JPanel,我们知道xp画板可画图区域并不是整个界面区域,而是中部的一小块区域,为类能达到同样的效果,在画图区域类中,我们要在实例化一个小面板作为画图区域添加到整个大面板上(因为该类继承了JPanel所以本身就是一个大面板,用this.add()方法添加),为了能在这个小面板上画图,我们知道肯定要在它上面获得画布对象,所以在该类中首先必须定义有获取面板的方法(getPanel()),既然该方法要去作用,哪么就必须声明一个面板对象属性。
以下代码可参考:
5.画板鼠标监听器类:该类实现Mouselistener和MOuseMOtionListener接口。
该类实现的功能是:能在画图区域上画图我们选择的不同形状不同颜色的图形,所以它和我们前面创建的图形形状选择类、颜色选择类、画图区域类都相关联。要使得该类能选择图形形状和图形颜色,那么就必须声明我们创建好的图形形状选择类对象属性和颜色选择类对象属性,要画图那么必须有画布,所以也要声明画布对象属性,根据不同图形的需要我们也要声明一些整形变量用来存储坐标值,或者用来做判断。有了这些我们就可以画图了。
以下代码可参考:
重点分析参数传递:(参数传递的作用在五子棋中体现得更明显)
在画板鼠标监听器中,我们声明了图形形状选择类对象属性和颜色选择对象属性,我们并不能在这个类中实例化这些对象,我们知道最终程序的运行是在拥有主函数的类中所以这些对像都必须在面板界面类中实例化。然后通过参数传递,这就必须我们定义相应的构造方法,如画板鼠标监听器类中的构造方法该方法的形式参数有ToolsPanel tp、ColorsPanel cp、Graphics g;这样在界面类中实例化画板鼠标监听器类对象时便可将在界面类中实例化好的相应对象作为实参传递给鼠标监听器类了。
以下界面类的代码可参考:
以上是关于仿xp画板的总结,在代码中有些在面板中在实例化面板并将实例化好的面板添加到整个面板上,这样经过一些处理(布局调整等)能使整个界面效果更接近于xp画板。
五子棋(只实现人人对战功能)总结
五子棋实现步骤:
一,创建五子棋界面类class ChessUi{}该类继承JFrame类,在主函数中实例化该类对象并调用初始界面的方法。那么这样就要定义相应的初始界面的方法ChessBorder(),在该方法中设置界面的一些基本属性(大小,居中等)。有了界面开始要画棋盘,在该类中定义一个画棋盘的方法,该方法要在重写该类父类paint()方法中调用以实现重绘。
1,该步骤定义画棋盘的方法就需要一些关于棋盘的信息,所以我们就创建一个五子棋信息接口interface Config{},来存储所有关于棋盘和棋子的信息(棋盘水平线条数、垂直线条数、棋盘方格大小、棋子大小、棋盘的起始坐标),这些信息全部用定义成常量Public static final 数据类型 常量名;这样我们就可以用接口名直接调用到这些信息了;关于画棋盘的方法只用用两层循环和利用棋盘信息便可画出,这边就不做介绍。
二、有了棋盘,我们就可以开始下棋了。下棋其实是在界面中画上一个填充的圆形,和画图是一样的。这样我们就必须要有鼠标监听器。
创建一个五子棋鼠标监听器类class ChessListener{},该类继承MouseAdapt抽象类在下棋时有这样几个问题要考虑:
1,必须是一次下黑棋一次下白棋,这样我们就要声明一个整形计数量来判断,实现代码如下:
2,每次下棋的时候原来有下过棋子的地方不能再下,这就要求我们去判断某位置是有已经有棋子。按着这是思路,我们可以定义一个二维数组用来存储已经在棋盘上的棋子(数组元素的值为1表示黑子,-1表示白子,0表示没有),这就必须我们在棋子的坐标和数组行和列的索引数之间做一个转换,这个比较好懂,有了这个数组那么这个问题就绝解决了。其中要注意的是,当用棋子和棋盘的边界宽度除以格子宽度余数大于1时,相应的行和咧的索引要加1。
下面的代码是棋子坐标和数组行和咧之间的转换
三,有了棋盘,也能下棋子了,那么剩下的步骤是判断输赢。我们就创建一个输赢类class Win{}.
我们知道在五子棋中判断输赢的方法共有四个情况。右斜、左斜、水平、竖直五子相连就赢了。所以要顶一个相应的四个方法right()、left()、h()、v();在判断时是用当前下的棋子和原来已经有的棋子判断是否有五子相连,所以这些方法中都带有两个整形参数表示当前要下的棋子位置,而原有的棋子就要用到我们第二部用来存储的已下棋子的数组了。
下面列举右斜的方法代码:
注意我们得让棋子当我们最小化界面时仍然存在,这就要实现棋子的重绘,我们有了存储棋子的数组,这个就很容易实现了,只要在五子棋界面类中定义一个画棋子的方法,利用数组用个两层循环就行了。然后让这个方法在方法paint(),中调用即可。
这样一个简单的人人对战五子棋就完成了。
其中的重点还有各个类的联系和参数传递问题。我用这样几句话概括一下:
在没有主函数的类中需要用对象大多都只需声明而不用具体实例化,大多都可以创建构造方法,利用参数从界面类中传值过来就行。(有些需要实例化但必须在正确的位置上实例化,比如在ChessListener类,构造方法中实例化Win对象,这个也只是要把界面类(拥有主函数的类)中的数组传给它而已)。代码如下:
所以我觉得在一般类中要用到的对象声明即可,而实例化这些对象全部在拥有主函数的类中,然后用参数传递。但这也不是绝对的,具体还要看某一个类或者某一个对象要实现的功能。(这是我从仿xp画板和五子棋中体会到的一些经验)、
在学习仿xp画板的时候,我最大的困惑就是一个类中为什么要声明这样或那样的属性或者是顶这样或那样的方法,以及参数传递方面的一些问题。而关于方法的方法体还是能比较容易接受的。这次总结我也这要谈谈自己对这个困惑关于自己的一些见解。
我们就拿画板来说。仿xp画板,一共用了五个类:
1.画板界面类(DrawingFrame)(拥有主函数的类)
2.图形形状选择工具类(ToolsPanel)
3.颜色选择类(ColorsPanel)
4.画图区域类(DrawingPanel)
5.画板鼠标监听器类(DrawingPanel)
1.画板界面类;该类继承了JFrame类,本身就是一个界面,该类中除了主函数外还要定义一个初始界面的方法,在该方法中根据xp画板的一些属性来设置面板的属性(大小、布局等)。
2.图形形状面板类;该类继承JPanel类,该类能实现的功能就是提供图形形状的选择,所以该类必须声明形状属性(value),而且必须定义有获取形状的方法(getValue()),根据xp画板我们知道图形形状必须在鼠标点击相应的图形形状按钮时获得,所以就必须有动作监听器,在该类中以匿名内部类的形式创建。而关于按钮的添加可以利用数组,而为了动作监听器能起作用,就必须给按钮相应形状的动作命令值,关于按钮上图形的设置,可参考按钮JButton的构造方法(jdk1.6中可查)。(别忘了给按钮添加上动作监听器对象)
以下代码可供参考:
/* * 图形形状选择工具类 */ public class ToolsPanel extends JPanel { // 声明一个形状属性 private String value = "Line"; // 定义一个获取形状的方法 public String getValue() { return value; } // 在内部创建一个动作监听器 ActionListener a1 = new ActionListener() { public void actionPerformed(ActionEvent e) { value = e.getActionCommand(); System.out.println("你点击的是" + value); } }; // 创建一个构造方法 public ToolsPanel() { // 实例化一个新的面板 JPanel jp = new JPanel(); // 设置该面板布局为网格布局 jp.setLayout(new GridLayout(5, 2, 5, 5)); // 用数组实例化五个按钮添加到该面板上 String[] array = { "images/LineTool.jpg", "images/RectTool.jpg", "images/PolygonTool.jpg", "images/OvalTool.jpg", "images/RoundRectTool.jpg", "images/SprayGunTool.jpg","images/EraserTool.jpg","images/ColorPickedTool.jpg","images/BrushTool.jpg","images/PencilTool.jpg"}; for(int i=0;i<array.length;i++){ // 实例化图标,并添加到按钮上 ImageIcon iamge = new ImageIcon(array[i]); JButton btn = new JButton(iamge); // 设置按钮大小 btn.setPreferredSize(new Dimension(20, 20)); // 截取字符串 String item = array[i].substring(array[i].indexOf("/") + 1, array[i].lastIndexOf("Tool.jpg")); // 给按钮设置动作命令值 btn.setActionCommand(item); // 给按扭添加动作监听器 btn.addActionListener(a1); jp.add(btn); } // 把该面板添加到整个面板上 this.add(jp); } }
3。颜色选择类:该类同样继承了JPanel类,同理该类提供颜色选择功能,固必须声明颜色属性(color),和定义获取颜色的方法(getColor),同理颜色也是在点击按钮时获得,固也应该有动作监听器,该监听器也是用匿名内部类的形式创建,而按钮上的颜色使用按钮的背景颜色,所以在想要获取该颜色必须将鼠标点击获取的事件源强制转化成按钮对象,用按钮对象获取背景颜色的方法(getBackground)即可获得。
以下的代码可参考:
/* * 颜色选择类 */ public class ColorsPanel extends JPanel{ //声明颜色属性 private Color color=Color.BLACK; //定义一个获取颜色的方法 public Color getColor(){ return color; } //定义一个设置颜色的方法 public void setColor(Color color){ this.color = color; } //在内部创建一个动作监听器 ActionListener a1=new ActionListener(){ public void actionPerformed(ActionEvent e) { JButton btn=(JButton)e.getSource(); color=btn.getBackground(); System.out.println("你选择的颜色是"+color); }}; //创建一个构造方法 public ColorsPanel(){ //设置整个面板为流式布局,并从左到右 this.setLayout(new FlowLayout(FlowLayout.LEFT)); //实例化一个新的面板 JPanel jp=new JPanel(); //设置该面板布局为网格布局 jp.setLayout(new GridLayout(2,7,4,4)); //用数组实例化一些按钮 Color[] array={Color.BLACK,Color.BLUE,Color.DARK_GRAY, Color.GREEN,Color.ORANGE,Color.PINK,Color.RED,Color.YELLOW, Color.cyan,Color.MAGENTA,Color.WHITE,Color.LIGHT_GRAY,Color.CYAN,Color.darkGray}; for(int i=0;i<array.length;i++){ JButton btn=new JButton(); //设置按钮大小 btn.setPreferredSize(new Dimension(20,20)); //设置按钮的背景颜色 btn.setBackground(array[i]); //给按钮添加动作监听器 btn.addActionListener(a1); //把按钮添加到该面板上 jp.add(btn); } //把该面板添加到整个面板上 this.add(jp); } }
4.画图区域类:该类同样继承了JPanel,我们知道xp画板可画图区域并不是整个界面区域,而是中部的一小块区域,为类能达到同样的效果,在画图区域类中,我们要在实例化一个小面板作为画图区域添加到整个大面板上(因为该类继承了JPanel所以本身就是一个大面板,用this.add()方法添加),为了能在这个小面板上画图,我们知道肯定要在它上面获得画布对象,所以在该类中首先必须定义有获取面板的方法(getPanel()),既然该方法要去作用,哪么就必须声明一个面板对象属性。
以下代码可参考:
/* *画图区域类 */ public class DrawingPanel extends JPanel { //声明一个面板对象属性 private JPanel jp=new JPanel(); //创建一个构造方法 public DrawingPanel(){ //设置整个面板的布局为流式布局,并从左到右 this.setLayout(new FlowLayout(FlowLayout.LEFT)); jp.setPreferredSize(new Dimension(450,450)); jp.setBackground(Color.WHITE); this.setBackground(Color.darkGray); //把该面板添加到正给面板上 this.add(jp); } //定义一个获取面板对象的方法 public JPanel getG(){ return jp; } }
5.画板鼠标监听器类:该类实现Mouselistener和MOuseMOtionListener接口。
该类实现的功能是:能在画图区域上画图我们选择的不同形状不同颜色的图形,所以它和我们前面创建的图形形状选择类、颜色选择类、画图区域类都相关联。要使得该类能选择图形形状和图形颜色,那么就必须声明我们创建好的图形形状选择类对象属性和颜色选择类对象属性,要画图那么必须有画布,所以也要声明画布对象属性,根据不同图形的需要我们也要声明一些整形变量用来存储坐标值,或者用来做判断。有了这些我们就可以画图了。
以下代码可参考:
package /* * 画板鼠标监听器类 */ public class DrawingListener implements MouseListener,MouseMotionListener { //声明一个画布属性 private Graphics g; //声明一个工具类对象属性和颜色类对象属性,用来获取形状和颜色 private ToolsPanel tp; private ColorsPanel cp; private JPanel panel;//panel用来获取该对象在屏幕上的x,y坐标以及对象的宽和高 //声明四个整形数据属性用来存储坐标点 private int x1,y1,x2,y2; //声明四个整型数据用来存储前两个点的坐标 private int tx1,tx2,ty1,ty2; //声明一个count整形数据来计数 private int count=1; //定义一个构造方法 public DrawingListener(Graphics g,ToolsPanel tp,ColorsPanel cp,JPanel panel){ this.g=g; this.cp=cp; this.tp=tp; this.panel = panel; } public void mousePressed(MouseEvent e) { x1=e.getX(); y1=e.getY(); } public void mouseReleased(MouseEvent e) { x2=e.getX(); y2=e.getY(); //设置画布颜色 g.setColor(cp.getColor()); //判断选择的形状 if(tp.getValue().equals("Line")){ g.drawLine(x1,y1,x2,y2); }else if(tp.getValue().equals("Oval")){ g.drawOval(x1,y1,Math.abs(x1-x2),Math.abs(y1-y2)); } else if(tp.getValue().equals("Rect")){ g.drawRect(x1, y1, Math.abs(x1-x2),Math.abs(y1-y2)); }else if(tp.getValue().equals("RoundRect")){ g.drawRoundRect(x1, y1, Math.abs(x1-x2), Math.abs(y1-y2), 40,40); }else if(tp.getValue().equals("Polygon")){ //如果是第一次点击,则画出第一条直线 if(tx2!=x2||ty2!=y2) {if(count==1){ g.drawLine(x1,y1,x2,y2); count++; //把前两点坐标保存下来 tx1=x1; ty1=y1; tx2=x2; ty2=y2; }else{ g.drawLine(tx2,ty2,x2,y2); //改变结束点 tx2=x2; ty2=y2; }}else{ g.drawLine(tx1, ty1, x2, y2); } }else if(tp.getValue().equals("ColorPicked")){ try { //实例化一个Robot类的对象 Robot robot = new Robot(); //获取到panel对象位于屏幕的位置 Point point = panel.getLocationOnScreen(); Rectangle rect = new Rectangle((int)point.getX(),(int)point.getY(),panel.getWidth(),panel.getHeight()); //开始截取一个BufferedImage的对象 BufferedImage image = robot.createScreenCapture(rect); //获取点击的坐标点的颜色值 Color color = new Color(image.getRGB(x2, y2)); //输出 System.out.println("你用吸管获取的颜色是:"+color); cp.setColor(color); } catch (AWTException e1) { e1.printStackTrace(); } } } public void mouseDragged(MouseEvent e) { //设置画布颜色 g.setColor(cp.getColor()); //判断选择的形状 if(tp.getValue().equals("Brush")){ x2=e.getX(); y2=e.getY(); //设置线条的粗细,但是Graphics类的对象是不能设置线条粗细的,要使用Graphics2D才可以实现 Graphics2D g2d = (Graphics2D)g; //设置线条的粗细 g2d.setStroke(new BasicStroke(8)); //开始绘制粗的线条 g2d.drawLine(x1, y1, x2, y2); x1 = x2; y1 = y2; //设置线条的粗细 g2d.setStroke(new BasicStroke(1)); }else if(tp.getValue().equals("SprayGun")){ x2=e.getX(); y2=e.getY(); //实例化一个随机数类的对象 Random rand = new Random(); for(int i=0;i<20;i++){ int tx = rand.nextInt(8); int ty = rand.nextInt(8); //开始绘制粗的线条 g.drawLine(x2+tx, y2+ty, x2+tx, y2+ty); } }else if(tp.getValue().equals("Pencil")){ x2=e.getX(); y2=e.getY(); // Graphics2D g2d = (Graphics2D)g; //设置线条的粗细 g2d.setStroke(new BasicStroke(1)); g2d.drawLine(x1,y1,x2,y2); x1=x2; y1=y2; }else if(tp.getValue().equals("Eraser")){ x2=e.getX(); y2=e.getY(); Graphics2D g2d = (Graphics2D)g; g2d.setStroke(new BasicStroke(8)); g2d.setColor(Color.WHITE); g2d.drawLine(x1,y1,x2,y2); x1=x2; y1=y2; } } public void mouseClicked(MouseEvent e) { } public void mouseEntered(MouseEvent e) { } public void mouseExited(MouseEvent e) { } public void mouseMoved(MouseEvent e) { } }
重点分析参数传递:(参数传递的作用在五子棋中体现得更明显)
在画板鼠标监听器中,我们声明了图形形状选择类对象属性和颜色选择对象属性,我们并不能在这个类中实例化这些对象,我们知道最终程序的运行是在拥有主函数的类中所以这些对像都必须在面板界面类中实例化。然后通过参数传递,这就必须我们定义相应的构造方法,如画板鼠标监听器类中的构造方法该方法的形式参数有ToolsPanel tp、ColorsPanel cp、Graphics g;这样在界面类中实例化画板鼠标监听器类对象时便可将在界面类中实例化好的相应对象作为实参传递给鼠标监听器类了。
以下界面类的代码可参考:
package 仿xp画板; /* *画板界面类 */ public class DrawingFrame extends JFrame{ //主函数 public static void main(String[] args){ //实例化一个DrawingJRrame类的对象并调用显示界面的方法 DrawingFrame df=new DrawingFrame(); df.init(); } //定义一个显示主界面的方法 public void init(){ //设置窗体title this.setTitle("仿xp画板"); //设置窗体大小 this.setSize(new Dimension(600,600)); //设置窗体居中显示 this.setLocationRelativeTo(null); //设置窗体为边框布局 this.setLayout(new BorderLayout()); //设置窗体关闭时,程序停止运行 this.setDefaultCloseOperation(3); //实例化一个工具面板对象,并添加到窗体的西边 ToolsPanel tp=new ToolsPanel(); this.add(tp,BorderLayout.WEST); //实例化一个颜色面板对象,并添加到窗体的南边 ColorsPanel cp=new ColorsPanel(); this.add(cp,BorderLayout.SOUTH); //实例化一个画图区域面板对象,并添加到窗体的中部 DrawingPanel dp=new DrawingPanel(); this.add(dp,BorderLayout.CENTER); //设置窗体可见 this.setVisible(true); //调用dp中获取面板对象的方法(用这样获取画图区域中的小面板) JPanel panel=dp.getG(); Graphics g=panel.getGraphics();//(并在该小面板中获取画布) //实例化一个画图鼠标监听器 DrawingListener dl=new DrawingListener(g, tp, cp,panel);//参数传递 //给画布添加画图鼠标监听器 panel.addMouseListener(dl); //给画布添加鼠标移动监听器方法,绑定事件处理类对象dl panel.addMouseMotionListener(dl); } }
以上是关于仿xp画板的总结,在代码中有些在面板中在实例化面板并将实例化好的面板添加到整个面板上,这样经过一些处理(布局调整等)能使整个界面效果更接近于xp画板。
五子棋(只实现人人对战功能)总结
五子棋实现步骤:
一,创建五子棋界面类class ChessUi{}该类继承JFrame类,在主函数中实例化该类对象并调用初始界面的方法。那么这样就要定义相应的初始界面的方法ChessBorder(),在该方法中设置界面的一些基本属性(大小,居中等)。有了界面开始要画棋盘,在该类中定义一个画棋盘的方法,该方法要在重写该类父类paint()方法中调用以实现重绘。
1,该步骤定义画棋盘的方法就需要一些关于棋盘的信息,所以我们就创建一个五子棋信息接口interface Config{},来存储所有关于棋盘和棋子的信息(棋盘水平线条数、垂直线条数、棋盘方格大小、棋子大小、棋盘的起始坐标),这些信息全部用定义成常量Public static final 数据类型 常量名;这样我们就可以用接口名直接调用到这些信息了;关于画棋盘的方法只用用两层循环和利用棋盘信息便可画出,这边就不做介绍。
二、有了棋盘,我们就可以开始下棋了。下棋其实是在界面中画上一个填充的圆形,和画图是一样的。这样我们就必须要有鼠标监听器。
创建一个五子棋鼠标监听器类class ChessListener{},该类继承MouseAdapt抽象类在下棋时有这样几个问题要考虑:
1,必须是一次下黑棋一次下白棋,这样我们就要声明一个整形计数量来判断,实现代码如下:
int count=1; if(count==1){ 画黑棋; count++; }else{ 画白棋; count--; }
2,每次下棋的时候原来有下过棋子的地方不能再下,这就要求我们去判断某位置是有已经有棋子。按着这是思路,我们可以定义一个二维数组用来存储已经在棋盘上的棋子(数组元素的值为1表示黑子,-1表示白子,0表示没有),这就必须我们在棋子的坐标和数组行和列的索引数之间做一个转换,这个比较好懂,有了这个数组那么这个问题就绝解决了。其中要注意的是,当用棋子和棋盘的边界宽度除以格子宽度余数大于1时,相应的行和咧的索引要加1。
下面的代码是棋子坐标和数组行和咧之间的转换
int r=(x-Config.X)/Config.Chess_Size; if((x-Config.X)%Config.Chess_Size>Config.Chess_Size/2){ r++; } int c=(y-Config.Y)/Config.Chess_Size; if((y-Config.Y)%Config.Chess_Size>Config.Chess_Size/2){ c++; }
三,有了棋盘,也能下棋子了,那么剩下的步骤是判断输赢。我们就创建一个输赢类class Win{}.
我们知道在五子棋中判断输赢的方法共有四个情况。右斜、左斜、水平、竖直五子相连就赢了。所以要顶一个相应的四个方法right()、left()、h()、v();在判断时是用当前下的棋子和原来已经有的棋子判断是否有五子相连,所以这些方法中都带有两个整形参数表示当前要下的棋子位置,而原有的棋子就要用到我们第二部用来存储的已下棋子的数组了。
下面列举右斜的方法代码:
//定义一个判断右斜输赢的方法 public boolean right(int r,int c){ int count=1; //往下找相同棋子 for(int i=r+1,j=c+1;i<array.length&&j<array[i].length;i++,j++){ if(array[i][j]==array[r][c]){ count++; }else{ break; } } //往上找相同棋子 for(int i=r-1,j=c-1;i<=0&&j<=0;i--,j--){ if(array[i][j]==array[r][c]){ count++; }else{ break; } } return icount(count); } //定义一个判断count是否大于等于5的方法 private boolean icount(int count){ if(count>=5){ return true; }else{ return false; } }
注意我们得让棋子当我们最小化界面时仍然存在,这就要实现棋子的重绘,我们有了存储棋子的数组,这个就很容易实现了,只要在五子棋界面类中定义一个画棋子的方法,利用数组用个两层循环就行了。然后让这个方法在方法paint(),中调用即可。
这样一个简单的人人对战五子棋就完成了。
其中的重点还有各个类的联系和参数传递问题。我用这样几句话概括一下:
在没有主函数的类中需要用对象大多都只需声明而不用具体实例化,大多都可以创建构造方法,利用参数从界面类中传值过来就行。(有些需要实例化但必须在正确的位置上实例化,比如在ChessListener类,构造方法中实例化Win对象,这个也只是要把界面类(拥有主函数的类)中的数组传给它而已)。代码如下:
public ChessListener(Graphics g,int [][] array,ChessUi cu){ this.g=g; this.array=array; win=new Win(array);//利用ChessListener的构造方法,在ChessUi类中实例化画ChessListener对象时把数组传给win对象。。 this.cu=cu; }
所以我觉得在一般类中要用到的对象声明即可,而实例化这些对象全部在拥有主函数的类中,然后用参数传递。但这也不是绝对的,具体还要看某一个类或者某一个对象要实现的功能。(这是我从仿xp画板和五子棋中体会到的一些经验)、
发表评论
-
线程总结(2)
2013-01-18 01:21 1017一.回顾以前学过的有关 ... -
java学习基本知识总结
2012-07-04 19:31 861蓝杰java基本知识总结: 一.java中基本八种基本数据类 ... -
知识回顾课总结
2012-06-30 00:43 866今天晚上到蓝杰上 ... -
队列总结
2012-05-26 23:01 9661.为什么要用到队列 我们都学过数组,知道数组在定义时必 ... -
关键字总结
2012-05-18 23:18 768java中的关键字: 数据类型: ... -
类与对象的总结
2012-05-10 00:06 775类与对象的定义: (生活中)类是具有相同特征、行为的 ...
相关推荐
【标题】"仿WindowsXP画图板设计(1)"是一个关于开发类似Windows XP操作系统中经典画图工具的项目。这个项目旨在帮助学习者理解和实践图形用户界面(GUI)设计、事件处理以及基本的绘图功能。 【描述】虽然描述为空...
易语言源码易语言画板画图源码.rar 易语言源码易语言画板画图源码.rar 易语言源码易语言画板画图源码.rar 易语言源码易语言画板画图源码.rar 易语言源码易语言画板画图源码.rar 易语言源码易语言画板画图源码....
【标题】"仿windows画板.zip"是一款基于C#编程语言开发的图形用户界面应用程序,模仿了Windows系统自带的画图工具。这个项目是大三学生的课程设计成果,旨在教授和实践C#语言以及图形界面设计的基本原理和技巧。 ...
在本文中,我们将深入探讨如何使用...总结起来,Java实现的画板程序涉及到GUI设计、图形绘制、事件处理、文件操作等多个核心Java技术。通过学习和实践这个项目,开发者可以加深对Java Swing的理解,提升GUI编程能力。
在XP系统中,你可以通过“开始”菜单,找到“所有程序”,然后在“附件”里看到“画图”选项,点击即可打开画板。或者,如果你已经解压了名为"mspaint.exe"的文件,也可以直接双击运行。这便是XP画板的基本入口。 ...
几何画板画图方法 本文档介绍了几何画板画图的多种方法,包括画基本图形、画正多边形、画 A2O A1 图形、n 等分一条线段、雪花曲线等。 一、画基本图形 画基本图形是几何画板画图的基础,包括画点、画线、画圆弧...
本主题聚焦于“易语言画板画图”,这是一个使用易语言开发的图形绘制程序,用户可以通过它在画板上进行各种图形的绘制操作。易语言画板画图源码提供了实现这一功能的具体代码,对于学习易语言以及图形界面编程的初学...
【标题】"仿windows的画板"是一款基于Visual Studio 2005的MFC应用程序,它模仿了Windows操作系统内置的画板工具,并在此基础上扩展了一些实用功能。这个项目旨在为用户提供一个类似系统画板的图形编辑环境,同时...
HTML5画板画图工具是基于JavaScript和HTML5 Canvas元素构建的一款交互式绘图应用程序。Canvas作为HTML5的一个核心特性,允许开发者在网页上进行动态图形绘制,为创建丰富的用户体验提供了强大支持。这款画图工具充分...
"C# 画画板 仿window画画板"项目是一个利用C#语言构建的简单画板应用,旨在模仿Windows操作系统内建的画图工具。这个项目对于初学者来说是一个很好的实践平台,它可以帮助开发者了解图形用户界面(GUI)的设计,以及...
在VS2015环境下,利用MFC框架实现的一款高仿“画图”工具,实现绝大部分功能甚至更多创新点。(注释超详细) 实现了点、直线、曲线、折线、矩形、圆形、多边形等等形状,并且具有区域限制、鼠标捕捉等功能; 实现了...
在本文中,我们将深入...总结来说,创建一个C#的GDI+仿Windows画板程序涉及了C#的基础知识、GDI+的图形绘制技术以及事件驱动编程。通过这个项目,开发者不仅可以熟悉C#编程,还能掌握图形界面设计和用户交互的技巧。
当控件需要重绘时,会触发这个事件。在事件处理器中,我们通常会清除画布(`e.Graphics.Clear(Color.White)`),然后进行绘图操作。 6. **持久化绘图**:由于WinForm控件的默认行为是在每次需要时重新绘制,因此,...
在易语言中,"画板"和"自绘编辑框"是两个重要的概念,它们涉及到图形用户界面(GUI)的设计和定制。 "画板"在易语言中通常指的是一个可以进行图形绘制的窗口或控件,允许程序员通过编程来绘制各种图形、文字或者...
总的来说,开发一款仿Windows的画图板涉及到的IT知识点广泛,包括文件操作、图形绘制算法、字体渲染、用户交互设计等多个方面。开发者需要对操作系统接口、图形编程、数据结构和算法有深入理解,并具备一定的用户...
这个“JAVA写的画图(画板)程序”是一个基于Java的图形绘制应用,它模仿了Windows操作系统内置的画图工具,提供了一些基本的绘图功能。这个程序的实现基于Eclipse开发环境,这是一款广泛使用的Java集成开发环境,...
在JavaScript的世界里,"js 画图 图画板"是一个常见的需求,特别是在创建交互式Web应用、在线教育平台或是设计工具中。JavaScript提供了一系列的库和API,使得开发者能够利用HTML5的Canvas元素来实现画图功能。让...
在本项目中,"C#高仿Windows7画板"是一个使用C#编程语言开发的简易画图应用程序,旨在模仿Windows 7操作系统内置的画图工具。这个项目非常适合C#初学者,它提供了实践和学习C#图形用户界面(GUI)编程、事件处理以及...
很好用的冒险王截图,可以辅助几何画板画图