五子棋
来源:互联网 发布:淘宝网用户名怎么修改 编辑:程序博客网 时间: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
- 五子棋
- 五子棋
- 五子棋
- 五子棋
- 五子棋
- 五子棋
- 五子棋
- 五子棋
- 五子棋
- 五子棋
- 五子棋
- 五子棋
- 五子棋
- 五子棋
- 五子棋
- 五子棋
- 五子棋
- 五子棋
- 烧脑的sql语句(头脑风暴)
- 当我们谈Web应用安全的时候 主要谈哪些
- Android BLE学习笔记
- Android第一行代码笔记<1>
- Ubuntu 下打开txt文件乱码的方法
- 五子棋
- Minimum Cut
- Android第一行代码笔记<2>
- IOS开发-单例模式安全写法
- 动态代理模式总结
- UOJ #31. 【UR #2】猪猪侠再战括号序列
- procedure中的失足之-----跟变量翻脸
- hello world (openresty)
- Ant path 匹配原则 spring