五子棋

来源:互联网 发布:淘宝网用户名怎么修改 编辑:程序博客网 时间:2024/04/30 15:19

JAVA小游戏:五子棋

五子棋的绘制较为简单,功能和界面可以通过四个类来实现:

FiveChess.class

LeftPanel.class

RightPanel.class

MainFrame.class

FiveChess类的主要功能就是作为一个主函数,用来实现MainFrame的调用;在MainFrame类创建左右面板和设置界面的大小、背景、默认关闭等属性。

//设置界面大小

setSize(600,480);

//设置界面打开位置

setLocationRelativeTo(null);

//设置不可缩放

setResizable(false);

//设置关闭

setDefaultCloseOperation(EXIT_ON_CLOSE);

五子棋的界面主要分为两个部分,左面板和右面板,左边用来绘制棋盘、右边用来添加”开始”,”悔棋”,”声音”,”关于”,”退出”五个按钮。

 

在左边面板定义了几个全局变量:

static boolean begin =false;//作为游戏开始标志

static List<Point>allcs =new ArrayList<Point>();//在悔棋操作中做中转

static boolean chessflag =false;//黑白棋转换标志

static int[][]allchess =new int[22][22];//棋子

MainFrame传到左面板中:

public LeftPanel(MainFramemf){

this.mf =mf; setBorder(BorderFactory.createBevelBorder(1,Color.WHITE,Color.GREEN));

addListener();//添加监听

}

左边LeftPanel中所有的方法:

public void addListener()//添加监听

protected boolean CheckWin(int xIndex,int yIndex)//判断输赢

public void paint(Graphicsg)//重写paint方法

private void DrawChessBoard(Graphicsg)//绘制棋盘

private void DrawChessPieces(Graphicsg)//绘制棋子

paint方法:

public void paint(Graphicsg){

super.paint(g);

DrawChessBoard(g);//绘制棋盘

DrawChessPieces(g);//绘制棋子

}

在addListener()中添加mouseClicked()监听,将棋子的监听和输赢监听添加到mouseClicked()里。

右边面板RightPanel里写的是按钮的监听:

start.addActionListener(ac);//开始监听

back.addActionListener(ac1);//悔棋监听

music.addActionListener(ac2);//音乐监听

about.addActionListener(ac3);//关于监听

exit.addActionListener(ac4);//退出监听

要注意的是,在右边面板用图片作为背景时,由于刚开始用的是paint(),导致打开时右边只显示第一个按钮,当移动到按钮位置时才显示出来,后来将paint()方法改为paintComponent()方法时,才显示所有按钮。这是因为paint()方法会致使组建发生冲突,用paintComponent()方法就没有这个问题了。

棋局开始时要点击开始按钮,直接点击棋盘时会有提示:

 

棋局开始时默认音乐是关闭的,需要时可以点击“打开音乐”按钮;“关于”中写的是游戏的规则。

当赢了的时候会有提示,会判断哪一方胜利:

 


 

大家玩的有人机,人人的也可以再添加一些方法,这里就没有写了。

人机的话相当于一个人工智能了,对于JAVA刚入门的同学会有点难,人人的还填加一个局域网就可以了。

下面给出具体代码:

FiveChess

package Date7_05;

 

import java.awt.Cursor;

 

public class FiveChess {

public static void main(String[]args){

MainFrame mf = new MainFrame();

mf.ShowUI();

mf.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));

}

}

MainFrame

package Date7_05;

 

import java.awt.BorderLayout;

 

import javax.swing.ImageIcon;

import javax.swing.JFrame;

 

@SuppressWarnings("serial")

public class MainFrameextends JFrame {

public void ShowUI(){

init();

//创建左边面板

addLeftPanel();

//创建右边面板

addRightPanel();

//设置可见

setVisible(true);

}

 

private void addLeftPanel() {

LeftPanel lp = new LeftPanel(this);

add(lp,BorderLayout.CENTER);

}

private void addRightPanel() {

RightPanel rp = new RightPanel(this);

add(rp,BorderLayout.EAST);

}

private void init() {

//设置名称

setTitle("MY FiveChess");

//添加图片

ImageIcon ii = new ImageIcon(getClass().getResource("/TU/IMG.jpg"));

setIconImage(ii.getImage());

//设置大小

setSize(600,480);

//设置位置

setLocationRelativeTo(null);

//设置不可缩放

setResizable(false);

//设置关闭

setDefaultCloseOperation(EXIT_ON_CLOSE);

}

}

LeftPanel :

package Date7_05;

 

import java.awt.Color;

import java.awt.Graphics;

import java.awt.Image;

import java.awt.Point;

import java.awt.Toolkit;

import java.awt.event.MouseAdapter;

import java.awt.event.MouseEvent;

import java.io.FileInputStream;

import java.util.ArrayList;

import java.util.List;

 

import javax.swing.BorderFactory;

import javax.swing.ImageIcon;

import javax.swing.JOptionPane;

import javax.swing.JPanel;

 

import javafx.scene.Cursor;

import sun.audio.AudioPlayer;

import sun.audio.AudioStream;

 

@SuppressWarnings("serial")

public class LeftPanel extends JPanel{

MainFrame mf;

static boolean begin = false;

static List<Point>allcs = new ArrayList<Point>();

static boolean chessflag = false;

static int[][]allchess = new int[22][22];

public LeftPanel(MainFrame mf){

this.mf = mf;

setBorder(BorderFactory.createBevelBorder(1,Color.WHITE,Color.GREEN));

addListener();

}

 

public void addListener() {

MouseAdapter ad=new MouseAdapter(){

//@SuppressWarnings("unused")

public void mouseClicked(MouseEvent e){

//获取当前所在位置

int x = e.getX()-20;

int y = e.getY()-20;

//确定在第几行第几列

int xIndex = x%20>10?x/20+1:x/20;

int yIndex = y%20>10?y/20+1:y/20;

if(begin == true){

//判断是否在棋盘范围内

if(xIndex>20||yIndex>20){

return;

}

//不能再同一个位置两次落子

if(allchess[xIndex][yIndex] == 0){

LuoziMusic();

if(chessflag){

//x = 2;

allchess[xIndex][yIndex] = 2;

}

else if(!chessflag){

//x=1;

allchess[xIndex][yIndex] = 1;

}

Point point = new Point(xIndex,yIndex);

allcs.add(point);

mf.repaint();

if(CheckWin(xIndex,yIndex)){

if(allchess[xIndex][yIndex]==1){

JOptionPane.showMessageDialog(mf,"白方胜利!");

}

else{

JOptionPane.showMessageDialog(mf,"黑方胜利!");

}

mf.repaint();

begin = false;

}

//轮换棋子颜色

chessflag = !chessflag;

}

}

else{

JOptionPane.showMessageDialog(mf, "请点击开始!");

}

}

private void LuoziMusic() {

try {

//文件流

FileInputStream fis = new FileInputStream("TU/xq.wav");

//音频流

AudioStream as = new AudioStream(fis);

AudioPlayer.player.start(as);

} catch (Exception e) {

    e.printStackTrace();

}

}

};

this.addMouseListener(ad);

this.addMouseMotionListener(ad);

}

 

protected boolean CheckWin(int xIndex, int yIndex) {

// TODO Auto-generated method stub

int[][][]XChange = {{{1,0},{-1,0}},{{0,1},{0,-1}},

{{1,1},{-1,-1}},{{1,-1},{-1,1}}};

int count = 1;

int current = allchess[xIndex][yIndex];

//临时循环变量

int tempXchange = xIndex;

int tempYchange = yIndex;

for(int i = 0;i<XChange.length;i++){

int[][]change = XChange[i];

for(int j = 0;j<change.length;j++){

 while(true){

 tempXchange = tempXchange + change[j][0];

 tempYchange = tempYchange + change[j][1];

if(tempXchange < 0||tempXchange >22||tempYchange < 0||tempYchange > 22)

 {

 break;

 }

 int value = allchess[tempXchange][tempYchange];

 

 //棋子颜色一致

 if(value == current){

 count++;

 }

 else{

 break;

 }

 }

 tempXchange = xIndex;

 tempYchange = yIndex;

  

}

if(count >= 5){

return true;

}

count = 1;

}

return false;

}

 

public void paint(Graphics g){

super.paint(g);

ImageIcon i1 = new ImageIcon(getClass().getResource("/TU/i1.png"));

//ImageIcon ii = new ImageIcon("TU/1.jpeg");

//Image img = ii.getImage();

g.drawImage(i1.getImage(), 0, 0,450,480, null);

//绘制棋盘

DrawChessBoard(g);

//绘制棋子

DrawChessPieces(g);

}

 

 

private void DrawChessBoard(Graphics g) {

for(int i = 0;i<=21;i++){

g.drawLine(i*20, 20,i*20, 420);

}

for(int j = 0;j<=21;j++){

g.drawLine(20, j*20, 420,j*20);

}

}

 

private void DrawChessPieces(Graphics g) {

for(int i = 0;i<allchess.length;i++){

for(int j = 0;j<allchess.length;j++){

int value = allchess[i][j];

if(value == 2){

ImageIcon black = new ImageIcon(getClass().getResource("/TU/black.png"));

g.drawImage(black.getImage(), i*20+20-8, j*20+20-8,16,16,null);

}

else if(value == 1){

ImageIcon white = new ImageIcon(getClass().getResource("/TU/white.png"));

g.drawImage(white.getImage(), i*20+20-8, j*20+20-8,16,16,null);

}

}

}

}

}

RightPanel :

package Date7_05;

 

import java.awt.Color;

import java.awt.Dimension;

import java.awt.FlowLayout;

import java.awt.Graphics;

import java.awt.Point;

import java.awt.event.ActionEvent;

import java.awt.event.ActionListener;

import java.io.FileInputStream;

 

import javax.swing.BorderFactory;

import javax.swing.ImageIcon;

import javax.swing.JButton;

import javax.swing.JOptionPane;

import javax.swing.JPanel;

 

import sun.audio.AudioPlayer;

import sun.audio.AudioStream;

 

@SuppressWarnings("serial")

public class RightPanel extends JPanel{

MainFrame mf;

boolean musicflag = false;

private AudioStream as;

//ImageIcon ij;

public RightPanel(MainFrame mf){

this.mf = mf;

setPreferredSize(new Dimension(150, 0));

//添加音乐

addImusic();

//创建一个往上凸起的边框

setBorder(BorderFactory.createBevelBorder(0,Color.WHITE,Color.GREEN));

FlowLayout fl=new FlowLayout(FlowLayout.CENTER,50,45);

setLayout(fl);

JButton start = new JButton("开始游戏");

JButton back = new JButton("悔一步棋");

JButton music = new JButton("打开音乐");

JButton about = new JButton("关于游戏");

JButton exit = new JButton("退出游戏");

add(start);

add(back);

add(music);

add(about);

add(exit);

ActionListener ac = new ActionListener(){

public void actionPerformed(ActionEvent e){

LeftPanel.begin =true;

start.setText("重新开始");

LeftPanel.allchess = new int[22][22];

mf.repaint();

LeftPanel.allcs.clear();

}

};

ActionListener ac1 = new ActionListener(){

public void actionPerformed(ActionEvent e){

Point point = LeftPanel.allcs.get(LeftPanel.allcs.size()-1);

LeftPanel.allchess[(int) point.getX()][(int) point.getY()] = 0;

LeftPanel.allcs.remove(LeftPanel.allcs.size()-1);

mf.repaint();

LeftPanel.begin = true;

LeftPanel.chessflag = !LeftPanel.chessflag;

}

};

ActionListener ac2 = new ActionListener(){

public void actionPerformed(ActionEvent e){

if(musicflag == false){

AudioPlayer.player.start(as);

musicflag = true;

music.setText("关闭音乐");

}

else{

AudioPlayer.player.stop(as);

musicflag = false;

music.setText("打开音乐");

}

}

};

ActionListener ac3 = new ActionListener(){

public void actionPerformed(ActionEvent e){

JOptionPane.showMessageDialog(mf,"​​首先,要明确五子棋规则,对峙双方谁的五个棋子先连在一条线即为胜者。"+"\n"+"其次,当有三个子连成一条直线的时候就应当采取防守堵住三子的一端,否"+"\n"+"则就会输掉比赛。​因此对峙双方应当争取取得主动位置,多取得三子连线的优势。");

}

};

ActionListener ac4 = new ActionListener(){

public void actionPerformed(ActionEvent e){

System.exit(0);

}

};

setVisible(true);

start.addActionListener(ac);

back.addActionListener(ac1);

music.addActionListener(ac2);

about.addActionListener(ac3);

exit.addActionListener(ac4);

}

private void addImusic() {

 

try {

FileInputStream fis = new FileInputStream("TU/back.wav");

as = new AudioStream(fis);

AudioPlayer.player.stop(as);

} catch (Exception e1) {

// TODO Auto-generated catch block

e1.printStackTrace();

}

}

public void paintComponent(Graphics g){

super.paintComponent(g);

ImageIcon ij = new ImageIcon(getClass().getResource("/TU/i2.jpg"));

g.drawImage(ij.getImage(), 0, 0,getWidth(),getHeight(), null);

}

}

图片和声音的导入如下:

 

声音图片文件打包下载地址:

http://pan.baidu.com/s/1jIvuLl8

0 0