从五子棋来看OOP编程思想

来源:互联网 发布:武汉软件新城 编辑:程序博客网 时间:2024/06/07 23:08

       刚接触五子棋的时候,我只拿到了一段有简易化图形界面和能画圆的代码,运用以前学到的知识,加上自己对五子棋的理解还是做出了个大概。

       OOP,面向对象编程,面向对象,就充分运用类和对象。每一个方法,每一个对象,都可以通过一个自己定义的类来构造,调用。我第一次自己领悟到这个精髓,不是老师说的把五子棋看作是一个对象,而是从判断输赢的方法中。

package com.Techck.fiveChess;import javax.swing.JOptionPane;public class Win {private int Array[][] = new int[10][10];//定义一个构造方法public Win(int i, int j,int Array[][]){this.Array = Array;winCross(i,j);winVertical(i,j);winLeftOblique(i,j);winRightOblique(i,j);}//判断纵向输赢public void winVertical(int i, int j){int count_v = 1;//用来棋子横着有多少个连在一起int count = 1;//用来记录剩余循环次数//纵向判断for(int m = 1;m<5;m++){if(j-m>=0){if(Array[i][j]==Array[i][j-m]){count_v++;count++;}else{break;}}}for(int m = 1;m<5-count+1;m++){if(j+m<=9){if(Array[i][j]==Array[i][j+m]){count_v++;}}}if(count_v==5){if(Array[i][j]==2)JOptionPane.showMessageDialog(null, "黑棋胜!");elseJOptionPane.showMessageDialog(null, "白棋胜!");}}//判断横向输赢public void winCross(int i, int j){int count_c = 1;//用来棋子横着有多少个连在一起int count = 1;//用来记录剩余循环次数//横向判断for(int m = 1;m<5;m++){if(i+m<=9){if(Array[i][j]==Array[i+m][j]){count_c++;count++;}else{break;}}}for(int m = 1;m<5-count+1;m++){if(i-m>=0){if(Array[i][j]==Array[i-m][j]){count_c++;}}}if(count_c==5){if(Array[i][j]==2)JOptionPane.showMessageDialog(null, "黑棋胜!");elseJOptionPane.showMessageDialog(null, "白棋胜!");}}//判断左斜输赢public void winLeftOblique(int i,int j){int count_lo = 1;//用来棋子横着有多少个连在一起int count = 1;//用来记录剩余循环次数//左斜判断for(int m = 1;m<5;m++){if(i-m>=0&&j-m>=0){if(Array[i][j]==Array[i-m][j-m]){count_lo++;count++;}else{break;}}}for(int m = 1;m<5-count+1;m++){if(i+m<=9&&j+m<=9){if(Array[i][j]==Array[i+m][j+m]){count_lo++;}}}if(count_lo==5){if(Array[i][j]==2)JOptionPane.showMessageDialog(null, "黑棋胜!");elseJOptionPane.showMessageDialog(null, "白棋胜!");}}//判断右斜输赢public void winRightOblique(int i, int j){int count_ro = 1;//用来棋子横着有多少个连在一起int count = 1;//用来记录剩余循环次数//右斜判断for(int m = 1;m<5;m++){if(i-m>=0&&j+m<=9){if(Array[i][j]==Array[i-m][j+m]){count_ro++;count++;}else{break;}}}for(int m = 1;m<5-count+1;m++){if(i+m<=9&&j-m>=0){if(Array[i][j]==Array[i+m][j-m]){count_ro++;}}}if(count_ro==5){if(Array[i][j]==2)JOptionPane.showMessageDialog(null, "黑棋胜!");elseJOptionPane.showMessageDialog(null, "白棋胜!");}}}

本来这个方法是定义在鼠标监听的类中,由于要缩短一个类的代码行数,我想到了定义一个赢类,传入棋子的坐标,每下一步,判断一次,使得原类中的代码显得简单明了。

       原先的五子棋版本,是在获取到X,Y坐标后,判断,画圆,保存坐标。重绘时,便提取队列中的坐标,再画一次圆。而利用OOP思想后,可以把棋子看作一个对象,颜色、坐标等信息是对象的属性,下棋则是他的方法。

package com.Techck.fiveChess;import java.awt.Color;import java.awt.Graphics;public class WhiteChess extends Chess{//定义构造方法public WhiteChess(int x, int y, int r1, int r2) {super(x, y, r1, r2);super.color = Color.white;}public void fillOval(Graphics g) {//设置颜色g.setColor(color);//画图g.fillOval(x,y,r1,r2);}}

到重绘时,代码也就简单很多,只用提取队列中储存的棋子对象,然后再调用对象中的下棋的方法,便可重绘。悔棋也就是删除队列中最后一个对象,再重绘一遍。

//遍历   形状队列   绘制图形for(int i=0;i<list.getLength();i++){//得到shape对象Chess chess = list.get(i);//画图chess.fillOval(g);}

 


0 0
原创粉丝点击