黑马程序员技术交流社区

标题: 猜数字游戏 [打印本页]

作者: 奋斗的懒人    时间: 2018-3-14 23:05
标题: 猜数字游戏

游戏说明:
设计一款拼图游戏,要求点击图片按钮,实现图片按钮的移动,直到每一个按钮都到达指定位置游戏终止退出。
游戏设计思路:
1.准备一张图像文件;
2.创建N个按钮图标,每个按钮图标里面存入一张分割后的图片信息;
3.创建一个空白按钮用于和图标按钮交换位置,达到移动的效果;
4.乱序,将按钮图标乱序,完成游戏效果;
5.创建一个面板添加游戏开始和游戏结束按钮;
6.设计游戏窗口;

游戏界面设计基本结构:

代码实现:

Cell类----设计每个按钮对象应该具备的属性功能---针对按钮package puzzle_game;import java.awt.Rectangle;import javax.swing.Icon;import javax.swing.JButton;@SuppressWarnings("serial")public class Cell extends JButton{    private static int IMAGEWIDTH;//设置按钮的宽度大小    private static int IMAGEHEIGHT;    private int ID = 0;//设置当前按钮的指向坐标    public Cell(Icon icon, int id, int imagewidth, int height)//构造函数初始化,传入两个参数,一个是图像的图标,一个是该按钮的数组ID    {        this.setIcon(icon);        this.ID = id;        this.IMAGEWIDTH = imagewidth;        this.IMAGEHEIGHT = height;        this.setSize(IMAGEWIDTH, IMAGEHEIGHT);    }    public void move(Direction dir)//移动    {        Rectangle rec = this.getBounds();//获取当前对象的这个边框        switch(dir)        {        case UP://向上移动,改变坐标            this.setLocation(rec.x, rec.y + IMAGEHEIGHT);            break;        case DOWN://向下移动            this.setLocation(rec.x, rec.y - IMAGEHEIGHT);            break;        case LEFT://向左移动            this.setLocation(rec.x - IMAGEWIDTH, rec.y);            break;        case RIGHT://向右移动            this.setLocation(rec.x + IMAGEWIDTH, rec.y);            break;        }    }    public int getID() {        return ID;    }    public int getX()    {        return this.getBounds().x;    }    public int getY()    {        return this.getBounds().y;    }}Direction类------方向枚举类,存放移动的方向package puzzle_game;public enum Direction {    UP,    DOWN,    LEFT,    RIGHT}GamePanel类-----游戏面板设计类,真正的游戏思想从此开始主要实现的功能有:1.初始化面板按钮数组,将图像转化成图标然后存入按钮中;2.打乱数组面板中的按钮排序,实现游戏娱乐功能;3.每个按钮添加监听机制,实现点击按钮后的移动功能;package puzzle_game;import java.awt.event.MouseEvent;import java.awt.event.MouseListener;import java.awt.image.BufferedImage;import java.io.File;import java.util.Random;import javax.imageio.ImageIO;import javax.swing.ImageIcon;import javax.swing.JOptionPane;import javax.swing.JPanel;@SuppressWarnings("serial")public class GamePanel extends JPanel implements MouseListener{    private Cell BlankCell = null;    private int row = 4;    private int col = 4;//设置这个拼图的行列    private Cell cells[] = new Cell[row*col];//创建一个按钮对象数组    int ImageWidth;    int ImageHeight;    public GamePanel()//构造函数    {        this.setLayout(null);        init();    }    public void init()//初始化完成以下功能--完成图像的切割,完成图像到图标的转换,完成按钮图标的添加,将按钮添加到面板上,并且给每一个按钮添加监听机制    {        int num = 0;        BufferedImage buf = null;        BufferedImage bufnew = null;        ImageIcon icon = null;        int width = 0;        int height = 0;        try        {            buf = ImageIO.read(new File("F:/Image/Puzzle_game/puze.jpg"));//读取文件图像            ImageWidth = buf.getWidth();            ImageHeight = buf.getHeight();            System.out.println("ImageWidth->"+ImageWidth+"ImageHeight->"+ImageHeight);            width = ImageWidth/col;            height = ImageHeight/row;        }catch(Exception e)        {            System.out.println(e);        }        for(int i = 0; i < row; i++)        {            for(int j = 0; j < col; j++)            {                num = i*col+j;//表示当前这个图像的坐标id,在数组中的下标                if(num < row*col-1)                {                    bufnew = buf.getSubimage(width*j, height*i, width, height);                    icon = new ImageIcon(bufnew);//将图像转化成图标                }                else//使最后一张图像为空白图像                {                    icon = new ImageIcon("F:/Image/Puzzle_game/background2.jpg");//一张空白图像                }                cells[num] = new Cell(icon, num, width, height);//添加图标到每一个BUTTON按钮上面                cells[num].setLocation(width*j, height*i);            }        }        BlankCell = cells[cells.length-1];//初始化空白格        for(int i = 0; i < cells.length; i++)        {            this.add(cells);//将每一个按钮添加到当前这个面板上面            if(i < cells.length-1)                cells.addMouseListener(this);//空白格不添加监听机制        }    }    public void OutOfOrder()//乱序----打乱图片的排布顺序    {        Random random = new Random();        for(int i = 0 ; i < cells.length ; i++)        {            int index1 = random.nextInt(cells.length);//cells的长度是9,但是他的上限是9,取不到9,所取值范围是0-8            int index2 = random.nextInt(cells.length);            int x = cells[index1].getX();            int y = cells[index1].getY();//获取下标是index1的数组元素按钮的坐标            cells[index1].setLocation(cells[index2].getX(), cells[index2].getY());            cells[index2].setLocation(x, y);        }    }    public boolean IsWin()//判断游戏玩家是否赢    {        for(int i = 0; i < cells.length; i++)        {            int x = cells.getX();            int y = cells.getY();            if(x/(ImageWidth/col) + y/(ImageHeight/row) != i)            {                return false;            }        }        return true;    }    public void mouseClicked(MouseEvent e)    {        Cell t = (Cell) e.getSource();        int x = BlankCell.getX();        int y = BlankCell.getY();        if(t.getY() == y && t.getX() + ImageWidth/col == x)//图像向右走        {            t.move(Direction.RIGHT);            BlankCell.move(Direction.LEFT);        }        else if(t.getY() == y && t.getX() - ImageWidth/col == x)//图像向左走        {            t.move(Direction.LEFT);            BlankCell.move(Direction.RIGHT);        }        else if(t.getX() == x && t.getY() + ImageHeight/row == y)//图像向上走        {            t.move(Direction.UP);            BlankCell.move(Direction.DOWN);        }        else if(t.getX() == x && t.getY() - ImageHeight/row == y)//图像向下走        {            t.move(Direction.DOWN);            BlankCell.move(Direction.UP);        }        if(IsWin())        {            int choice = JOptionPane.showConfirmDialog(null, "恭喜您过关了是否还来一局?", "提示", JOptionPane.YES_NO_OPTION);            if(choice == 0)//表示再来一局            {                this.OutOfOrder();            }            else//表示退出游戏                System.exit(1);        }    }    @Override    public void mousePressed(MouseEvent e) {    }    @Override    public void mouseReleased(MouseEvent e) {    }    @Override    public void mouseEntered(MouseEvent e) {    }    @Override    public void mouseExited(MouseEvent e) {    }}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125
  • 126
  • 127
  • 128
  • 129
  • 130
  • 131
  • 132
  • 133
  • 134
  • 135
  • 136
  • 137
  • 138
  • 139
  • 140
  • 141
  • 142
  • 143
  • 144
  • 145
  • 146
  • 147
  • 148
  • 149
  • 150
  • 151
  • 152
  • 153
  • 154
  • 155
  • 156
  • 157
  • 158
  • 159
GameFrame类------设置游戏的打开窗口类,创建了一个菜单面板存放游戏开始和游戏结束两个按钮,并且对游戏的窗口进行了基本设置,这是整个游戏的入口。package puzzle_game;import java.awt.BorderLayout;import java.awt.Container;import java.awt.EventQueue;import java.awt.FlowLayout;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import javax.swing.JButton;import javax.swing.JFrame;import javax.swing.JPanel;public class GameFrame extends JFrame {    public JPanel pane1 = new JPanel();    public JButton button1 = new JButton("游戏开始");    public JButton button2 = new JButton("游戏结束");    public GameFrame()    {        super("拼图游戏");        pane1.setLayout(new FlowLayout());        pane1.add(button1);        pane1.add(button2);        Container con = this.getContentPane();        con.add(pane1,BorderLayout.NORTH);        GamePanel gamepane = new GamePanel();        con.add(gamepane,BorderLayout.CENTER);        this.setBounds(300, 300, 600, 600);        this.setVisible(true);        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);        button1.addActionListener(new ActionListener()        {            public void actionPerformed(final ActionEvent e)            {                gamepane.OutOfOrder();            }        });        button2.addActionListener(new ActionListener()        {            public void actionPerformed(final ActionEvent e)            {                System.exit(1);            }        });    }    public static void main(String[] args) {        new GameFrame();    }}

作者: gzgd    时间: 2018-4-3 11:37
厉害了啊
作者: gzgd    时间: 2018-4-3 11:37

作者: gzgd    时间: 2018-4-3 11:37

作者: gzgd    时间: 2018-4-3 11:38

作者: gzgd    时间: 2018-4-3 11:38

作者: gzgd    时间: 2018-4-3 11:38

作者: gzgd    时间: 2018-4-3 11:38

作者: gzgd    时间: 2018-4-3 11:38

作者: gzgd    时间: 2018-4-3 11:38

作者: gzgd    时间: 2018-4-3 11:38

作者: gzgd    时间: 2018-4-3 11:38

作者: gzgd    时间: 2018-4-3 11:38

作者: Haraella    时间: 2018-4-3 11:38
好像很不错的样子
作者: Haraella    时间: 2018-4-3 11:39

作者: Haraella    时间: 2018-4-3 11:39

作者: Haraella    时间: 2018-4-3 11:39

作者: Haraella    时间: 2018-4-3 11:39

作者: Haraella    时间: 2018-4-3 11:39

作者: Haraella    时间: 2018-4-3 11:39

作者: Haraella    时间: 2018-4-3 11:39

作者: Haraella    时间: 2018-4-3 11:39

作者: Haraella    时间: 2018-4-3 11:39

作者: Haraella    时间: 2018-4-3 11:39

作者: zzzz2017    时间: 2018-4-3 11:40
不错不错
作者: 白猫    时间: 2018-4-3 11:40
点个赞啊




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2