首页 > 代码库 > 进击的五子棋第二季

进击的五子棋第二季

  1 package com.lovo;  2   3 import java.awt.BasicStroke;  4 import java.awt.Color;  5 import java.awt.Graphics;  6 import java.awt.Graphics2D;  7 import java.awt.Stroke;  8   9 import org.w3c.dom.css.Counter; 10  11 public class Board { 12     private int currentColor; 13     private int[][] b = new int[15][15]; 14  15     /** 16      * 画棋盘 17      *  18      * @param g 19      */ 20     public void draw(Graphics g) { 21         g.setColor(Color.BLACK); 22         Graphics2D g2d = (Graphics2D) g; // 用Graphics2D可以调粗细 23         Stroke oldsStroke = g2d.getStroke();// 保存现场 24         g2d.setStroke(new BasicStroke(3)); // 设置画笔粗细 25         g.drawRect(50, 50, 700, 700); // 矩形框 26         g2d.setStroke(oldsStroke); // 回复现场 27         for (int i = 0; i < 13; i++) { 28             g.drawLine(50, 100 + i * 50, 750, 100 + i * 50); 29             g.drawLine(100 + i * 50, 50, 100 + i * 50, 750); 30         } 31         // 画天元和三三点 32         g.fillOval(390, 390, 20, 20);// 实心椭圆 33         g.fillOval(195, 195, 10, 10); 34         g.fillOval(595, 195, 10, 10); 35         g.fillOval(595, 595, 10, 10); 36         g.fillOval(195, 595, 10, 10); 37         for (int i = 0; i < b.length; i++) {// 行的循环,控制纵坐标 38             for (int j = 0; j < b[i].length; j++) {// 列的循环,控制横坐标 39                 if (b[i][j] != 0) { 40                     g.setColor(b[i][j] == 1 ? Color.BLACK : Color.WHITE); 41                     g.fillOval(25 + 50 * j, 25 + 50 * i, 50, 50); 42                 } 43             } 44         } 45     } 46     /** 47      * 走棋 48      * @param row 行 49      * @param col 列 50      * @param isBlack 是否是黑棋 51      * @return    boolean 52      */ 53     public boolean playChess(int row, int col, boolean isBlack) { 54         if (b[row][col] == 0) { 55             b[row][col] = isBlack ? 1 : 2; 56             return true; 57         } 58         return false; 59     } 60     /** 61      * 判断是否决出胜负 62      * @param row 行 63      * @param col 列 64      * @param isBlack 是否是黑棋 65      * @return boolean 66      */ 67     public boolean judge(int row, int col, boolean isBlack) { 68         currentColor = isBlack ? 1 : 2; 69         return compareVer(row, col, currentColor) == 5 || compareHor(row, col, currentColor) == 5|| 70                 compareX1(row, col, currentColor) == 5|| compareX2(row, col, currentColor) == 5; 71     } 72     /** 73      * 判断垂直方向上是否有五子相连 74      * @param row 行 75      * @param col 列 76      * @param currentColor 当前棋子的颜色 77      * @return    相连的棋子数 78      */ 79     private int compareVer(int row,int col, int currentColor) { 80         int counter = 1; 81         int tempRow = row; 82         while (tempRow - 1 >= 0 && b[tempRow - 1][col] == currentColor) { 83             tempRow--; 84             counter++; 85         } 86         tempRow = row; 87         while (tempRow + 1 <= b.length && b[tempRow + 1][col] == currentColor) { 88             tempRow++; 89             counter++; 90         } 91         return counter; 92     } 93     /** 94      * 判断水平方向上是否有五子相连 95      * @param row 行 96      * @param col 列 97      * @param currentColor 当前棋子的颜色 98      * @return    相连的棋子数 99      */    100     private int compareHor(int row,int col, int currentColor) {101         int counter = 1;102         int tempCol = col;103         while (tempCol - 1 >= 0 && b[row][tempCol - 1] == currentColor) {104             tempCol--;105             counter++;106         }107         tempCol = col;108         while (tempCol + 1 <= b[row].length && b[row][tempCol + 1] == currentColor) {109             tempCol++;110             counter++;111         }112         return counter;113     }114     /**115      * 判断对角线方向"\"上是否有五子相连116      * @param row 行117      * @param col 列118      * @param currentColor 当前棋子的颜色119      * @return    相连的棋子数120      */    121     private int compareX1(int row,int col, int currentColor) {122         int counter = 1;123         int tempRow = row;124         int tempCol = col;125         while (tempRow - 1 >= 0 && tempCol - 1 >= 0 && b[tempRow - 1][tempCol - 1] == currentColor) {126             tempCol--;127             tempRow--;128             counter++;129         }130         tempRow = row;131         tempCol = col;132         while (tempRow + 1 <= b.length && tempCol + 1 <= b.length && b[tempRow + 1][tempCol + 1] == currentColor) {133             tempCol++;134             tempRow++;135             counter++;136         }137         return counter;138     }139     /**140      * 判断对角线方向"/"上是否有五子相连141      * @param row 行142      * @param col 列143      * @param currentColor 当前棋子的颜色144      * @return    相连的棋子数145      */    146     private int compareX2(int row,int col, int currentColor) {147         int counter = 1;148         int tempRow = row;149         int tempCol = col;150         while (tempRow - 1 >= 0 && tempCol + 1 <= b[tempRow].length && b[tempRow - 1][tempCol + 1] == currentColor) {151             tempCol++;152             tempRow--;153             counter++;154         }155         tempRow = row;156         tempCol = col;157         while (tempRow + 1 <= b.length && tempCol - 1 >= 0 && b[tempRow + 1][tempCol - 1] == currentColor) {158             tempCol--;159             tempRow++;160             counter++;161         }162         return counter;163     }164     // public void makeAMove() {165     // int row = (int) (Math.random() * 15);166     // int col = (int) (Math.random() * 15);167     // if (b[row][col] == 0) {168     // b[row][col] = blackTurn ? 1 : 2;//0表示没有走棋,1表示黑棋,2表示白棋169     // blackTurn = !blackTurn; //交换走棋170     // }171     // }172 }
 1 package com.lovo; 2  3 import java.awt.Color; 4 import java.awt.Font; 5 import java.awt.Graphics; 6 import java.awt.Image; 7 import java.awt.event.ActionEvent; 8 import java.awt.event.ActionListener; 9 import java.awt.event.KeyAdapter;10 import java.awt.event.KeyEvent;11 import java.awt.event.KeyListener;12 import java.awt.event.MouseAdapter;13 import java.awt.event.MouseEvent;14 import java.awt.image.BufferedImage;15 16 import javax.swing.JFrame;17 import javax.swing.Timer;18 19 public class MyFrame extends JFrame{20     private static final long serialVersionUID = -3544738451252364271L;21     private boolean isBlackTurn = true;22     private Board board = new Board();23     private boolean isContinue = true;24     //在内存中创建一张图25     private Image offImage = new BufferedImage(800, 800, BufferedImage.TYPE_INT_RGB);26     public MyFrame(){27         this.setTitle("五子棋");28         this.setSize(800, 800);29         this.setResizable(false);30         this.getContentPane().setBackground(new Color(197, 194, 129));//设置窗口背景31         this.setDefaultCloseOperation(EXIT_ON_CLOSE);32         this.setLocationRelativeTo(null);    //窗口居中33         this.addKeyListener(new KeyAdapter() {//添加一个键盘的监听,按F2重置游戏34             @Override35             public void keyPressed(KeyEvent e) {36                 if (e.getKeyCode() == 113) {37                     board = new Board();//新建一个棋盘38                     isContinue =true;    39                     repaint();40                 }41             }42             43         });44         this.addMouseListener(new MouseAdapter() {//添加一个鼠标的监听45 46             @Override47             public void mousePressed(MouseEvent e) {48                 int x = e.getX();49                 int y = e.getY();50                 if (isContinue) {//判断是否继续游戏51                     if (x >= 50 && x <= 750 && y >=50 && y <= 750) {52                         int row = Math.round((y - 50) / 50.0F);53                         int col = Math.round((x - 50) / 50.0F);54                         //走棋,返回true走棋成功,返回false走棋失败(如走棋的地方已经有棋了)55                         if (board.playChess(row, col, isBlackTurn)) {56                             repaint();57                             //判断是否决出胜负58                             if (board.judge(row, col, isBlackTurn)) {59                                 isContinue = false;                        //游戏结束60                             }else {61                                 isBlackTurn = !isBlackTurn;62                             }63                         }64                     }65                 }66                 67             }68             69         });70     }71 72     @Override73     public void paint(Graphics g) {//操作系统调用该方法绘图74         Graphics newG = offImage.getGraphics();//得到内存中图片的画笔75         super.paint(newG);                //有才能设置背景,在内存中画出窗口76         board.draw(newG);                //在内存中画出棋盘77         if (!isContinue) {78             newG.setFont(new Font("微软雅黑", Font.BOLD, 100));79             if (isBlackTurn) {80                 newG.setColor(new Color(62, 62, 62));81                 newG.drawString("黑方胜利", 200, 400);82             }else {83                 newG.setColor(new Color(222, 222, 222));84                 newG.drawString("白方胜利", 200, 400);85             }86             newG.setFont(new Font("微软雅黑", Font.BOLD, 20));87             newG.setColor(new Color(90, 90, 255));88             newG.drawString("按F2键重置棋盘", 300, 490);89         }90         g.drawImage(offImage, 0, 0, 800, 800,null);//把内存里的棋盘放到屏幕上91     }92 }
1 package com.lovo;2 3 public class GameRun {4     public static void main(String[] args) {5         new MyFrame().setVisible(true);6     }7 }

 

进击的五子棋第二季