




已阅读5页,还剩4页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第一个文件: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);/ 将menuBar设置为菜单栏toolbar = new JPanel();/工具面板栏实例化startButton = new JButton(重新开始);/三个按钮初始化backButton = new JButton(悔棋);exitButton = new JButton(退出);toolbar.setLayout(new FlowLayout(FlowLayout.LEFT);/将工具面板按钮用FlowLayout布局toolbar.add(startButton);/将三个按钮添加到工具面板上toolbar.add(backButton);toolbar.add(exitButton);startButton.addActionListener(lis);/将三个按钮注册监听事件backButton.addActionListener(lis);exitButton.addActionListener(lis);add(toolbar, BorderLayout.SOUTH);/将工具面板布局到界面南方也就是下面add(chessBoard);/将面板对象添加到窗体上setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);/设置界面关闭事件/setSize(800,800);pack(); / 自适应大小private class MyItemListener implements 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 = exitMenuItem | obj = exitButton) 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); / 显示主框架第二个文件:import java.awt.Color;/*五子棋的棋子设计。 */public class Point private int x; / 棋盘中的x索引private int y; / 棋盘中的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() / 拿到棋盘中的x索引return x;public int getY() / 拿到棋盘中的Y索引return y;public Color getColor() /得到颜色return color;第三个文件: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 = 15;/棋盘行数public static final int COLS = 15;/棋盘列数Point chessList = new Point(ROWS + 1) * (COLS + 1); / 初始每个数组元素为nullboolean 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;/ 游戏已经结束,不能下/ 落在棋盘外,不能下/ x,y位置已经有棋子存在,不能下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; / 网格交叉点的x坐标int yPos = chessListi.getY() * GRID_SPAN + MARGIN;/ 网格交叉点的y坐标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;/ x,y位置已经有棋子存在,不能下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;/ 覆盖MouseListener的方法public void mouseClicked(MouseEvent e) / 鼠标按键在组件上单击(按下并释放)时调用。public void mouseEntered(MouseEvent e) / 鼠标进入到组件上时调用。public void mouseExited(MouseEvent e) / 鼠标离开组件时调用。public void mouseReleased(MouseEvent e) / 鼠标按钮在组件上释放时调用。/ 在棋子数组中查找是否有索引为x,y的棋子存在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; / 连续棋子的个数/ 横向向西寻找for (int x = xIndex - 1; x = 0; x-) Color c = isBlack ? Color.black : Color.white;if (getChess(x, yIndex, c) != null) continueCount+; elsebreak;/ 横向向东寻找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. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年高校退休管理岗招聘考试重点题
- 2025年机关财务招聘面试模拟试卷
- 2025年无机化工生产工考试重点题及答案集解析集集解析集
- 2025年社会福利会计能力题集
- 课件APP介绍教学课件
- 2025年宠物销售代表面试题及答案
- 2025年风险管理师职业素质评估试题及答案解析
- 2025年快递企业安全实务题及答案
- 2025年志愿服务基金会笔试模拟考试试卷
- 机电专业班长培训知识课件
- 2025年稳定币在大宗商品跨境贸易中的应用研究报告
- 医院财务人员专业能力提升培训
- PDCA循环在医院应急管理中的应用
- 2026创新设计高考总复习生物(人教版)-限时强化练答案解析
- 2025年人资部长面试题及答案
- 《语文八下第三单元复习课》课件
- 二手车鉴定评估的报告书
- 教学课件 金属学与热处理-崔忠圻
- 多智能体系统教材课件汇总完整版ppt全套课件最全教学教程整本书电子教案全书教案课件合集
- 艺术欣赏完整版课件全套ppt教程(最新)
- 北师大版五年级数学上册全册教案含反思
评论
0/150
提交评论