五子棋
- 格式:doc
- 大小:215.77 KB
- 文档页数:14
一、问题描述简单描述和说明要解决的问题1.绘制棋盘如何绘制。
2.棋盘中下棋功能3.判断输赢功能;4. 重新开始功能5. 悔棋功能。
二、问题分析及程序设计思路●绘制棋盘如何绘制1.使用双重循环绘制棋盘,通过GUI 方法绘制直线●棋盘中下棋功能1.使用二维存放棋盘每个位置,通过x,y坐标控制位置,判断在数组中,下棋位置是否存放棋子●棋盘中下棋功能判断输赢功能1.根据下棋6个方向,判断5颗棋子相连●重新开始功能1.清空棋盘的中棋子,让棋盘中变量恢复初始化时状态●重新开始功能1.清空棋盘的中棋子,让棋盘中变量恢复初始化时状态三、设计与实现1.用到的核心类: import java.awt.Graphics;import java.awt.event.MouseEvent;import java.awt.event.MouseListener;import java.io.File;import javax.swing.JOptionPane;import javax.swing.SwingConstants;2.核心代码:五子棋-主框架类, 程序启动类 :/*五子棋-主框架类, 程序启动类*/public class StartChessJFrame extends JFrame {private ChessBoard chessBoard; // 设置棋盘private JPanel toolbar; // 设置一个容器private JButton startButton, backButton, exitButton;// 设置开始键,返回键,退出键private JMenuBar menuBar; // 菜单条private JMenu sysMenu, exitMenu; // 菜单private JMenuItem startMenuItem, backMenuItem; // 菜单项public StartChessJFrame() {setTitle("单机版六子棋"); // 窗口标题chessBoard = new ChessBoard(); // 新建一个棋盘menuBar = new JMenuBar(); // 创建一个菜单条sysMenu = new JMenu("系统"); // 创建一个菜单名叫“系统”startMenuItem = new JMenuItem("重新开始");// exitMenuItem = new JMenuItem("退出");backMenuItem = new JMenuItem("悔棋"); // 创建一个菜单项名叫“悔棋”sysMenu.add(startMenuItem); // 添加菜单项“重新开始”到菜单中sysMenu.add(backMenuItem);// sysMenu.add(exitMenuItem);exitMenu = new JMenu("退出"); // 鼠标监听退出exitMenu.addMenuListener(new MenuListener() {@Overridepublic void menuSelected(MenuEvent e) {int a = JOptionPane.showConfirmDialog(null, "退出");if (a == 0) {System.exit(0);}}@Overridepublic void menuDeselected(MenuEvent e) {}@Overridepublic void menuCanceled(MenuEvent e) {}});MyItemListener lis = new MyItemListener(); // 创建一个监听器this.startMenuItem.addActionListener(lis); // 当前开始菜单选项添加事件监听器backMenuItem.addActionListener(lis);menuBar.add(sysMenu); // 把菜单添加到菜单条中menuBar.add(exitMenu);setJMenuBar(menuBar); // 设置菜单toolbar = new JPanel(); // 设置一个面板容器// 创建三个按钮名为“重新开始”“悔棋”“退出”startButton = new JButton("重新开始");backButton = new JButton("悔棋");exitButton = new JButton(" 退出 ");// toolbar.setLayout(new FlowLayout(FlowLayout.LEFT)); //// toolbar这个组件设置布局,是左对齐的flowlayouttoolbar.setLayout(new BorderLayout(100, 100));// 把开始,悔棋,退出按钮添加到容器中去toolbar.add(startButton, BorderLayout.WEST);toolbar.add(backButton, BorderLayout.CENTER);toolbar.add(exitButton, BorderLayout.EAST);// 在三个按钮上设置监听器startButton.addActionListener(lis);backButton.addActionListener(lis);exitButton.addActionListener(lis);add(toolbar, BorderLayout.SOUTH);// 把含有三个按钮的容器添加到界面下方add(chessBoard);// 把棋盘添加到界面setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);// 设置退出按钮setResizable(false);setSize(700, 700); // 修改前为自动设置大小,修改后为 700像素*700像素// pack(); // 依据放置的组件设定窗口的大小,使之正好能容纳放置的所有组件setLocationRelativeTo(null); // 修改后窗口居中}private class MyItemListener implements ActionListener {// 创建一个类MyItemListener继承ActionListener类(事件监听)public void actionPerformed(ActionEvent e) {Object obj = e.getSource(); // 获得事件监听的对象,即点击了什么按钮if (obj == StartChessJFrame.this.startMenuItem|| obj == startButton) {// 如果点击了开始按钮// JFiveFrame.this内部类引用外部类System.out.println("重新开始...");chessBoard.restartGame();} else if (obj == exitButton) {int a = JOptionPane.showConfirmDialog(null, "退出");if (a == 0) {System.exit(0);}// System.exit(0); // 如果点击退出,退出游戏} else if (obj == backMenuItem || obj == backButton) { // 如果点击悔棋,回退一步System.out.println("悔棋...");chessBoard.goback();}}}public static void main(String[] args) {StartChessJFrame f = new StartChessJFrame(); // 开始五子棋游戏f.setVisible(true); // 数据模型已经构造好,允许JVM可以根据数据模型执行paint方法开始画图并显示到屏幕上}}五子棋-棋盘类 :package Chess;import javax.swing.*;import java.awt.*;import java.awt.event.MouseListener;import java.awt.event.MouseMotionListener;import java.awt.event.MouseEvent;/*五子棋-棋盘类*///apublic class ChessBoard extends JPanel implements MouseListener { // public static final int MARGIN = 30; // 边缘30public static final int MARGIN = 80; // 修改后边缘80// public static final int GRID_SPAN = 35; // 格子间距35public static final int GRID_SPAN = 50; // 修改后格子间距50// public static final int ROWS = 8;//行数为8public static final int ROWS = 9;// 修改后行数为9// public static final int COLS = 9;//列数为9public static final int COLS = 10;// 修改后列数为9Point[] chessList = new Point[(ROWS + 1) * (COLS + 1)]; // 可放置棋子的点数个数boolean isBlack = false;// 默认为黑棋,修改后把 true 该为false,变为白棋先行boolean gameOver = false;// 默认游戏未结束int chessCount; // 步数int xIndex, yIndex; // 横坐标纵坐标public ChessBoard() {setBackground(Color.lightGray);// 棋盘背景色为橙色,修改后为灰色addMouseListener(this);// 鼠标监听器addMouseMotionListener(new MouseMotionListener() { // 创建一个新的鼠标监听器public void mouseDragged(MouseEvent e) {}public void mouseMoved(MouseEvent e) {// 鼠标移动监听int x1 = (e.getX() - MARGIN + GRID_SPAN / 2) / GRID_SPAN;int y1 = (e.getY() - MARGIN + GRID_SPAN / 2) / GRID_SPAN;// 鼠标移到位置对应的可以放置棋子的点所在的行// 鼠标移到位置对应的可以放置棋子的点所在的列// 设置鼠标形状if (x1 < 0 || x1 > ROWS || y1 < 0 || y1 > COLS || gameOver|| findChess(x1, y1))setCursor(new Cursor(Cursor.DEFAULT_CURSOR)); // 当在棋盘外时,鼠标为指针elsesetCursor(new Cursor(Cursor.HAND_CURSOR)); // 当在棋盘内时,鼠标为手形}});}// 画界面public void paintComponent(Graphics g) {super.paintComponent(g);// 画界面for (int i = 0; i <= ROWS; i++) { // 画横行g.drawLine(MARGIN, MARGIN + i * GRID_SPAN, MARGIN + COLS* GRID_SPAN, MARGIN + i * GRID_SPAN);}for (int i = 0; i <= COLS; i++) {// 画纵列g.drawLine(MARGIN+ i* GRID_SPAN, MARGIN, MARGIN+ i* GRID_SPAN,MARGIN + ROWS * GRID_SPAN);}// 先下的棋子for (int i = 0; i < chessCount; i++) {int xPos = chessList[i].getX() * GRID_SPAN + MARGIN; // 横坐标int yPos = chessList[i].getY() * GRID_SPAN + MARGIN; // 纵坐标g.setColor(chessList[i].getColor()); // 获取棋子的颜色g.fillOval(xPos- Point.DIAMETER/ 2, yPos- Point.DIAMETER/ 2,Point.DIAMETER, Point.DIAMETER);// 确定下的棋子if (i == chessCount - 1) { // 下的棋子量-1g.setColor(Color.red);g.drawRect(xPos - Point.DIAMETER / 2,yPos - Point.DIAMETER / 2, Point.DIAMETER,Point.DIAMETER);}}}public void mousePressed(MouseEvent e) {// 鼠标点击时// 判断游戏是否结束if (gameOver)return;// String colorName = isBlack ? "黑棋" : "白棋"; 修改前String colorName = isBlack ? "黄棋" : "红棋"; // 修改后为黄红xIndex = (e.getX() - MARGIN + GRID_SPAN / 2) / GRID_SPAN; // 鼠标移到位置对应的可以放置棋子的点所在的行yIndex = (e.getY() - MARGIN + GRID_SPAN / 2) / GRID_SPAN; // 鼠标移到位置对应的可以放置棋子的点所在的列// 黑棋,不能下if (xIndex < 0 || xIndex > ROWS || yIndex < 0 || yIndex > COLS) return;// 白棋,不能下if (findChess(xIndex, yIndex))return;Point ch = new Point(xIndex, yIndex, isBlack ? Color.ORANGE: Color.magenta);// 修改棋子颜色,前为黑白,修改后为黄红。