五指棋(JAVA小项目)

来源:互联网 发布:大数据保密管理制度 编辑:程序博客网 时间:2024/04/28 14:01

前言:老师上课布置的一个课后作业(写一个棋类的游戏),我就选了一个自我感觉最简单的一个来写--五子棋。第一次写这这样的有界面的工程,参考了一些网上的代码。

由于我们学的是Swing 所以这里就用Swing来实现这个工程。


首先得有一个主类(StartChess.java)程序的入口。用来加载窗口,然后在窗口上添加组件。

这里我的窗口采用的BorderLayout 布局管理器 在北部添加一个工具面板 上面放一些 开始,悔棋的按钮以及提示框,再在窗口上填加一个棋盘面板下棋用

然后是一棋盘类(ChessBoard.java)继承 JPanel 

最后是一个棋子类(Point.java)

运行效果图:




package sc.job.wuziqi;import java.awt.BorderLayout;import java.awt.Button;import java.awt.Color;import java.awt.FlowLayout;import java.awt.Font;import java.awt.Panel;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import javax.swing.JFrame;import javax.swing.JLabel;import javax.swing.JPanel;/* * 游戏主类(main) * 加载窗口加载组件 * */public class StartChess extends JFrame {private ChessBoard chessboard;// 棋盘面板private JPanel tool; // 工具面板private Button restartB;// 重新开始按钮private Button exitB;// 退出按钮private Button backB;// 悔棋按钮public static JLabel tooltip; // 游戏提示框,用做显示游戏结束和获胜方public static void main(String[] args) {StartChess sc = new StartChess();sc.setVisible(true);// 显示窗口}public StartChess() {super();setTitle("五子棋小游戏");setBounds(100, 100, 20 + 30 * 2 + 35 * 15, 40 + 40 + 60 + 35 * 15);// 设置窗口的大小chessboard = new ChessBoard();// 实例化棋盘面板tool = new JPanel();// 实例化工具面板restartB = new Button("重新开始");// 初始化按钮SCexitB = new Button("退出");backB = new Button("悔棋");tooltip = new JLabel("欢迎来到SC的五子棋小游戏");tooltip.setFont(new Font("", Font.PLAIN, 16));// 设置提示框的字体和字号tooltip.setForeground(Color.blue);// 设置提示框的字体颜色tool.setLayout(new FlowLayout(FlowLayout.CENTER));// 用流式布局设为中间对齐tool.add(backB);// 将三个按钮添加到面板上tool.add(restartB);tool.add(exitB);tool.add(tooltip);/* * 设置三个按钮的事件处理 */restartB.addActionListener(new ActionListener() {// 重新开始按钮public void actionPerformed(ActionEvent e) {chessboard.restartGame();StartChess.tooltip.setText("游戏重新开始");StartChess.tooltip.setForeground(Color.blue);}});exitB.addActionListener(new ActionListener() {// 退出按钮public void actionPerformed(ActionEvent e) {System.exit(0);}});backB.addActionListener(new ActionListener() {// 悔棋按钮public void actionPerformed(ActionEvent e) {chessboard.goBack();}});add(tool, BorderLayout.NORTH);// 将工具面板添加到窗口的北部add(chessboard);// 在窗口上添加棋盘面板setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);// 设置界面关闭事件// pack();}}

package sc.job.wuziqi;import java.awt.Color;import java.awt.Graphics;import java.awt.event.MouseEvent;import java.awt.event.MouseListener;import javax.swing.JOptionPane;import javax.swing.JPanel;/* * 棋盘类 * 画棋盘和棋子  * */public class ChessBoard extends JPanel {public final static int EDGE = 30;// 边距public final static int SPACE = 35;// 间距public final static int ROCO = 15;// 行列数Point[] chessList = new Point[(ROCO + 1) * (ROCO + 1)];// 存储已经下的棋子boolean isBack = true;// 默认黑棋先下boolean gameOver = false;// 游戏是否结束int xId, yId;// 棋子的坐标int chessCount;// 棋子个数public ChessBoard() {setBackground(Color.ORANGE);// 添加事件监听器addMouseListener(new MouseListener() {// 鼠标事件监听@Overridepublic void mouseReleased(MouseEvent e) {}@Overridepublic void mousePressed(MouseEvent e) {if (gameOver)return;xId = (e.getX() - EDGE + SPACE / 2) / SPACE;// 获取鼠标点击位置在棋盘上的索引yId = (e.getY() - EDGE + SPACE / 2) / SPACE;// System.out.println(xId + " " + yId);if (xId < 0 || yId < 0 || xId > ROCO || yId > ROCO)return;// 超出棋盘边界if (findchess(xId, yId))return;// 该棋子已经存在Point c = new Point(xId, yId, isBack ? Color.black : Color.white);chessList[chessCount++] = c;repaint();// 重新画图if (isWin()) {if (isBack) {StartChess.tooltip.setText("黑方胜,游戏结束");StartChess.tooltip.setForeground(Color.RED);} else {StartChess.tooltip.setText("白方胜,游戏结束");StartChess.tooltip.setForeground(Color.RED);}gameOver = true;} else if (chessCount == (ROCO + 1) * (ROCO + 1)) {// 棋盘下满的情况StartChess.tooltip.setText("平局,旗鼓相当,游戏结束");StartChess.tooltip.setForeground(Color.RED);gameOver = true;}isBack = !isBack;// 换另一方下棋}@Overridepublic void mouseExited(MouseEvent e) {}@Overridepublic void mouseEntered(MouseEvent e) {}@Overridepublic void mouseClicked(MouseEvent e) {}});}// 查找该索引上是否有棋子boolean findchess(int x, int y) {for (Point obj : chessList) {if (obj != null && obj.getY() == y && obj.getX() == x)return true;}return false;}// 画棋盘和棋子public void paintComponent(Graphics g) {super.paintComponent(g);for (int i = 0; i <= ROCO; i++) {// 画横线g.drawLine(EDGE, EDGE + i * SPACE, EDGE + ROCO * SPACE, i * SPACE + EDGE);}for (int i = 0; i <= ROCO; i++) {// 画竖线g.drawLine(EDGE + i * SPACE, EDGE, i * SPACE + EDGE, EDGE + ROCO * SPACE);}//在网格中画五个小点g.fillOval(EDGE+3*SPACE-4,EDGE+3*SPACE-4,8,8);g.fillOval(EDGE+12*SPACE-4,EDGE+3*SPACE-4,8,8);g.fillOval(EDGE+7*SPACE-4,EDGE+7*SPACE-4,8,8);g.fillOval(EDGE+3*SPACE-4,EDGE+12*SPACE-4,8,8);g.fillOval(EDGE+12*SPACE-4,EDGE+12*SPACE-4,8,8);//画棋子for (int i = 0; i < chessCount; i++) {int xpos = chessList[i].getX() * SPACE + EDGE;// 获取棋子在棋盘的坐标int ypos = chessList[i].getY() * SPACE + EDGE;g.setColor(chessList[i].getColor());// 获取棋子的颜色g.fillOval(xpos - Point.PSIZE / 2, ypos - Point.PSIZE / 2, Point.PSIZE, Point.PSIZE);// 画出棋子if (i == chessCount - 1) {g.setColor(Color.red);// 将画笔的颜色改为红色g.drawRect(xpos - Point.PSIZE / 2, ypos - Point.PSIZE / 2, Point.PSIZE, Point.PSIZE);// 标记最后一个棋子}}}/* * 判断输赢 */boolean isWin() {int count = 1;Color c = isBack ? Color.black : Color.white;// 以新下的棋子为开始向左右(横向)查找是否有5个连续的同色子for (int i = xId - 1; i >= 0; i--)if (getChess(i, yId, c))count++;elsebreak;for (int i = xId + 1; i <= ROCO; i++)if (getChess(i, yId, c))count++;elsebreak;if (count >= 5)return true;// 同上在竖直方向进行检索count = 1;for (int i = yId - 1; i >= 0; i--)if (getChess(xId, i, c))count++;elsebreak;for (int i = yId + 1; i <= ROCO; i++)if (getChess(xId, i, c))count++;elsebreak;if (count >= 5)return true;// 分别向左上和右下count = 1;for (int i = xId - 1, j = yId - 1; i >= 0 && j >= 0; i--, j--) {if (getChess(i, j, c))count++;elsebreak;}for (int i = xId + 1, j = yId + 1; i <= ROCO && j <= ROCO; i++, j++) {if (getChess(i, j, c))count++;elsebreak;}if (count >= 5)return true;// 右上左下count = 1;for (int i = xId + 1, j = yId - 1; i <= ROCO && j >= 0; i++, j--) {if (getChess(i, j, c))count++;elsebreak;}for (int i = xId - 1, j = yId + 1; i >= 0 && j <= ROCO; i--, j++) {if (getChess(i, j, c))count++;elsebreak;}if (count >= 5)return true;return false;}boolean getChess(int x, int y, Color c) { // 查询该棋子是否存在for (Point obj : chessList) {if (obj != null && obj.getX() == x && obj.getY() == y && obj.getColor() == c)return true;}return false;}public void restartGame() { // 重新开始游戏的的处理函数for (int i = 0; i < chessCount; i++)chessList[i] = null;isBack = true;gameOver = false;chessCount = 0;repaint();}public void goBack() { // 悔棋的处理函数if (chessCount == 0)return;chessList[chessCount - 1] = null;chessCount--;isBack = !isBack;gameOver = false;repaint();}}


package sc.job.wuziqi;import java.awt.Color;/* * 棋子类 * */public class Point {private int x;private int y; // 棋子在棋盘上的索引private Color color; // 棋子的颜色public final static int PSIZE = 30;public Point(int x, int y, Color color) {this.x = x;this.y = y;this.color = color;}/* * 获取棋子的坐标及其颜色 */public int getX() {return x;}public int getY() {return y;}public Color getColor() {return color;}}


原创粉丝点击