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!
以上是 java实现单机版五子棋小游戏 的全部内容, 来源链接: utcz.com/z/354475.html