简单的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!
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持自学编程网。
- 本文固定链接: https://zxbcw.cn/post/202958/
- 转载请注明:必须在正文中标注并保留原文链接
- QQ群: PHP高手阵营官方总群(344148542)
- QQ群: Yii2.0开发(304864863)