做一个简单的java小游戏–单机版五子棋

学了java有一段时间了,今天就来搞一个简单的单机版五子棋游戏。

实现功能:那必须能进行基础的输赢判断。还有重新开始的功能,悔棋的功能,先手设置的功能和退出的功能。在右上角能够显示目前轮到哪个棋种下棋。右下角还有一个记录信息框,记录行为,当信息量过多时,可以清除信息内容。

成果:
初始界面:

游戏(获胜)界面:

附上代码:
Chessframe.java

package firstgobang;import javax.swing.JFrame;
import javax.swing.WindowConstants;public class ChessFrame extends JFrame{public ChessBoard chessboard;public ChessFrame(String title){setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);setTitle(title);setVisible(true);setLocationRelativeTo(null);chessboard = new ChessBoard();add(chessboard);pack();}public static void main(String[] args) {ChessFrame chessframe = new ChessFrame("单机版五子棋游戏");}
}

ChessBoard.java

package firstgobang;import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.Random;
import java.util.Stack;
import javax.swing.*;public class ChessBoard extends JComponent{/**board为1时是白棋,为2时是黑棋,为0时是空*whitenow为true时,到白棋下,为false时,到黑棋下*empty为true时,该位置为空,为false,该位置不为空*win为true,某方胜利,为false,无胜利*information用来储存消息*/public static int x_start = 30;public static int y_start = 60;public static int size = 30;public static int radius = 10;private int[][] board = new int[19][19];private boolean whitenow = false;private boolean empty = true;private boolean win = false;  private JTextArea area;private String information="";private static Stack<Chess> chessstack;  //栈class Chess{  //棋类,用于储存棋子的x,y坐标int x;int y;public Chess(int x,int y) {this.x=x;this.y=y;}}public ChessBoard() {chessstack = new Stack<>();area = new JTextArea(5,5);JButton button1 = new JButton("重新开始");JButton button2 = new JButton("悔棋");JButton button3 = new JButton("退出");JButton button4 = new JButton("先手设置");JButton button5 = new JButton("清空消息");JPanel panel = new JPanel();JScrollPane js = new JScrollPane();button1.setBounds(620,60,100,30);button2.setBounds(620,110,100,30);button3.setBounds(620,160,100,30);button4.setBounds(620,210,100,30);button5.setBounds(620,260,100,30);panel.setBounds(600,310,140,300);js.setBounds(600,310,140,300);panel.setLayout(new BorderLayout());add(button1);add(button2);add(button3);add(button4);add(button5);panel.add(area);js.getViewport().add(panel);js.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);add(js);button1.addMouseListener(new b1Action());button2.addMouseListener(new b2Action());button3.addMouseListener(new b3Action());button4.addMouseListener(new b4Action());button5.addMouseListener(new b5Action());addMouseListener(new theMouseListener());}public void paint(Graphics g) {super.paint(g);g.setColor(Color.orange);g.fillRect(x_start-size/2,y_start-size/2, size*19, size*19);g.setColor(Color.black);// 横for (int i = 0; i < 19; i++) {g.drawLine(x_start, y_start + i * size, x_start+18*size, y_start + i * size);g.drawString(((Integer)i).toString(),x_start/2-radius,y_start + i * size);}// 竖for (int i = 0; i < 19; i++) {g.drawLine(x_start + i * size, y_start, x_start + i * size, y_start+18*size);g.drawString(((Integer)i).toString(),x_start + i * size,y_start/2+radius);}for (int i = 0; i < 19; i++) {for (int j = 0; j < 19; j++) {if (board[i][j] == 1) {g.setColor(Color.white);g.fillOval(x_start-radius + i * size, y_start-radius + j * size, radius*2,radius*2);g.setColor(Color.black);g.drawOval(x_start-radius + i * size, y_start-radius + j * size, radius*2,radius*2);}if (board[i][j] == 2) {g.setColor(Color.black);g.fillOval(x_start-radius + i * size, y_start-radius + j * size, radius*2,radius*2);}}}g.setFont(new Font("微软雅黑",Font.BOLD,15));g.drawString("现在轮到", 600, 35);if(whitenow==true) {g.setColor(Color.white);g.fillOval(680, 20, 20,20);g.setColor(Color.black);g.drawOval(680, 20, 20,20);}if(whitenow==false) {g.setColor(Color.black);g.fillOval(680, 20, 20,20);}}public Dimension getPreferredSize() {return new Dimension(750,650);}public class theMouseListener implements MouseListener{  //下棋public void mouseClicked(MouseEvent e) {}public void mousePressed(MouseEvent e) {   int x=getx(e.getX());int y=gety(e.getY());try {if(board[x][y] !=0)empty = false;} catch (Exception e1) {}if (e.getX() > x_start-size/2 && e.getX() < x_start+size/2+18*size && e.getY() > y_start-size/2 && e.getY() < y_start+size/2+18*size) {if(empty == true) {Chess chess = new Chess(x,y);chessstack.push(chess);if (whitenow == true) {writeinformation("白棋下了"+"("+x+","+y+")"+"的位置");board[x][y]=1;repaint();}if (whitenow == false){writeinformation("黑棋下了"+"("+x+","+y+")"+"的位置");board[x][y]=2;repaint();}iswin(whitenow,x,y);if(win==true) {if(whitenow==true) {writeinformation("白棋获胜!");JOptionPane.showInternalMessageDialog(null, "白棋获胜","提示框", JOptionPane.INFORMATION_MESSAGE); }else {writeinformation("黑棋获胜!");JOptionPane.showInternalMessageDialog(null, "黑棋获胜","提示框", JOptionPane.INFORMATION_MESSAGE); }}if(chessstack.size()==361) {writeinformation("和局");JOptionPane.showInternalMessageDialog(null, "和局","提示框", JOptionPane.INFORMATION_MESSAGE);}whitenow=!whitenow;}else {JOptionPane.showInternalMessageDialog(null, "该位置已有棋子!","提示框", JOptionPane.INFORMATION_MESSAGE); empty=true;}}      }public void mouseReleased(MouseEvent e) {      }public void mouseEntered(MouseEvent e) {       }public void mouseExited(MouseEvent e) {}   }class b1Action implements MouseListener{   //重新开始按钮public void mouseClicked(MouseEvent e) {int a = JOptionPane.showConfirmDialog(null,"你确定重新开始?", "提示框", JOptionPane.YES_NO_OPTION); if(a==0) cleanstart();}public void mousePressed(MouseEvent e) {}public void mouseReleased(MouseEvent e) {}public void mouseEntered(MouseEvent e) {}public void mouseExited(MouseEvent e) {}}class b2Action implements MouseListener{   //悔棋按钮public void mouseClicked(MouseEvent e) {int a = JOptionPane.showConfirmDialog(null,"你确定悔棋?", "提示框", JOptionPane.YES_NO_OPTION); if(a==0) {if(chessstack.size()>0) {Chess chess1 = chessstack.pop();if(whitenow)writeinformation("黑棋悔棋,坐标"+"("+chess1.x+","+chess1.y+")");if(!whitenow)writeinformation("白棋悔棋,坐标"+"("+chess1.x+","+chess1.y+")");board[chess1.x][chess1.y]=0;whitenow=!whitenow;repaint();}else {JOptionPane.showInternalMessageDialog(null, "不能在悔棋了!","提示框", JOptionPane.INFORMATION_MESSAGE); }}}public void mousePressed(MouseEvent e) {}public void mouseReleased(MouseEvent e) {}public void mouseEntered(MouseEvent e) {}public void mouseExited(MouseEvent e) {}}class b3Action implements MouseListener{   //退出按钮public void mouseClicked(MouseEvent e) {int a = JOptionPane.showConfirmDialog(null,"你确定退出游戏?", "提示框", JOptionPane.YES_NO_OPTION); if(a==0) {System.exit(0);}}public void mousePressed(MouseEvent e) {}public void mouseReleased(MouseEvent e) {}public void mouseEntered(MouseEvent e) {}public void mouseExited(MouseEvent e) {}}class b4Action implements MouseListener{   //先手设置按钮public void mouseClicked(MouseEvent e) {if(chessstack.size()==0) {Object[] possibleValues = { "白棋", "黑棋", "随机" };Object a = JOptionPane.showInputDialog(null,"选择先手的棋子", "提示框",JOptionPane.INFORMATION_MESSAGE, null,possibleValues, possibleValues[0]); if(a=="白棋") whitenow=true;if(a=="黑棋") whitenow=false;if(a=="随机") {Random random = new Random();int b =random.nextInt(2);if(b==0)whitenow=true;if(b==1)whitenow=false;}repaint();}else {JOptionPane.showInternalMessageDialog(null, "战局已经开始,不能设置","提示框", JOptionPane.INFORMATION_MESSAGE); }}public void mousePressed(MouseEvent e) {}public void mouseReleased(MouseEvent e) {}public void mouseEntered(MouseEvent e) {}public void mouseExited(MouseEvent e) {}}class b5Action implements MouseListener{   //清空消息按钮public void mouseClicked(MouseEvent e) {int a = JOptionPane.showConfirmDialog(null,"你确定清空所有消息?", "提示框", JOptionPane.YES_NO_OPTION); if(a==0) {information="";area.setText(information);}}public void mousePressed(MouseEvent e) {}public void mouseReleased(MouseEvent e) {}public void mouseEntered(MouseEvent e) {}public void mouseExited(MouseEvent e) {}}public void writeinformation(String infor){   //消息写入information +=infor+"\n";area.setText(information);}public boolean iswin(boolean whitenow,int startx,int starty) {   //胜利判断int color = whitenow?1:2;int count = 1;int x=1;int y=1;//横while((startx-x)>-1 && board[startx-x][starty]==color) {count++;x++;}x=y=1;while((startx+x)<19 && board[startx+x][starty]==color) {count++;x++;}if(count>=5) {return win = true;}count=x=y=1;//竖while((starty-y)>-1 && board[startx][starty-y]==color) {count++;y++;}x=y=1;while((starty+y)<19 && board[startx][starty+y]==color) {count++;y++;}if(count>=5) {return win = true;}count=x=y=1;//45右斜while((startx+x)<19 && (starty-y)>-1 && board[startx+x][starty-y]==color) {count++;x++;y++;}x=y=1;while((startx-x)>-1 && (starty+y)<19 && board[startx-x][starty+y]==color) {count++;x++;y++;}if(count>=5) {return win = true;}count=x=y=1;//135左斜while((startx-x)>0 && (starty-y)>0 && board[startx-x][starty-y]==color) {count++;x++;y++;}x=y=1;while((startx+x)<19 && (starty+y)<19 && board[startx+x][starty+y]==color) {count++;x++;y++;}if(count>=5) {return win = true;}return false;}private void cleanstart() {  //清理棋盘for(int i=0;i<19;i++) {for(int j=0;j<19;j++) {board[i][j]=0;}}win=false;chessstack.clear();writeinformation("重新开始战局!");repaint();}private int getx(int x) {  //x归位x -=x_start;if(x%size<(size/2)) {return x/size;}else {return x/size+1;}}private int gety(int y) {  //y归位y -=y_start;if(y%size<(size/2)) {return y/size;}else {return y/size+1;}}
}

End!

做一个简单的java小游戏--单机版五子棋相关推荐

  1. 做一个简单的java小游戏--贪吃蛇

    做一个简单的java小游戏–贪吃蛇 贪吃蛇游戏博客链接:(方法一样,语言不一样) c++贪吃蛇:https://blog.csdn.net/weixin_46791942/article/detail ...

  2. 用pygame做一个简单的python小游戏---贪吃蛇

    用pygame做一个简单的python小游戏-贪吃蛇 贪吃蛇游戏博客链接:(方法一样,语言不一样) c++贪吃蛇:https://blog.csdn.net/weixin_46791942/artic ...

  3. 用pygame做一个简单的python小游戏---七彩同心圆

    用pygame做一个简单的python小游戏-七彩同心圆 这个小游戏原是我同学python课的课后作业,并不是很难,就简单实现了一下,顺便加强一下pygame库的学习. 玩法:每次点击鼠标时,会以鼠标 ...

  4. 用pygame做一个简单的python小游戏---生命游戏

    用pygame做一个简单的python小游戏-生命游戏 生命游戏(Game of Life) 生命游戏(Game of Life)是剑桥大学约翰·何顿·康威(John Horton Conway)教授 ...

  5. python七彩同心圆_用pygame做一个简单的python小游戏---七彩同心圆

    用pygame做一个简单的python小游戏---七彩同心圆 用pygame做一个简单的python小游戏-七彩同心圆 这个小游戏原是我同学python课的课后作业,并不是很难,就简单实现了一下,顺便 ...

  6. 用所学JS的知识做一个简单的坦克小游戏

    代码如下: <!DOCTYPE html> <html lang="en"> <head><meta charset="UTF- ...

  7. 《游戏学习》教你上手一个简单的java小游戏《打纸飞机》附源码

    源码下载地址: https://download.csdn.net/download/weixin_40986713/20701376 项目结构目录 部分代码展示 import java.awt.Fo ...

  8. 用python做一个简单的猜拳小游戏

    首先要对random这个模块有所了解,其次再使用if条件语句.下面我们来看下这几行代码的思路 利用random可以生成随机的数字,与玩家所输入的数字进行对比,在多个if条件语句的帮助下,从而做到对输赢 ...

  9. 【鸿蒙】 使用定时器做一个简单的抢红包小游戏

    1.新建项目 2. 添加 计时器,按钮组件 <?xml version="1.0" encoding="utf-8"?> <Direction ...

最新文章

  1. Blender2.9全流程创建逼真未来科幻蝙蝠汽车视频教程
  2. 数字图像处理实验(3):PROJECT 02-03, Zooming and Shrinking Images by Pixel Replication
  3. 放在每个定义前的html语言,html基础
  4. 【Java学习笔记之十五】Java中的static关键字解析
  5. 物理层、数据链路层网络设备工作原理
  6. Dos下命令运行带有包名的Java类
  7. 论文浅尝 | 基于置信度的知识图谱表示学习框架
  8. 开关怎么使用_水龙头漏水怎么办?使用时把控开关力度很重要
  9. “年薪25万只是白菜价”已成过去式,AI 岗位年薪下降8.9%!
  10. 又一版A+B [2008年浙江大学计算机及软件工程研究生机试真题]
  11. 任何人都可以胜任全栈开发?
  12. go导出mysql中的excel表,MySQL导出数据,并转存到Excel表格中
  13. 数据库系统基础教程一:关系数据库与关系代数
  14. 平衡二叉树详解 通俗易懂
  15. 高德地图SDK 配置key
  16. 基于MATLAB与Python计算长时间遥感栅格图像的像元值变异系数(CV)
  17. unity3d 压缩文件夹和压缩文件
  18. softmax回归从零开始实现
  19. (附源码)计算机毕业设计SSM基于的校园卡管理系统
  20. Unity使用c#开发遇上的问题(六)(3dmax围绕指定中心旋转,unity中动态调用预制体并根据模型旋转指定角度)

热门文章

  1. 长时间戴耳机耳朵不舒服?骨传导耳机可以缓解这个问题
  2. 最新重复名一键生成iApp安卓源码
  3. java Char与char_JAVAc++中char和char[]的区别
  4. u盘运行android86,U盘运行Android系统制作教程
  5. 宸展光电拟与宸鸿科技集团合资;Tableau承诺未来五年培养1000万名数据学员 | 全球TMT...
  6. 公司年会抽奖软件,提供MFC源代码下载
  7. 【蘑菇街裁员回应】覆巢之下无完卵
  8. 一分钟看懂 python继承 (面试题) 万变不离其宗
  9. mysql查看密码_如何查看mysql数据库用户密码?
  10. 华为OD机试 - 天然蓄水库(Java JS Python)