




已阅读5页,还剩5页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
package Chess;import javax.swing.*;import java.awt.*;import java.awt.event.MouseListener;import java.awt.event.MouseMotionListener;import java.awt.event.MouseEvent;/* 五子棋-棋盘类 */public class ChessBoard extends JPanel implements MouseListener public static final int MARGIN = 30; / 格子距离边框的距离 public static final int GRID_SPAN = 35; / 格子跨度 public static final int ROWS = 8;/一共有8行格子 public static final int COLS = 8;/一共有8列格子Point chessList = new Point(ROWS + 1) * (COLS + 1); / 初始每个数组元素为null boolean isBlack = true;/黑色棋先下boolean gameOver = false;/ 是否游戏结束 int chessCount; / 当前棋盘的棋子个数int xIndex, yIndex; / 定义行参数和列参数 public ChessBoard() setBackground(Color.ORANGE);/定义背景色为橘黄色 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 ROWS | 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 = chessListi.getX() * GRID_SPAN + MARGIN; / 网格交叉点的横坐标 int yPos = chessListi.getY() * GRID_SPAN + MARGIN;/ 网格交叉点的纵坐标 g.setColor(chessListi.getColor(); / 颜色 g.fillOval(xPos - Point.DIAMETER / 2, yPos - Point.DIAMETER / 2,Point.DIAMETER, Point.DIAMETER);/ ? if (i = chessCount - 1) / 最后一个棋子 g.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 ? 黑棋 : 白棋;xIndex = (e.getX() - MARGIN + GRID_SPAN / 2) / GRID_SPAN; / 鼠标点击的横坐标转化 yIndex = (e.getY() - MARGIN + GRID_SPAN / 2) / GRID_SPAN; / 鼠标点击的纵坐标转化/ 棋盘外面 ,不能下 if (xIndex ROWS | yIndex COLS)return;/ 位置已有棋子 ,不能下 if (findChess(xIndex, yIndex)return;Point ch = new Point(xIndex, yIndex, isBlack ? Color.black: Color.white);chessListchessCount+ = ch;repaint(); / 重新构图if (isWin() / 赢了 String msg = String.format(恭喜,%s赢了!, colorName);JOptionPane.showMessageDialog(this, msg);gameOver = true;isBlack = !isBlack;/ 鼠标点击时 public void mouseClicked(MouseEvent e) / 鼠标单击public void mouseEntered(MouseEvent e) / 鼠标进入组件 public void mouseExited(MouseEvent e) / 鼠标离开 public void mouseReleased(MouseEvent e) / 鼠标释放 / 确定格子 private boolean findChess(int x, int y) for (Point c : chessList) if (c != null & c.getX() = x & c.getY() = y)return true;return false;private boolean isWin() / 判断哪方赢 int continueCount = 1; / 连续棋子个数 / 统计连续棋子个数在x轴for (int x = xIndex - 1; x = 0; x-) Color c = isBlack ? Color.black : Color.white;if (getChess(x, yIndex, c) != null) continueCount+; elsebreak;/ 统计棋子个数在x轴for (int x = xIndex + 1; x = 5) return true; elsecontinueCount = 1;/ 纵向统计棋子个数for (int y = yIndex - 1; y = 0; y-) Color c = isBlack ? Color.black : Color.white;if (getChess(xIndex, y, c) != null) continueCount+; elsebreak;/ 纵向统计棋子个数for (int y = yIndex + 1; y = 5) return true; elsecontinueCount = 1;/ 斜着寻找for (int x = xIndex + 1, y = yIndex - 1; y = 0 & x = COLS; x+, y-) Color c = isBlack ? Color.black : Color.white;if (getChess(x, y, c) != null) continueCount+; elsebreak;/ 斜着寻找for (int x = xIndex - 1, y = yIndex + 1; y = 0; x-, y+) Color c = isBlack ? Color.black : Color.white;if (getChess(x, y, c) != null) continueCount+; elsebreak;if (continueCount = 5) return true; elsecontinueCount = 1;/ 斜着寻找for (int x = xIndex - 1, y = yIndex - 1; y = 0 & x = 0; x-, y-) Color c = isBlack ? Color.black : Color.white;if (getChess(x, y, c) != null) continueCount+; elsebreak;/斜着寻找 for (int x = xIndex + 1, y = yIndex + 1; y = ROWS & x = 5) return true; elsecontinueCount = 1;return false;private Point getChess(int xIndex, int yIndex, Color color) for (Point c : chessList) if (c != null & c.getX() = xIndex & c.getY() = yIndex& c.getColor() = color)return c;return null;public void restartGame() / 重新开始for (int i = 0; i 0) xIndex = chessListchessCount - 1.getX();yIndex = chessListchessCount - 1.getY();isBlack = !isBlack;repaint();/ 矩阵 public Dimension getPreferredSize() return new Dimension(MARGIN * 2 + GRID_SPAN * COLS, MARGIN * 2+ GRID_SPAN * ROWS);package Chess;import java.awt.Color;/*五子棋的棋子设计。 */public class Point private int x; / 在第几行private int y; / 在第几列private Color color; / 棋子颜色public static final int DIAMETER = 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;public void setColor(Color color) / 定义棋子的颜色this.color = color;package Chess;import javax.swing.*;import java.awt.event.*;import java.awt.*;/* 五子棋-主框架类, 程序启动类 */public class StartChessJFrame extends JFrame private ChessBoard chessBoard; / 定义棋盘private JPanel toolbar; / 定义工具栏private JButton startButton, backButton, exitButton;/ 定义开始,返回和退出按钮private JMenuBar menuBar; / 菜单条private JMenu sysMenu; / 主菜单private JMenuItem startMenuItem, exitMenuItem, 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);MyItemListener lis = new MyItemListener(); / 动作监听器this.startMenuItem.addActionListener(lis); / 将菜单项注册到监听器上backMenuItem.addActionListener(lis);exitMenuItem.addActionListener(lis);menuBar.add(sysMenu); / 系统菜单添加到菜单栏setJMenuBar(menuBar); / 设定主菜单栏toolbar = new JPanel(); / 工具栏实例化/ 初始化三个按钮startButton = new JButton(重新开始);backButton = new JButton(悔棋);exitButton = new JButton(退出);toolbar.setLayout(new FlowLayout(FlowLayout.LEFT); / 调用设计布局/ 设计布局toolbar.add(startButton);toolbar.add(backButton);toolbar.add(exitButton);/ 添加开始,返回,退出按钮到监听器上startButton.addActionListener(lis);backButton.addActionListener(lis);exitButton.addActionListener(lis);add(toolbar, BorderLayout.SOUTH);
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 高效节能造型-洞察及研究
- 2025新疆阿合奇县招聘社区工作者13人考试参考试题及答案解析
- 2025年宿州市人才集团有限公司二次招募就业见习人员10名备考练习试题及答案解析
- 2025湖北十堰市丹江口市事业单位招聘126人考试参考试题及答案解析
- 家庭的力量写人作文(15篇)
- 一年级班务工作计划范文6篇
- 2025年男式休闲裤行业研究报告及未来行业发展趋势预测
- 智能环保污染治理建议创新创业项目商业计划书
- 2025年饰品盒行业研究报告及未来行业发展趋势预测
- 2025年生态环保型帐篷露营体验活动合同
- 《寂静的春天》课件
- 石油化工行业历史沿革与发展展望
- 招租写字楼方案
- 组织工程与再生医学的前景
- 危险化学品(储存、生产、使用)企业安全风险辨识分级管控清单
- 委托书范本(下载版)
- 医院收费窗口服务规范
- 初一开学第一课班会课件
- 幼儿园劳务分包合同范本
- 电网调度自动化系统调试报告模板
- 13.3 比热容(教学设计) 九年级物理全一册 (人教版)
评论
0/150
提交评论