【JAVA】五子棋2.0
本文是基于之前五子棋程序的改进,具体改进方面如下:
⒈输赢的个性化窗体显示:
要写窗体,自然就是要在继承JFrame的GoBangUI类中写方法,具体代码如下:
public void WinGameUI(int Winner,Graphics g){ JFrame winJf = new JFrame("兄弟!太厉害了"); winJf.setSize(600,600); winJf.setLocationRelativeTo(null); winJf.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); //设置流式布局管理器 BorderLayout border=new BorderLayout(); winJf.setLayout(border); //面板:默认是流式布局 JPanel centerPanel=new JPanel(); JPanel northPanel=new JPanel(); //设置背景色 centerPanel.setBackground(Color.white); northPanel.setBackground(Color.GRAY); Dimension dm=new Dimension(400,400); Dimension dt=new Dimension(200,50); centerPanel.setPreferredSize(dm); northPanel.setPreferredSize(dt); winJf.add(centerPanel,BorderLayout.CENTER); if(Winner==1){ JLabel label1=new JLabel("恭喜黑方获胜!!"); label1.setPreferredSize(new Dimension(100,50)); winJf.add(label1,BorderLayout.SOUTH); } if(Winner==1){ JLabel label2=new JLabel("恭喜白方获胜!!"); label2.setPreferredSize(new Dimension(100,50)); winJf.add(label2,BorderLayout.SOUTH); } ImageIcon winImg=new ImageIcon("ww.jpg"); JLabel label=new JLabel(winImg); label.setPreferredSize(dm); centerPanel.add(label); JButton btn1 = new JButton("再战一局"); btn1.addActionListener(gl); winJf.add(btn1,BorderLayout.SOUTH); // Graphics wpen = winJf.getGraphics(); // mylis.setGraphics(wpen); // JButton btn2 = new JButton("结束游戏"); // btn2.addActionListener(mylis); // WinJf.add(btn2,BorderLayout.NORTH); // // JButton btn3 = new JButton("回顾棋局"); // btn3.addActionListener(mylis); // WinJf.add(btn3,BorderLayout.NORTH); gl.setGobangUI(this); //全局?? gl.setWinJf(winJf); //3.获取画笔:图像显示在哪个组件上,画笔就从该组件上获取 //从窗体上获取画笔对象,一定要在窗体显示可见之后 winJf.setVisible(true); } |
在这里注释的内容暂时还没有实现,以及if判断语句中的标签添加尚未实现,这需要在今后的学习改进。同时窗体的切换需要在actionPerformed方法中改进,完整代码见后。
2.登录界面的添加
登录界面首先需要将一些共用的属性传过来,比较特别的是需要添加账号和密码,这可以使用文本框来实现,代码如下:
public class LoginListener implements ActionListener{ private JTextField jTFUser; private JTextField jTFPassword; public Graphics g; public Image lgImg; GoBangUI gobangUI; //JFrame startJf ; JFrame loginJf ; public void setjTFUser(JTextField jTFUser) {this.jTFUser = jTFUser; } public void setjTFPassword(JTextField jTFPassword) {this.jTFPassword = jTFPassword; } public void setGoBangUI(GoBangUI gobangUI) {this.gobangUI = gobangUI; } public void setGraphics(Graphics g){this.g=g;} //public void setStartJf(JFrame startJf) {this.startJf = startJf; } public void setLoginJf(JFrame loginJf) {this.loginJf = loginJf; } @Override public void actionPerformed(ActionEvent e) { String btnStr = e.getActionCommand(); String jTFUserStr = jTFUser.getText(); String jTFPasswordStr = jTFPassword.getText(); if(btnStr.equals("登录")){ if(jTFUserStr.equals("wyh") && jTFPasswordStr.equals("wyh")){ loginJf.setVisible(false); gobangUI.startUI(); } } } } public void loginGame(){ Image lgImg = new ImageIcon("han.png").getImage(); JFrame loginJf = new JFrame("请登录你的五子棋账号"); loginJf.setSize(600,600); loginJf.setLayout(null); loginJf.setLocationRelativeTo(null); loginJf.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); FlowLayout fl = new FlowLayout(); loginJf.setLayout(fl); JTextField jTFLoginUser = new JTextField(12); JTextField jTFLoginPassword = new JTextField(12); ImageIcon icon=new ImageIcon("han.png"); JLabel label=new JLabel(icon); loginJf.add(label,BorderLayout.CENTER); JButton btn0 = new JButton("登录"); btn0.addActionListener(loginListener); loginJf.add(jTFLoginUser); loginJf.add(jTFLoginPassword); loginJf.add(btn0); // btn0.setLocation(100,200); // jTFLoginUser.setLocation(100,100); // jTFLoginPassword.setLocation(100,150); // btn0.setSize(); // loginJf.add(jTFLoginUser,BorderLayout.SOUTH); // loginJf.add(jTFLoginPassword,BorderLayout.SOUTH); // loginJf.add(btn0,BorderLayout.SOUTH); loginJf.setVisible(true); loginListener.setGoBangUI(this); loginListener.setLoginJf(loginJf); loginListener.setjTFUser(jTFLoginUser); loginListener.setjTFPassword(jTFLoginPassword); Graphics g=loginJf.getGraphics(); loginListener.setGraphics(g); } |
还可以改进的地方是密码在显示时需要加密表示,我暂时还没有掌握这方面的知识,以及如何使布局更加合理。
3.棋盘的重绘
棋盘重绘显然是要在paint方法中重写,我们需要用一个chessNum的二维数组来存储信息,在监听器类中写一个getchessNumArr方法简单调用获取数组即可,代码如下:
public void paint(Graphics g){ super.paint(g); System.out.println("绘制组件!"); //绘制背景图 g.drawImage(img,X,Y,ROW*SIZE,CLOUN*SIZE,null); //绘制棋盘 for(int i=0;i<=15;i++){ g.drawLine(X, Y+i*SIZE, X+ROW*SIZE, Y+i*SIZE); g.drawLine(X+i*SIZE, Y, X+i*SIZE, Y+CLOUN*SIZE); } //绘制棋子 // 遍历棋盘 取出有棋子的地方绘制 int[][] chessNumA=gl.getchessNumArr(); for (int i = 0; i < chessNumA.length; i++) { for (int j = 0; j < chessNumA[i].length; j++) { System.out.print(chessNumA[j][i]); } System.out.println(); } for (int i=0;i<chessNumA.length;i++){ for(int j=0;j<chessNumA[i].length;j++){ if(chessNumA[i][j]==1){ g.setColor(Color.BLACK); g.fillOval(i*SIZE+X-SIZE/2,j*SIZE+Y-SIZE/2,SIZE,SIZE); } if(chessNumA[i][j]==2){ g.setColor(Color.white); g.fillOval(i*SIZE+X-SIZE/2,j*SIZE+Y-SIZE/2,SIZE,SIZE); } } } } |
4.悔棋功能的实现
我首先创建一个chess类来储存棋子的坐标以及颜色,在监听器中加一个private Chess[] chessinfor = new Chess[(ROW+1)*(CLOUN+1)+1];和int step=0;来保存棋子和记录步骤,然后在actionPerformed方法中写代码,代码如下:
if(st.equals("悔棋")){ /* //取出当前的栈顶 棋子对象 System.out.println("悔棋"); Chess chess=chesslist[chessIndex-1]; //根据棋子的行列值 去到chessNumArr中删除 chessNumArr[chess.row][chess.cloun]=0; //再将当前的棋子一维数组中的棋子对象删除 chesslist[chessIndex-1]=null; chessIndex--; chess=null; gobangUI.repaint(); */ //将棋子坐标转换回去,然后对应在矩阵中,重置上一步棋子在矩阵中为0 // System.out.println("chessinfor[i-1]:"+chessinfor[i-1]); chessNumArr[chessinfor[step-1].x ][chessinfor[step-1].y] = 0; //棋子坐标信息重置 chessinfor[step-1] = null; // step也应该减去1 step--; // 然后重绘棋盘和棋子,注意设置画笔颜色为black,不然上一步棋是白色的话画笔颜色会是白色,会将棋盘的棋格线画成白色 g.setColor(Color.BLACK); gobangUI.paint(g); if(flag==0){flag=1;count2--; } else{ flag=0; count1--; } System.out.println("重绘后的下白棋"+"flag="+flag); System.out.println(step); } |
5.重新开始功能的添加
重新开始功能与悔棋的类似,就是将所有储存的东西清空,代码如下:
if(st.equals("重新开始")){ //重置矩阵 for (int i = 0; i < chessNumArr.length; i++) { for (int j = 0; j < chessNumArr[0].length; j++) { chessNumArr[i][j] = 0; } } // 重置chessinfor数组 Arrays.fill(chessinfor, null); step = 0; g.setColor(Color.BLACK); gobangUI.paint(g); count1=0; count2=0; } |
除省略导包外,完整代码如下:
public class Chess implements GoBaangConfig{ public int x; public int y; public Color c; /** * GoBnagv2.QIZI 实体构造器,传入时需要三个参数x,y,c并设置给QIZI * @param x 当前棋子传入的坐标的x值 * @param y 当前棋子传入的坐标的y值 * @param c 传入的坐标的颜色信息,当前棋子是白棋还是黑棋 */ public Chess(int x,int y,Color c){ this.x=x; this.y=y; this.c=c; } public void drawChess(Graphics g){ if (c.equals(Color.black)){ g.setColor(c); g.fillOval(x*SIZE+X-SIZE/2,y*SIZE-SIZE/2+Y,SIZE,SIZE); }if (c.equals(Color.white)){ g.setColor(c); g.fillOval(x*SIZE+X-SIZE/2,y*SIZE-SIZE/2+Y,SIZE,SIZE); } } } public interface GoBaangConfig { int SIZE=50;//棋盘间距和棋子直径 int X=50;//棋盘左上角x坐标 int Y=100;//棋盘左上角y坐标 int ROW=15; int CLOUN=15;//棋盘的行列值 } public class GoBangListener implements GoBaangConfig, MouseListener, MouseMotionListener,ActionListener{ int chessX,chessY; Graphics g; Graphics g2; int step=0; public String name; int flag=0; int count1=0;int count2=0; int[][] chessNumArr=new int[ROW+1][CLOUN+1]; int chessNum=0;//chessNum:0代表空棋,1代表黑,2代表白 int chessIndex=0; private Chess[] chessinfor = new Chess[(ROW+1)*(CLOUN+1)+1]; public GoBangUI gobangUI; public JFrame jjf; public JFrame winJf; public void setWinJf(JFrame winJf) {this.winJf = winJf; } public void setGraphics(Graphics g){this.g=g;} public void setStartjf(JFrame jjf){this.jjf=jjf;} public void setGobangUI(GoBangUI gobangUI){this.gobangUI=gobangUI;} public void actionPerformed(ActionEvent e){ String st=e.getActionCommand(); if(st.equals("开始游戏")){ jjf.setVisible(false); gobangUI.initGoBangMainUI(); } if(st.equals("再战一局")){ winJf.setVisible(false); gobangUI.initGoBangMainUI(); } if(st.equals("悔棋")){ /* //取出当前的栈顶 棋子对象 System.out.println("悔棋"); Chess chess=chesslist[chessIndex-1]; //根据棋子的行列值 去到chessNumArr中删除 chessNumArr[chess.row][chess.cloun]=0; //再将当前的棋子一维数组中的棋子对象删除 chesslist[chessIndex-1]=null; chessIndex--; chess=null; gobangUI.repaint(); */ //将棋子坐标转换回去,然后对应在矩阵中,重置上一步棋子在矩阵中为0 // System.out.println("chessinfor[i-1]:"+chessinfor[i-1]); chessNumArr[chessinfor[step-1].x ][chessinfor[step-1].y] = 0; //棋子坐标信息重置 chessinfor[step-1] = null; // step也应该减去1 step--; // 然后重绘棋盘和棋子,注意设置画笔颜色为black,不然上一步棋是白色的话画笔颜色会是白色,会将棋盘的棋格线画成白色 g.setColor(Color.BLACK); gobangUI.paint(g); if(flag==0){flag=1;count2--; } else{ flag=0; count1--; } System.out.println("重绘后的下白棋"+"flag="+flag); System.out.println(step); } if(st.equals("重新开始")){ //重置矩阵 for (int i = 0; i < chessNumArr.length; i++) { for (int j = 0; j < chessNumArr[0].length; j++) { chessNumArr[i][j] = 0; } } // 重置chessinfor数组 Arrays.fill(chessinfor, null); step = 0; g.setColor(Color.BLACK); gobangUI.paint(g); count1=0; count2=0; } } @Override public void mousePressed(MouseEvent e) { int x = e.getX(); int y = e.getY(); int chessX = (x+SIZE/2-X)/SIZE; int chessY = (y+SIZE/2-Y)/SIZE; System.out.println("chessX:"+chessX); System.out.println("chessY:"+chessY); if(chessX<0||chessX>ROW){ return; } if(chessY<0||chessY>CLOUN){ return; } if(chessNumArr[chessX][chessY]!=0){ return; } if(flag==0){ //下黑棋 g.setColor(Color.BLACK); chessNum=1; chessNumArr[chessX][chessY]=chessNum; System.out.println("weishenm:"+chessNumArr[chessX][chessY]); flag++; count1++; g.fillOval(chessX*SIZE+X-SIZE/2,chessY*SIZE-SIZE/2+Y,SIZE,SIZE); //判断输赢 if(whetherwin.iswin1(chessNumArr,chessX,chessY)){ System.out.println("黑方获胜!"); gobangUI.WinGameUI(1,g); } //用来悔棋储存 Chess qizi = new Chess(chessX, chessY, Color.BLACK); qizi.drawChess(g); chessinfor[step] = qizi; step++; }else{ g.setColor(Color.white); // 下白棋 chessNum=2; chessNumArr[chessX][chessY]=chessNum; System.out.println("weishenm:"+chessNumArr[chessX][chessY]); //下完白棋之后 赋值为下黑棋可以通过的条件 flag=0; count2++; g.fillOval(chessX*SIZE+X-SIZE/2,chessY*SIZE-SIZE/2+Y,SIZE,SIZE); if(whetherwin.iswin2(chessNumArr,chessX,chessY)){ System.out.println("白方获胜!"); gobangUI.WinGameUI(2,g); } //用来悔棋储存 Chess qizi = new Chess(chessX, chessY, Color.white); qizi.drawChess(g); chessinfor[step] = qizi; step++; } write(); //在下面显示数字棋盘 for (int i = 0; i < chessNumArr.length; i++) { for (int j = 0; j < chessNumArr[i].length; j++) { System.out.print(chessNumArr[j][i]+" "); } System.out.println(); } } public int[][] getchessNumArr() { return chessNumArr; } public void write(){ g.setColor(new Color(238,238,238)); g.fillRect(850,750,300,400); g.setColor(Color.BLACK); Font font=new Font("楷体",1,26); g.setFont(font); g.drawString("黑棋走了"+count1+"步", 850, 800); g.drawString("白棋走了"+count2+"步", 850, 850); System.out.println("按下鼠标按键"); } @Override public void mouseDragged(MouseEvent e) { } @Override public void mouseMoved(MouseEvent e) { } @Override public void mouseClicked(MouseEvent e) { } @Override public void mouseReleased(MouseEvent e) { } @Override public void mouseEntered(MouseEvent e) { } @Override public void mouseExited(MouseEvent e) { } } public class GoBangUI extends JFrame implements GoBaangConfig{ public static final Image img=new ImageIcon("23.jpg").getImage(); //public static final Image winImg = new ImageIcon("E:\\win.jpg").getImage(); public GoBangListener gl = new GoBangListener(); public LoginListener loginListener = new LoginListener(); public void startUI(){ JFrame jjf=new JFrame(); jjf.setSize(1000,1000); jjf.setLocationRelativeTo(null); jjf.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); JButton btn=new JButton("开始游戏"); btn.addActionListener(gl); ImageIcon icon=new ImageIcon("60.png"); JLabel label=new JLabel(icon); jjf.add(label,BorderLayout.CENTER); jjf.add(btn,BorderLayout.SOUTH); jjf.setVisible(true); gl.setGobangUI(this); gl.setStartjf(jjf); } public void initGoBangMainUI(){ //GoBangUI jf=new GoBangUI(); this.setSize(1000,1000); this.setTitle("五子棋游戏"); this.setLocationRelativeTo(null); //设置退出进程 this.setDefaultCloseOperation(3);; //设置流式布局管理器 BorderLayout border=new BorderLayout(); this.setLayout(border); //面板:默认是流式布局 JPanel eastPanel=new JPanel(); //设置背景色 eastPanel.setBackground(Color.white); Dimension dm=new Dimension(140,0); //处理JFrame,其他组件设置大小都是该方法 eastPanel.setPreferredSize(dm); this.add(eastPanel,BorderLayout.EAST); String[] name={"悔棋","重新开始"}; for(int i=0;i<name.length;i++){ JButton jbu=new JButton(name[i]); jbu.setPreferredSize(new Dimension(120,30));//该dimension不能重复利用 eastPanel.add(jbu); jbu.addActionListener(gl); } this.setVisible(true); //3.获取画笔 Graphics g=this.getGraphics();//在前一个之后 //2.监听器 this.addMouseListener(gl); gl.g=g; } public void paint(Graphics g){ super.paint(g); System.out.println("绘制组件!"); //绘制背景图 g.drawImage(img,X,Y,ROW*SIZE,CLOUN*SIZE,null); //绘制棋盘 for(int i=0;i<=15;i++){ g.drawLine(X, Y+i*SIZE, X+ROW*SIZE, Y+i*SIZE); g.drawLine(X+i*SIZE, Y, X+i*SIZE, Y+CLOUN*SIZE); } //绘制棋子 // 遍历棋盘 取出有棋子的地方绘制 int[][] chessNumA=gl.getchessNumArr(); for (int i = 0; i < chessNumA.length; i++) { for (int j = 0; j < chessNumA[i].length; j++) { System.out.print(chessNumA[j][i]); } System.out.println(); } for (int i=0;i<chessNumA.length;i++){ for(int j=0;j<chessNumA[i].length;j++){ if(chessNumA[i][j]==1){ g.setColor(Color.BLACK); g.fillOval(i*SIZE+X-SIZE/2,j*SIZE+Y-SIZE/2,SIZE,SIZE); } if(chessNumA[i][j]==2){ g.setColor(Color.white); g.fillOval(i*SIZE+X-SIZE/2,j*SIZE+Y-SIZE/2,SIZE,SIZE); } } } } public void loginGame(){ Image lgImg = new ImageIcon("han.png").getImage(); JFrame loginJf = new JFrame("请登录你的五子棋账号"); loginJf.setSize(600,600); loginJf.setLayout(null); loginJf.setLocationRelativeTo(null); loginJf.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); FlowLayout fl = new FlowLayout(); loginJf.setLayout(fl); JTextField jTFLoginUser = new JTextField(12); JTextField jTFLoginPassword = new JTextField(12); ImageIcon icon=new ImageIcon("han.png"); JLabel label=new JLabel(icon); loginJf.add(label,BorderLayout.CENTER); JButton btn0 = new JButton("登录"); btn0.addActionListener(loginListener); loginJf.add(jTFLoginUser); loginJf.add(jTFLoginPassword); loginJf.add(btn0); // btn0.setLocation(100,200); // jTFLoginUser.setLocation(100,100); // jTFLoginPassword.setLocation(100,150); // btn0.setSize(); // loginJf.add(jTFLoginUser,BorderLayout.SOUTH); // loginJf.add(jTFLoginPassword,BorderLayout.SOUTH); // loginJf.add(btn0,BorderLayout.SOUTH); loginJf.setVisible(true); loginListener.setGoBangUI(this); loginListener.setLoginJf(loginJf); loginListener.setjTFUser(jTFLoginUser); loginListener.setjTFPassword(jTFLoginPassword); Graphics g=loginJf.getGraphics(); loginListener.setGraphics(g); } public void WinGameUI(int Winner,Graphics g){ JFrame winJf = new JFrame("兄弟!太厉害了"); winJf.setSize(600,600); winJf.setLocationRelativeTo(null); winJf.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); //设置流式布局管理器 BorderLayout border=new BorderLayout(); winJf.setLayout(border); //面板:默认是流式布局 JPanel centerPanel=new JPanel(); JPanel northPanel=new JPanel(); //设置背景色 centerPanel.setBackground(Color.white); northPanel.setBackground(Color.GRAY); Dimension dm=new Dimension(400,400); Dimension dt=new Dimension(200,50); centerPanel.setPreferredSize(dm); northPanel.setPreferredSize(dt); winJf.add(centerPanel,BorderLayout.CENTER); if(Winner==1){ JLabel label1=new JLabel("恭喜黑方获胜!!"); label1.setPreferredSize(new Dimension(100,50)); winJf.add(label1,BorderLayout.SOUTH); } if(Winner==1){ JLabel label2=new JLabel("恭喜白方获胜!!"); label2.setPreferredSize(new Dimension(100,50)); winJf.add(label2,BorderLayout.SOUTH); } ImageIcon winImg=new ImageIcon("ww.jpg"); JLabel label=new JLabel(winImg); label.setPreferredSize(dm); centerPanel.add(label); JButton btn1 = new JButton("再战一局"); btn1.addActionListener(gl); winJf.add(btn1,BorderLayout.SOUTH); // Graphics wpen = winJf.getGraphics(); // mylis.setGraphics(wpen); // JButton btn2 = new JButton("结束游戏"); // btn2.addActionListener(mylis); // WinJf.add(btn2,BorderLayout.NORTH); // // JButton btn3 = new JButton("回顾棋局"); // btn3.addActionListener(mylis); // WinJf.add(btn3,BorderLayout.NORTH); gl.setGobangUI(this); //全局?? gl.setWinJf(winJf); //3.获取画笔:图像显示在哪个组件上,画笔就从该组件上获取 //从窗体上获取画笔对象,一定要在窗体显示可见之后 winJf.setVisible(true); } } public class LoginListener implements ActionListener{ private JTextField jTFUser; private JTextField jTFPassword; public Graphics g; public Image lgImg; GoBangUI gobangUI; //JFrame startJf ; JFrame loginJf ; public void setjTFUser(JTextField jTFUser) {this.jTFUser = jTFUser; } public void setjTFPassword(JTextField jTFPassword) {this.jTFPassword = jTFPassword; } public void setGoBangUI(GoBangUI gobangUI) {this.gobangUI = gobangUI; } public void setGraphics(Graphics g){this.g=g;} //public void setStartJf(JFrame startJf) {this.startJf = startJf; } public void setLoginJf(JFrame loginJf) {this.loginJf = loginJf; } @Override public void actionPerformed(ActionEvent e) { String btnStr = e.getActionCommand(); String jTFUserStr = jTFUser.getText(); String jTFPasswordStr = jTFPassword.getText(); if(btnStr.equals("登录")){ if(jTFUserStr.equals("wyh") && jTFPasswordStr.equals("wyh")){ loginJf.setVisible(false); gobangUI.startUI(); } } } } public class StartGame { public static void main(String[]args){ GoBangUI gobangUI=new GoBangUI(); gobangUI.loginGame(); } } public class whetherwin extends GoBangListener implements GoBaangConfig{ public int column; public int row; public int[][] chessArr; //八个小方向遍历 //黑棋胜利条件 public static boolean iswin1(int[][] chessArr,int row,int column){ if(horizon1(chessArr,row,column)>=5||vertical1(chessArr,row,column)>= 5||right1(chessArr,row,column)>=5||left1(chessArr,row,column)>=5){ return true; } return false; } //水平方向 public static int horizon1(int [][]chessArr,int row,int column){ int c1=0; for(int i=column-4;i<=column+4;i++){ if(i<0||i>ROW){ continue; } if(chessArr[row][i]==1){ c1++; } } return c1; } //竖直方向 public static int vertical1(int [][]chessArr,int row,int column){ int b1=0; for(int i=row-4;i<=+4;i++){ if(i<0||i>CLOUN){ continue; } if(chessArr[i][column]==1){ b1++; } } return b1; } //右上到左下 public static int right1(int [][]chessArr,int row,int column){ int a1=0; for(int i=row-4,j=column+4;i<=row+4&&j>=column-4;i++,j--){ if(i<0||i>=ROW||j<0||j>=CLOUN) { continue; } if(chessArr[i][j]==1){ a1++; } } return a1; } //左上到右下 public static int left1(int [][]chessArr,int row,int column){ int d1=0; for(int i=row-4,j=column-4;i<=row+4&&j<=column+4;i++,j++){ if(i<0||i>=ROW||j<0||j>=CLOUN) { continue; } if(chessArr[i][j]==1){ d1++; } } return d1; } //白棋胜利条件 public static boolean iswin2(int[][] chessArr,int row,int column){ if(horizon2(chessArr,row,column)>=5||vertical2(chessArr,row,column)>= 5||right2(chessArr,row,column)>=5||left2(chessArr,row,column)>=5){ return true; } return false; } public static int horizon2(int [][]chessArr,int row,int column){ int c1=0; for(int i=column-4;i<=column+4;i++){ if(i<0||i>ROW){ continue; } if(chessArr[row][i]==2){ c1++; } } return c1; } //竖直方向 public static int vertical2(int [][]chessArr,int row,int column){ int b1=0; for(int i=row-4;i<=+4;i++){ if(i<0||i>CLOUN){ continue; } if(chessArr[i][column]==2){ b1++; } } return b1; } //右上到左下 public static int right2(int [][]chessArr,int row,int column){ int a1=0; for(int i=row-4,j=column+4;i<=row+4&&j>=column-4;i++,j--){ if(i<0||i>=ROW||j<0||j>=CLOUN) { continue; } if(chessArr[i][j]==2){ a1++; } } return a1; } //左上到右下 public static int left2(int [][]chessArr,int row,int column){ int d1=0; for(int i=row-4,j=column-4;i<=row+4&&j<=column+4;i++,j++){ if(i<0||i>=ROW||j<0||j>=CLOUN) { continue; } if(chessArr[i][j]==2){ d1++; } } return d1; } } |
总结:
此次改进把所有基本的功能都实现了,剩下的棋盘回顾录制以及上文提及的一些小问题可能会在今后添加或者改进,希望对读者有所启发,感谢阅读!
【JAVA】五子棋2.0相关推荐
- 【Java之五子棋】——java五子棋游戏
基本思路: 1.先有一个界面可以弹出窗口,在界面上重写paint方法,在这个方法里加入棋盘,使得棋盘可以不断重绘,不会因为刷新而消失: 2.创建鼠标监听器,为了让鼠标监听器界面可以下黑白棋子: 3.再 ...
- Java五子棋最全教程
Java五子棋最全教程 Ps:首先当我们做一个项目时应该培养这样一种思维即这个项目怎么开展,分为哪几个功能,这每个功能又该分为哪几步去实现,只有确定了基本路线,才有利于我们设计程序的基本结构,也让我们 ...
- Java五子棋Ai-权值法
Java五子棋Ai-权值法 一. 什么是权值法? 二.实现权值法Ai会面临的问题 1.如何表达棋盘上未下处的横竖斜的棋子情况?(类似01120) 2.如何将未下处的横竖斜情况和权值联系起来?(Hash ...
- JAVA五子棋单机版
Java五子棋设计流程: 1.创建窗口和设计一个棋盘界面 2.实现鼠标点击,棋子出现,黑白棋轮流下 3.能够判断输赢 4.添加按钮功能 4 实现结果图: import java.awt.BorderL ...
- java五子棋游戏源代码_Java实现五子棋游戏的完整代码
用Java编写简单的五子棋,供大家参考,具体内容如下 前言 这两天在空闲时间做了个五子棋项目,分享给大家看一下,界面是这样的: 界面很丑我知道,本人虽有几年PS基础,但知识浅薄,审美观不尽人意,做到如 ...
- java五子棋难度_Java小项目之:五子棋,你下棋下得过电脑吗?
Java小项目之:五子棋,你下棋下得过电脑吗? Java五子棋功能要求: 1.创建窗口和设计一个棋盘界面 2.实现鼠标点击,棋子出现,黑白棋轮流下 3.能够判断五子相连输赢 4.添加重新开始,悔棋,退 ...
- Java五子棋小游戏简单版(3)
JAVA五子棋 前言,既(2)之后,做了一下改进,如界面的优化,棋子的优化,AI对战的实现 还是回顾一下我们之前(1)(2)的工作 建立一个Chess包→界面类ChessUI→画棋子类DrawChes ...
- Java五子棋小游戏(控制台纯Ai算法)
Java五子棋小游戏(控制台纯Ai算法) 继续之前的那个五子棋程序 修复了一些已知的小Bug 这里是之前的五子棋程序 原文链接 打包源码下载不需要C币,请点击下载连接 配套算法精讲帖子Java五子棋小 ...
- Java 五子棋AI博弈树算法实现
实际上现在的棋类AI都是采用了效率更高的算法(如蒙特卡洛树搜索)+Deep Learning实现.今天我们只探讨较简单的五子棋AI,大致有两种算法:五元组和博弈树. Java学习笔记 第一节 Java ...
- Scala error: type mismatch; found : java.util.List[?0] required: java.util.List[B]
Scala error: type mismatch; found : java.util.List[?0] required: java.util.List[B] 目录 Scala error: t ...
最新文章
- JavaWeb学习笔记——DOM4J
- 区域显示触发_天涯明月刀手游五行藏珍天机奇遇怎么触发?五行藏珍天机奇遇攻略...
- java统计行列和字数的函数_JAVA使用POI获取Excel的列数与行数
- 【Auto.js】为任何指定QQ好友点赞
- 树状数组基本用法详解
- python调用 matlab库_python调用matlab的搜索结果-阿里云开发者社区
- python基础函数式编程(十七)
- 30天敏捷结果(1):总体认识Getting Result敏捷方法
- C语言程序设计谭浩强第五版课后答案
- vue项目中使用rem替换px-使用方法-02-问题规整
- FL Studio20.9自带中文入门版本
- c语言case用多重语句,switch多重选择
- python可以做什么灰产-广州市标书资料销毁详细流程
- 对学校的希望和寄语_对小学生的寄语与希望
- shopex服务器信息,ShopEx开放平台
- 国庆节发个国庆直播的小软件
- win7计算机名怎么是感叹号,Win7系统wifi信号后出现感叹号怎么办 Win7连接wifi后出现感叹号三种原因和解决方法...
- 道德经解析(2)---定力
- 使用poi将数据导出到excel
- linux 守护进程小结
热门文章
- 用python做youtube自动化下载器 思路
- python将xls格式转成xlsx格式
- 证件照排版软件_不会用PS做证件照?Word也能排版打印1寸照,一键轻松搞定
- 聊聊微服务架构的优缺点
- 分区助手扩大c盘后自动修复_分区助手扩大c盘的详细操作步骤
- 计算机限制无法压缩,电脑上文件夹压缩不了怎么办
- 使用M0 DesignStart 的样例SoC(example system) - 4 FPGA原型验证
- 基于c语言实现的TCP连网斗地主程序(一)
- 奶奶说标题不能起的太长要不然会有憨憨跟着读之Linux简述及常用命令
- 从达特茅斯会议到图灵奖---人工智能学习分享