Java怎么实现简易五子棋小游戏
发表于:2024-09-21 作者:千家信息网编辑
千家信息网最后更新 2024年09月21日,这篇文章主要介绍"Java怎么实现简易五子棋小游戏",在日常操作中,相信很多人在Java怎么实现简易五子棋小游戏问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答"Java怎
千家信息网最后更新 2024年09月21日Java怎么实现简易五子棋小游戏
这篇文章主要介绍"Java怎么实现简易五子棋小游戏",在日常操作中,相信很多人在Java怎么实现简易五子棋小游戏问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答"Java怎么实现简易五子棋小游戏"的疑惑有所帮助!接下来,请跟着小编一起来学习吧!
一、实践目标:
1.掌握JavaGUI界面设计
2.掌握鼠标事件的监听(MouseListener,MouseMotionListener)
二、实践内容:
设计一个简单的五子棋程序,能够实现五子棋下棋过程。如下图所示
五子棋运行界面
1.五子棋棋盘类
package cn.edu.ouc.fiveChess; import java.awt.Color;import java.awt.Cursor;import java.awt.Dimension;import java.awt.Graphics;import java.awt.Graphics2D;import java.awt.Image;import java.awt.RadialGradientPaint;import java.awt.RenderingHints;import java.awt.Toolkit;import java.awt.event.MouseEvent;import java.awt.event.MouseListener;import java.awt.event.MouseMotionListener;import java.awt.geom.Ellipse2D; import javax.swing.*;/** * 五子棋--棋盘类 */ 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)];//初始每个数组元素为null boolean isBlack=true;//默认开始是黑棋先 boolean gameOver=false;//游戏是否结束 int chessCount;//当前棋盘棋子的个数 int xIndex,yIndex;//当前刚下棋子的索引 Image img; Image shadows; Color colortemp; public ChessBoard(){ // setBackground(Color.blue);//设置背景色为橘黄色 img=Toolkit.getDefaultToolkit().getImage("board.jpg"); shadows=Toolkit.getDefaultToolkit().getImage("shadows.jpg"); 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<0||x1>ROWS||y1<0||y1>COLS||gameOver||findChess(x1,y1)) setCursor(new Cursor(Cursor.DEFAULT_CURSOR)); //设置成默认状态 else setCursor(new Cursor(Cursor.HAND_CURSOR)); } }); } //绘制 public void paintComponent(Graphics g){ super.paintComponent(g);//画棋盘 int imgWidth= img.getWidth(this); int imgHeight=img.getHeight(this);//获得图片的宽度与高度 int FWidth=getWidth(); int FHeight=getHeight();//获得窗口的宽度与高度 int x=(FWidth-imgWidth)/2; int y=(FHeight-imgHeight)/2; g.drawImage(img, x, y, null); 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;iROWS||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<=COLS;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 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;x>=0&&y<=ROWS;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;x>=0&&y>=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;x<=COLS&&y<=ROWS;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 p:chessList){ if(p!=null&&p.getX()==xIndex&&p.getY()==yIndex &&p.getColor()==color) return p; } return null; } public void restartGame(){ //清除棋子 for(int i=0;i 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); } }
2.棋子类
package cn.edu.ouc.fiveChess; 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(){ return y; } public Color getColor(){//获得棋子的颜色 return color; }}
3.五子棋主框架类
package cn.edu.ouc.fiveChess;import java.awt.event.*;import java.awt.*; import javax.swing.*;/* 五子棋主框架類,程序啟動類 */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(); Container contentPane=getContentPane(); contentPane.add(chessBoard); chessBoard.setOpaque(true); //创建和添加菜单 menuBar =new JMenuBar();//初始化菜单栏 sysMenu=new JMenu("系统");//初始化菜单 //初始化菜单项 startMenuItem=new JMenuItem("重新开始"); exitMenuItem =new JMenuItem("退出"); backMenuItem =new JMenuItem("悔棋"); //将三个菜单项添加到菜单上 sysMenu.add(startMenuItem); sysMenu.add(exitMenuItem); sysMenu.add(backMenuItem); //初始化按钮事件监听器内部类 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("重新开始"); exitButton=new JButton("退出"); backButton=new JButton("悔棋"); //将工具面板按钮用FlowLayout布局 toolbar.setLayout(new FlowLayout(FlowLayout.LEFT)); //将三个按钮添加到工具面板 toolbar.add(startButton); toolbar.add(exitButton); toolbar.add(backButton); //将三个按钮注册监听事件 startButton.addActionListener(lis); exitButton.addActionListener(lis); backButton.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);//显示主框架 }}
到此,关于"Java怎么实现简易五子棋小游戏"的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注网站,小编会继续努力为大家带来更多实用的文章!
棋子
五子棋
五子
棋盘
菜单
鼠标
索引
事件
按钮
三个
组件
面板
小游戏
简易
位置
工具
时调
框架
界面
网格
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
浙江京科通达网络技术
广东省网络安全公司
残疾人视频软件开发
数据库课后习题
c 重复计算多条数据库
淘宝订单数据库在哪里看
管理的服务器软件有哪些功能
ebay为什么卖服务器
网络安全海报素材图
es管理器服务器未开启
搜数据库题怎么搜最全面
数据库怎么看密码掩码
p2p软件开发
2020年网络技术热点
数据库逻辑删物理删
网络技术作业答案
计算机软件开发技术基础
深圳蜂投网络技术
微信群服务器有记录吗
镇平定制软件开发公司
网络安全工程师试题
党建研究数据库
墨尔本网络安全硕士
水果捞数据库安装
山东二五六互联网络科技有限公司
崇明区网络技术厂家批发价
超星数据库撤稿之后会怎样
网络安全教育讲话稿
人民币实际有效汇率数据库
成都net软件开发定制费用