java实现单机版五子棋小游戏

简单的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!

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • java实现五子棋小游戏

    java实现五子棋小游戏 package Gomoku; import java.awt.Toolkit; import javax.swing.JFrame; public class GomokuFrame extends JFrame { //定义一个操作面板 OperatorPane op=null; public GomokuFrame() { //设置名称 this.setTitle("五子棋"); //设置窗口大小 this.setSize(510,510); //设置窗

  • java实现单人版五子棋游戏

    本文实例讲述了java实现的五子棋游戏代码,分享给大家供大家参考,具体代码如下 package gyb.exam; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Dimension; import java.awt.Font; import java.awt.Graphics; import java.awt.Point; import java.awt.Toolkit; import java.awt.

  • Java实现两人五子棋游戏(二) 画出棋盘

    本文为大家分享了java画出五子棋游戏棋盘的方法,供大家参考,具体内容如下 棋盘模块: 画五子棋棋盘:19条横线.19条竖线 步骤一:显示棋盘 我有一张名为chessboard.png的棋盘,位置为根目录/res/drawable/chessboard/png,现在我要显示这张图片. DrawChessBoard.java package xchen.test.simpleGobang; import java.awt.Graphics; import java.awt.Image; impor

  • Java实现两人五子棋游戏(三) 画出棋子

    上一篇文章讲的是Java实现两人五子棋游戏(二) 画出棋盘,已经画好棋盘,接下来要实现控制功能,主要功能: 1)选择棋子 2)画棋子 3)判断胜负 4)交换行棋方 先实现画棋子PART -------------画棋子代码示例如下-------------- 首先,定义一个棋子类,这个类有两个属性,棋子颜色(0-表示黑色,1-表示白色),是否落子(我计划用一个二维数组才存储棋子的落子信息) Chessman.java package xchen.test.simpleGobang; public

  • Java实现五子棋AI算法

    五子棋AI算法 也算是一个典型的游戏AI算法,一些棋类的AI算法都可以参考实现,下面是Java实现代码 棋盘抽象接口 import java.util.List; public interface IChessboard { //取得棋盘最大横坐标 public int getMaxX(); //最大纵坐标 public int getMaxY(); //取得当前所有空白点,这些点才可以下棋 public List<Point> getFreePoints(); } 棋子类实现 //棋子类 p

  • Java棋类游戏实践之单机版五子棋

    本文实例讲述了java实现的五子棋游戏代码,分享给大家供大家参考,具体代码如下 一.实践目标        1.掌握JavaGUI界面设计        2.掌握鼠标事件的监听(MouseListener,MouseMotionListener) 二.实践内容       设计一个简单的五子棋程序,能够实现五子棋下棋过程.如下图所示 1.五子棋棋盘类 package cn.edu.ouc.fiveChess; import java.awt.Color; import java.awt.Curs

  • Java编程实现五子棋人人对战代码示例

    利用Java,在控制台操作下,编写的五子棋,作为复习二维数组,面向对象等基础知识.w表示白棋,b表示黑棋 import java.util.Scanner; public class MainMethod { public static char[][] c = new char[10][10]; public static void main(String[] args) { MainMethod mainMethod = new MainMethod(); mainMethod.init()

  • java基于swing实现的五子棋游戏代码

    本文实例讲述了java基于swing实现的五子棋游戏代码.分享给大家供大家参考. 主要功能代码如下: 复制代码 代码如下: import java.awt.*; import javax.swing.*; import java.awt.event.*; public class Main extends JFrame implements ActionListener{         private static final long serialVersionUID = 1L;      

  • Java实现五子棋网络版

    本文实例为大家分享了Java实现五子棋网络版的具体代码,供大家参考,具体内容如下 需求分析: 对于网络五子棋而言,在普通五子棋的基础上需要添加以下功能: 1.拥有服务器端和客户端,用户通过客户端登录服务器后可与其他登录的用户进行对弈 2.服务器支持多组用户同时进行对弈 3.用户可以在服务器上创建新游戏或加入已创建的游戏 4.用户在下棋的时候可以进行聊天交流 由上可以知道需要实现的功能: ·提供服务器和客户端的功能 ·服务器将监听客户端的登录情况并允许多个客户端进行登录 ·用户通过客户端可以登录服

  • java实现单机版五子棋

    这个小游戏是我和我姐们儿的JAVA课程设计,也是我做的第一个JAVA项目,适合初学者,希望能帮到那些被JAVA课设所困扰的孩纸们~~~ 一.该游戏需要实现 1.设计主框架,界面. 2.利用ActionListener接口实现按钮事件的监听. 3.重新开始功能的实现. 4.悔棋功能的实现. 5.退出功能的实现. 6.棋盘中棋子点类的定义. 7.利用MouseListener接口实现事件监听,并实现接口里的所有方法. 8.当鼠标移动到棋盘上的交点上,且该点上无棋子时能够变成小手形状. 9.点击棋盘时

随机推荐