五子棋棋盘

main
pf4fw5i2c 1 year ago
parent 9049fd7d4d
commit 879f216010

@ -0,0 +1,264 @@
package impl;
import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
public class Chessboard extends JPanel {
public static final int MARGIN = 15;
public static final int SPAN = 20;
public static final int ROWS = 19;
public static final int COLS = 19;
Chess[] chessList = new Chess[19 * 19];
int chessCount = 0;
boolean iso = false;
boolean isBlack = true;
String message = "黑棋先下";
public Chessboard() {
this.addMouseListener(new MouseAdapter() {
@Override
public void mousePressed(MouseEvent e) {
// TODO Auto-generated method stub
if (iso) {
return;
}
int col, row;
col = (e.getX() - 15 + 10) / 20;
row = (e.getY() - 15 + 10) / 20;
if (col > 19 || col < 0 || row > 19 || row < 0) {
return;
} else {
if (haschess(col, row)) {
return;
} else {
Color c = Color.BLACK;
if (isBlack) {
c = Color.BLACK;
message = "轮到白棋";
} else {
c = Color.WHITE;
message = "轮到黑棋";
}
Chess cc = new Chess(Chessboard.this, col, row, c);
chessList[chessCount++] = cc;
repaint();
if (isWin(col, row)) {
if (c == Color.BLACK) {
JOptionPane.showMessageDialog(Chessboard.this, "黑棋获胜!");
} else if (c == Color.WHITE) {
JOptionPane.showMessageDialog(Chessboard.this, "白旗获胜!");
}
iso = true;
return;
}
isBlack = !isBlack;
}
}
}
});
}
@Override
public void paint(Graphics e) {
e.setColor(Color.ORANGE);
e.fillRect(0, 0, 410, 460);
e.setColor(Color.black);
for (int i = 0; i < 20; i++) {
e.drawLine(MARGIN, MARGIN + SPAN * i, MARGIN + 19 * 20, MARGIN + 20 * i);
}
for (int i = 0; i < 20; i++) {
e.drawLine(15 + SPAN * i, 15, 15 + SPAN * i, 15 + 19 * 20);
}
e.fillRect(15 + 3 * 20 - 2, 15 + 3 * 20 - 2, 5, 5);
e.fillRect(15 + 9 * 20 - 2, 15 + 3 * 20 - 2, 5, 5);
e.fillRect(15 + 15 * 20 - 2, 15 + 3 * 20 - 2, 5, 5);
e.fillRect(15 + 3 * 20 - 2, 15 + 9 * 20 - 2, 5, 5);
e.fillRect(15 + 9 * 20 - 2, 15 + 9 * 20 - 2, 5, 5);
e.fillRect(15 + 15 * 20 - 2, 15 + 9 * 20 - 2, 5, 5);
e.fillRect(15 + 3 * 20 - 2, 15 + 15 * 20 - 2, 5, 5);
e.fillRect(15 + 9 * 20 - 2, 15 + 15 * 20 - 2, 5, 5);
e.fillRect(15 + 15 * 20 - 2, 15 + 15 * 20 - 2, 5, 5);
Graphics2D e2 = (Graphics2D) e;
e2.setStroke(new BasicStroke(3f));
e2.drawLine(10, 10, 10, 400);
e2.drawLine(10, 10, 400, 10);
e2.drawLine(400, 10, 400, 400);
e2.drawLine(10, 400, 400, 400);
for (int i = 0; i < chessCount; i++) {
chessList[i].draw(e);
}
e.setFont(new Font("黑体", Font.BOLD, 15));
e.drawString("游戏提示:" + message, 20, 420);
}
private boolean haschess(int col, int row) {
boolean result = false;
for (int i = 0; i < chessCount; i++) {
Chess cc = chessList[i];
if (cc != null && cc.getCol() == col && cc.getRow() == row) {
return true;
}
}
return result;
}
private boolean haschess(int col, int row, Color c) {
Boolean result = false;
for (int i = 0; i < chessCount; i++) {
Chess ch = chessList[i];
if (ch != null && ch.getCol() == col && ch.getRow() == row && ch.getColor() == c) {
result = true;
}
}
return result;
}
private boolean isWin(int col, int row) {
boolean result = false;
int CountCh = 1;
Color c = null;
if (isBlack) {
c = Color.BLACK;
} else {
c = Color.WHITE;
}
// 水平向左
for (int x = col - 1; x >= 0; x--) {
if (haschess(x, row, c)) {
CountCh++;
} else {
break;
}
}
// 水平向右
for (int x = col + 1; x <= 19; x++) {
if (haschess(x, row, c)) {
CountCh++;
} else {
break;
}
}
// 水平取胜
if (CountCh >= 5) {
result = true;
message = "游戏结束";
} else {
result = false;
CountCh = 1;
}
// 竖直向上
for (int y = row - 1; y >= 0; y--) {
if (haschess(col, y, c)) {
CountCh++;
} else {
break;
}
}
// 竖直向下
for (int y = row + 1; y <= 19; y++) {
if (haschess(col, y, c)) {
CountCh++;
} else {
break;
}
}
// 竖直取胜
if (CountCh >= 5) {
result = true;
message = "游戏结束";
} else {
result = false;
CountCh = 1;
}
// 斜向右上
for (int x = col + 1, y = row - 1; x <= 19 && y >= 0; x++, y--) {
if (haschess(x, y, c)) {
CountCh++;
} else {
break;
}
}
// 斜向左下
for (int x = col - 1, y = row + 1; x >= 0 && y <= 19; x--, y++) {
if (haschess(x, y, c)) {
CountCh++;
} else {
break;
}
}
// 斜向取胜
if (CountCh >= 5) {
result = true;
message = "游戏结束";
} else {
result = false;
CountCh = 1;
}
// 斜向左上
for (int x = col - 1, y = row - 1; x >= 0 && y >= 0; x--, y--) {
if (haschess(x, y, c)) {
CountCh++;
} else {
break;
}
}
// 斜向右下
for (int x = col + 1, y = row + 1; x <= 19 && y <= 19; x--, y--) {
if (haschess(x, y, c)) {
CountCh++;
} else {
break;
}
}
// 斜向取胜
if (CountCh >= 5) {
result = true;
message = "游戏结束";
} else {
result = false;
CountCh = 1;
}
return result;
}
public void againGame() {
for (int i = 0; i < chessList.length; i++) {
chessList[i] = null;
}
chessCount = 0;
iso = false;
message = "开局黑棋先手";
repaint();
}
public void huiqi() {
if (iso) {
return;
}
chessList[chessCount - 1] = null;
chessCount--;
if (isBlack) {
message = "白棋悔棋";
} else {
message = "黑棋悔棋";
}
isBlack = !isBlack;
repaint();
}
}
Loading…
Cancel
Save