首页 > 代码库 > 进击的五子棋第二季
进击的五子棋第二季
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 }
进击的五子棋第二季
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。