Java实现五子棋游戏单机版(1.0)
本文实例为大家分享了Java实现五子棋游戏单机版的具体代码,供大家参考,具体内容如下
简介
这个程序实现了单机版五子棋,目前无法联机,只能自己跟自己下。
棋盘是20*20的。
主要功能:下棋、认输、悔棋、重新开始、退出等功能
PS:目前设置只有显示游戏规则。
截图
【Java实现五子棋游戏单机版(1.0)】
文章图片
文章图片
文章图片
完整代码
package Gobang; import javax.swing.*; import java.awt.*; import java.awt.event.*; import java.awt.image.*; //import java.applet.*; //import java.net.*; //import java.io.*; //import javax.imageio.*; public class Frameextends JFrame implements MouseListener,ActionListener{//JFrame的扩展类private static final long serialVersionUID = 1L; JPanel panel1; //用于安放按钮;JButton RestartButton,SetButton,AdmitDefeatButton,RegretButton,ExitButton; //五个按钮,各有其功能。Graphics g; //画笔BufferedImage buf; int x; //鼠标的坐标int y; int[][] Chess = new int[20][20]; // 保存棋子,1表示黑子,2表示白子boolean IsBlack = true; //表示当前要下的是黑子还是白子,true表示黑子,false表示白子boolean IsFinish = false; //表示当前游戏是否结束int xRange; int yRange; int[] chessX = new int[400]; //用来保存从开始到当前的所有棋子,用于悔棋;int[] chessY = new int[400]; int countX = 0; int countY = 0; /*本来想用于播放背景音乐,但是没有成功,,,先暂时放弃//File f; //URI uri; //URL url; //@SuppressWarnings("deprecation")*///public Frame() {//设置标题、大小、排列方式等this.setTitle("五子棋"); this.setSize(500,550); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.setVisible(true); this.setLayout(null); //五个按钮:重新开始、设置、认输、悔棋、退出。RestartButton = new JButton("重新开始"); RestartButton.setSize(20,40); SetButton = new JButton("设置"); SetButton.setSize(20,40); AdmitDefeatButton = new JButton("认输"); AdmitDefeatButton.setSize(20,40); RegretButton = new JButton("悔棋" ); RegretButton.setSize(20,40); ExitButton = new JButton("退出"); ExitButton.setSize(20,40); //五个按钮添加到中间容器;panel1 = new JPanel(); panel1.setBorder(BorderFactory.createLoweredBevelBorder()); //设置边框panel1.setLayout(new GridLayout(1,5)); panel1.add(RestartButton); panel1.add(SetButton); panel1.add(AdmitDefeatButton); panel1.add(RegretButton); panel1.add(ExitButton); this.add(panel1); panel1.setSize(460,20); panel1.setLocation(0, 460); this.repaint(); //表示重新绘制画布,可以自动调用paint函数;//本类作为监听类,包括鼠标监听和按钮动作监听;this.addMouseListener(this); RestartButton.addActionListener(this); SetButton.addActionListener(this); AdmitDefeatButton.addActionListener(this); RegretButton.addActionListener(this); ExitButton.addActionListener(this); /*音频播放部分try {f = new File(""); uri = f.toURI(); url = uri.toURL(); AudioClip aau; aau = Applet.newAudioClip(url); aau.loop(); //循环播放} catch (Exception e){e.printStackTrace(); }*/}//画布绘制public void paint(Graphics g){if(g == null)//如果第一次绘制,新建一个图片,并且创建画布。{buf = new BufferedImage(450, 450, BufferedImage.TYPE_INT_RGB); g =buf.createGraphics(); }if(g != null)//{super.paint(g); //表示在原来图像的基础上,再画图g.setColor(new Color(249,205,173)); //画笔颜色调成褐色;g.fill3DRect(20, 40, 400, 400,true); //用画笔画一个边长为400的正方形;边距为20,40for(int i = 0; i <= 20; i++)//用画笔横竖各画19条线{g.setColor(Color.BLACK); //画笔颜色调为黑色;g.drawLine(20,40+i*20,420,40+i*20); g.drawLine(20+i*20,40,20+i*20,440); }}for(int i=0; i<20; i++){for (int j = 0; j < 20; j++) {//画实心黑子,直径16if(Chess[i][j] == 1){int tempX = i*20+12; int tempY = j*20+32; g.setColor(Color.BLACK); g.fillOval(tempX, tempY, 16, 16); g.setColor(Color.BLACK); g.drawOval(tempX, tempY, 16, 16); }//画实心白子,直径16if(Chess[i][j] == 2){int tempX = i*20+12; int tempY = j*20+32; g.setColor(Color.WHITE); g.fillOval(tempX, tempY, 16, 16); g.setColor(Color.WHITE); g.drawOval(tempX, tempY, 16, 16); }}}g.drawImage(buf, 0, 0,this); }public void mousePressed(MouseEvent e) {// TODO Auto-generated method stubif(!IsFinish)//判断棋局是否结束{x = e.getX(); //获取当前鼠标点击位置y = e.getY(); if(x >= 20 && x < 420 && y >= 40 && y<= 440)//判断鼠标是否在棋局内{xRange = (x-20)%20; if(xRange > 10 && xRange < 20)//如果在交叉点的边长为10的范围内,就把棋子下在这;{x = (x - 20) / 20 + 1; }else{x = (x - 20) / 20; }yRange = (y-40)%20; if(yRange > 10 && yRange < 20){y = (y - 40) / 20 + 1; }else{y = (y - 40) / 20; }if(Chess[x][y] == 0)//如果该交叉点没有被下过;{chessX[countX++] = x; //存储当前棋子的位置;chessY[countY++] = y; if(IsBlack)//如果是黑子{Chess[x][y] = 1; IsBlack = false; }else{Chess[x][y] = 2; IsBlack = true; }this.repaint(); //重新绘制画布}if(this.isWin())//如果下棋之后赢了,弹出对话框{if(Chess[x][y] == 1){JOptionPane.showMessageDialog(this, "黑方胜利"); }else {JOptionPane.showMessageDialog(this, "白方胜利"); }this.IsFinish = true; //游戏结束}}}}public boolean isWin(){boolean flag = false; int count = 1; int color = Chess[x][y]; //判断横向是否有5个棋子相连count = this.checkCount(1,0,color); if(count >= 5){flag = true; }else {//判断纵向count = this.checkCount(0,1,color); if(count >= 5){flag = true; }else {//判断右上,左下count = this.checkCount(1,-1,color); if(count >= 5){flag = true; }else {//判断右下,左上count = this.checkCount(1,1,color); if(count >= 5){flag =true; }}}}return flag; }// 检查棋盘中的五子棋是否连成五子,xChange,yChange为相对于当前棋子位置的变化量public int checkCount(int xChange , int yChange ,int color){int count = 1; //统计总共有几个连着的棋子;int tempX = xChange; int tempy = yChange; //判断棋子右边有没有相同颜色的棋子;while(x + xChange >=0 && x+xChange <20&& y+yChange >=0 && y+yChange < 20 && color == Chess[x+xChange][y+yChange]){count++; //如果有,棋子数加一if(xChange != 0)xChange++; //如果横向方向变化,x相对位置加一if(yChange != 0 ){if(yChange != 0){if(yChange > 0)//如果纵向方向增加,y相对位置加一{yChange++; }else//如果纵向方向减小,y相对位置减一{yChange--; }}}}xChange = tempX; yChange = tempy; //判断棋子左边有没有相同颜色的棋子;while(x-xChange >=0 && x-xChange <20 && y-yChange >=0 &&y-yChange <20 && color == Chess[x-xChange][y-yChange]){count++; if(xChange != 0){xChange++; }if(yChange != 0){if (yChange > 0) {yChange++; }else {yChange--; }}}return count; }//监听动作函数public void actionPerformed(ActionEvent e) {// TODO Auto-generated method stubif(e.getSource() == RestartButton)//如果点击的按钮是RestartButton,清空画板,还原设置{if(JOptionPane.showConfirmDialog(this, "Do you want to restart the game?") == 0){for (int i = 0; i < 15; i++) {for (int j = 0; j < 15; j++) {Chess[i][j] = 0; //清空棋盘的棋子}}//清空下棋棋子坐标的记录for (int i = 0; i < 15; i++){chessX[i] = 0; chessY[i] = 0; }countX =0; countY =0; IsBlack = true; IsFinish = false; this.repaint(); }}if(e.getSource() == AdmitDefeatButton)//如果点击的按钮是AdmitDefeatButton,结束游戏,并提示{if(!IsFinish)//判断棋局是否结束{if(JOptionPane.showConfirmDialog(this, "Are you sure you want to give up?") == 0){if(IsBlack == true){JOptionPane.showMessageDialog(this,"白方获胜"); }else{JOptionPane.showMessageDialog(this,"黑方获胜"); }IsFinish = true; }}}if(e.getSource() == ExitButton)//如果点击的按钮是ExitButton,退出程序{if(JOptionPane.showConfirmDialog(this, "Do you want to exit?") == 0){System.exit(0); }}if(e.getSource() == RegretButton)///如果点击的按钮是RegretButton,悔棋一步{if(!IsFinish)//判断棋局是否结束{if(IsBlack == true)//如果现在是黑子要下,表示悔棋的是白子{if(JOptionPane.showConfirmDialog(this, "The white want to regret,do you agree?") == 0){int tempX = chessX[--countX]; //获取上一步白子下的位置;int tempY = chessY[--countY]; Chess[tempX][tempY] = 0; //撤回白子IsBlack = false; //当前要下的变为白方}}else{if(JOptionPane.showConfirmDialog(this, "The black want to regret,do you agree?") == 0){int tempX = chessX[--countX]; int tempY = chessY[--countY]; Chess[tempX][tempY] = 0; IsBlack = true; }}this.repaint(); //重新绘制画布}}if(e.getSource() == SetButton)//设置按钮,现在只显示游戏规则{JDialog frame1 = new JDialog(); //新建对话框frame1.setBounds(//设置对话框边界new Rectangle(0,260, 600, 200)); JTextField tf = new JTextField(); //新建文本框frame1.setTitle("Play Rule"); frame1.getContentPane().add(tf); //添加文本框tf.setText("The two sides use black and white pieces respectively.\n At the intersection of the straight line and horizontal line of the chessboard, \nthe one who forms a five piece line first wins."); frame1.setModalityType(Dialog.ModalityType.APPLICATION_MODAL); // 设置模式类型frame1.setVisible(true); }}public static void main(String[] args) {new Frame(); }@Overridepublic void mouseClicked(MouseEvent e) {// TODO Auto-generated method stub}@Overridepublic void mouseReleased(MouseEvent e) {// TODO Auto-generated method stub}@Overridepublic void mouseEntered(MouseEvent e) {// TODO Auto-generated method stub}@Overridepublic void mouseExited(MouseEvent e) {// TODO Auto-generated method stub}}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。
推荐阅读
- vue实现按钮的长按功能
- JavaScript错误处理try..catch...finally,涵盖throw,TypeError,RangeError#yyds干货盘点#
- #私藏项目实操分享#Python模拟登录,selenium模块,Python识别图形验证码实现自动登录
- #yyds干货盘点# springboot实现文件上传
- java基础|Intellij IDEA 神级插件——效率提升 10 倍
- #私藏项目实操分享#iOS开发(实现点击常用控件弹出地区选择框(万能方法))
- Java&Go三种HTTP服务端端性能测试#yyds干货盘点#
- PassJava 开源 ( Spring Cloud 整合Gateway网关 #私藏项目实操分享#)
- DevTools 实现原理与性能分析实战
- #yyds干货盘点#Java双刃剑之Unsafe类详解