五子棋-主框架类, 程序启动类

代码:


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 MBeanListener();//初始化按钮事件监听器内部类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 MyItemListenerimplementsActionListener{//事件监听器内部类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);// 显示主框架 }}}

棋子类

代码:

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; }}

棋盘类

代码:


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() {@Overridepublic void mouseMoved(MouseEvent e) {// TODO Auto-generated method stub}@Overridepublic void mouseDragged(MouseEvent e) {// TODO Auto-generated method stubint 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 = (int) (chessList[i].getX() * GRID_SPAN + MARGIN); // 网格交叉点的 x 坐 标int yPos = (int) (chessList[i].getY() *GRID_SPAN+ MARGIN);//网格交叉点的y坐标 g.setColor(chessList[i].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 <0|| xIndex >ROWS || yIndex< 0|| yIndex> COLS) return; //x,y 位置已经有棋子存在,不能下 if(findChess(xIndex, yIndex)) return;Point ch = new Point(xIndex, yIndex, isBlack ? Color.black: Color.white); chessList[chessCount++]= 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++;}else break;}// 横向向左寻找for (int x=xIndex +1; x<= ROWS; x++) {Color c = isBlack? Color.black: Color.white; if(getChess(x, yIndex, c)!= null){ continueCount++;}else break; }if(continueCount>= 5){ return true;}else continueCount = 1;// 继续另一种情况的搜索: 纵向 // 纵向向上寻找for (int y=yIndex - 1; y>= 0; y--) {Color c = isBlack? Color.black: Color.white;if(getChess(xIndex, y, c) != null){continueCount++; }else break;} // 纵向向下寻找for (int y=yIndex +1; y<= ROWS; y++) { Color c = isBlack? Color.black: Color.white; if(getChess(xIndex, y, c) != null){continueCount++;}else break; } if(continueCount>= 5){return true;}else continueCount = 1;//继续另一种情况的搜索: 纵向 // 纵向向上寻找for (int y=yIndex - 1; y>= 0; y--) { Color c = isBlack? Color.black: Color.white;if(getChess(xIndex, y, c) != null){ continueCount++; }else break;} // 纵向向下寻找 for (int y=yIndex +1; y<= ROWS; y++) { Color c = isBlack? Color.black: Color.white;if(getChess(xIndex, y, c) != null){continueCount++; }else break;} if(continueCount>= 5){ return true; }else continueCount = 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++; }else break; } // 左下寻找 for (int x=xIndex - 1, y=yIndex +1; y<= ROWS &&x>= 0; x--, y++) { Color c = isBlack? Color.black: Color.white; if(getChess(x, y, c) != null) { continueCount++; }else break;}if(continueCount>= 5){ return true; }else continueCount = 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++;}else break;}       // 右下寻找for (int x=xIndex +1, y= yIndex+ 1; y<= ROWS &&x<= COLS; x++, y++){ Color c = isBlack? Color.black: Color.white;if(getChess(x, y, c) != null) { continueCount++;}else break;} if(continueCount>= 5){ return true;}else continueCount = 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< chessList.length; i++) chessList[i]= null; isBlack= true; gameOver= false;//游戏是否结束 chessCount= 0; // 当前棋盘的棋子个数 repaint();
}
// 悔棋
public void goback() {
if(chessCount == 0)return;
chessList[chessCount - 1]= null; chessCount--;
if(chessCount > 0){ xIndex= chessList[chessCount - 1].getX(); yIndex= chessList[chessCount - 1].getY();}
isBlack= !isBlack; repaint();
}
// Dimension: 矩形
public Dimension getPreferredSize(){return new Dimension(MARGIN *2+GRID_SPAN*COLS, MARGIN *2 + GRID_SPAN*ROWS); }
}

效果图


大家自己去试一下吧

简易版双人对战五子棋相关推荐

  1. 400行代码实现双人对战五子棋(适合新手入门)

    400行代码实现双人对战五子棋(适合新手入门) 跟上一篇博客一样,都是看了慕课网的视频之后写的学习记录,记录一下实现的思路,大部分内容比较简单,但也从中学到了很多东西. 按惯例首先看一下效果:(素材都 ...

  2. java双人对战五子棋(socket通信)

    学习java的时候一直想要做出一个像样的小游戏,所以就动手做了一个远程联网对战的java五子棋小游戏.这个程序我前前后后也是改动了几次,这次发出来的是最终版本了,虽然还是有很多不足,但本人已经没有精力 ...

  3. Java简易版的对战小游戏(主题是三国类游戏对战)

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 提示:今天写一个简易版的Java对战小游戏(主题是三国类游戏对战): 需要先写一个Person类(代表人),然后写一个 ...

  4. C语言实现双人对战五子棋游戏

    在编写五子棋游戏前首先对整个项目进行分析: 1.五子棋的界面绘制及显示 2.对输入的数据进行写入 3.判断输入的数据多对应的位置上是否可以下棋其中包括检测此位置是否为空及是否超出下棋的有效位置(越界超 ...

  5. 五子棋双人c语言程序,tc 版双人对战的五子棋

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 map[i][j]=0; cleardevice(); setbkcolor(13); setcolor(1); setfillstyle(1,2); s ...

  6. c语言五子棋双人对战,tc 版双人对战的五子棋

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 map[i][j]=0; cleardevice(); setbkcolor(13); setcolor(1); setfillstyle(1,2); s ...

  7. C#版网络对战五子棋以及Socket通信

    前言     这个网络版五子棋游戏是今年四月初写的.当时觉得自己应该学一些网络编程的东西.而我课程设计的题目已经定了---做一个Everything. 那就帮我斐哥做个网络版的五子棋吧. 源码:htt ...

  8. Proteus 8.1 51单片机仿真双人对战五子棋

    硬件需求: 内存需求较大,51单片机无法满足,因此需要扩展内存 Proteus需添加240X320的彩色液晶 实现功能如下: 1.通过按键选择下棋位置 2.无限悔棋 3.重新开始 黑白双方循环落子,黑 ...

  9. JAVA单机五子棋小游戏(双人对战版)

    此代码为简单双人对战五子棋程序,不涉及算法游戏策略. 具有轮流出手,判断输赢,判断输入是否合法功能. 运行效果如图: import java.io.*; public class Gobang {// ...

  10. 一小时学会C++开发双人对战版五子棋游戏,小白看完也能自己写游戏啦!

    VC++ 双人对战的五子棋游戏 界面新颖附源码,VC.NET源码项目,五子棋-UI美化实例源码.看一看截图吧,是不是看上去很有感觉的五子棋. 程序流程图: 游戏界面如下: 项目结构展示: 部分源码展示 ...

最新文章

  1. 随机选取字母c语言,菜鸟求助,写一个随机输出26个英文字母的程序
  2. Python——基础篇
  3. Web开发中8个基础常见功能
  4. 【电路补习笔记】5、三极管的参数与选型
  5. Spring.NET 中的 ADO.NET 数据访问的示例
  6. 美国国家安全原因致金沙江暂停收购飞利浦LED
  7. TypeScript学习(八):数组的补充及内置对象说明
  8. qscoj:喵哈哈村的卢西奥
  9. Unix/Mac系统下的文件在Windows里打开的话,所有文字会变成一行——怎么将Unix/Mac系统下的文件转换到Windows系统下
  10. 可以用树结构表达版本号
  11. 华为交换机学习指南基于子网划分划分vlan
  12. html head标签详解
  13. quoted-printable解码程序
  14. SAP系统管理的常用T-CODE
  15. 【渝粤教育】 国家开放大学2020年春季 1308外国文学专题 参考试题
  16. 漫威11年 历史阶段
  17. 洛谷 P1719 最大加权矩形 动态规划
  18. 鱼眼相机去畸变 Python/C++实现
  19. 病毒对信息社会的巨大影响
  20. 树莓派3B使用问题#1 关于3.5mm AV接口的问题

热门文章

  1. 树莓派用python一键签到百度贴吧
  2. 如何访问仅限IPv6的网站
  3. everest任务栏设置
  4. deepin/ubuntu 惠普星14 锐龙版本 安装RTL8821CE 无线网卡驱动
  5. dm数据库 linux版下载,达梦(DM)数据库Linux部署安装
  6. Android混淆使用详解
  7. iphone12屏幕尺寸
  8. 常大宿舍路由器安装教程
  9. 射手播放器的 clientkey
  10. 2020-12-25