当前位置:文档之家› java拼图游戏设计报告

java拼图游戏设计报告

《Web程序开发》课程大作业拼图游戏3011212046张杰2014.11一、题目说明拼图游戏不仅可以帮助人们打发时间,还可以用于锻炼儿童脑力,帮助少儿开发大脑思维,拼图游戏结合了许多元素,可以图片切割,游戏拼图,游戏成功时和打破记录时的判断,同时还有游戏时间和步数的记录,并以文档形式进行保存。

在拼图时首先把图片添加到background目录下,程序会自动获取该目录下的所有文件,并加载到游戏中,进行切割后,显示在拼图按钮上。

本游戏使用Java语言设计,开发平台为JDK。

开发工具Eclipse。

JDK是Sun Microsystems针对Java开发员的产品。

自从Java推出以来,JDK已经成为使用最广泛的Java SDK。

JDK 是整个Java的核心,包括了Java运行环境,Java 工具和Java基础的类库。

JDK是学好Java的第一步。

从SUN的JDK5.0开始,提供了泛型等非常实用的功能,其版本也不断更新,运行效率得到了非常大的提高。

二、题意分析因为要制作拼图游戏,所以首先要实现图片的导入。

这是通过getImage()函数来实现的,该函数有两个参数,第一个参数指明图片的路径,第二个参数指明图片的名称。

然后,因为要实现图片摆放的随意性,所以要通过initgame()函数来实现。

Initgame()函数是自写函数,在函数体内,通过调用Math.random()函数产生随机数,用来达到图片位置摆放的随意性和随机性。

最后,因为要实现人机交互.,所以首先要通过一系列函数来实现对鼠标事件的监听和响应,这是通过函数addMouseListener(this) 和addMouseMotionListener(this)来完成的。

这样程序会区分用户对鼠标不同的操作,正确执行相应的功能。

游戏操作流程:三、设计目的本游戏的设计目的在于休闲娱乐,玩家可以在学习、编程等工作后用来休息放松,让集中的心态得到释放,对于小孩可以通过精美的卡通的图片来吸引孩子的兴趣,加强动脑动手能力。

本游戏适玩人群老少皆宜。

四、设计特点本游戏主要充分运用图形用户界面将一张图片切割成大小相同的九块小图,运用其中的八块,将小图的顺序和位置打乱,通过将图片移动到剩余的一格空白处而改变图片的位置,最终拼成原始图片。

五、功能说明游戏功能图:本拼图游戏,运用了Java2中的图形处理技术和消息响应技术。

通过图形技术,实现图片的导入和分割。

通过消息响应机制,使程序可以响应用户的鼠标操作,进行拼图游戏的操作。

这个游戏主要分为四个模块,分别是游戏开始、查看图片、选择图片和退出游戏。

这四个摸块的功能各不一样,玩家如果在游戏过程中感觉拼图小块之间的接合不明显,玩家可以点击“查看”按钮来浏览拼图完成的效果图,从而使得游戏不会无从下手;玩家如果觉得当前拼图的画面不满意可以点击“选择”图片按钮来更换图片,或者想更改拼图的画面,玩家可以进入游戏文件夹进行更换图片文件,但是需要注意的是图片需要有格式,同时还需要将所要更改的图片切割成大小相同的九个小块,具体就不详细说了,游戏文件夹中会给大家附一个.txt文件,供大家更换图片使用,从而提高玩家乐趣。

六、主要功能程序段import java.awt.Rectangle;//引入类import java.awt.event.*;import javax.swing.*;class PaneButton extends JButton {// 继承按钮类实现加图片的方格PaneButton(Icon icon) {//构造方法进行初始化,设置图标super(icon);this.setSize(100, 100);//设置每个方格的大小}public void move(String direction, int sleep) {//方格的移动if (direction == "UP") {//方格向上移动this.setLocation(this.getBounds().x, this.getBounds().y - 100);} else if (direction == "DOWN") {//方格向下移动this.setLocation(this.getBounds().x, this.getBounds().y + 100);} else if (direction == "LEFT") {//方格向左移动this.setLocation(this.getBounds().x - 100, this.getBounds().y);} else {//方格向右移动this.setLocation(this.getBounds().x + 100, this.getBounds().y);}}}public class PanelOfImage extends JPanel implements MouseListener {//图片面板加载方格对象boolean hasAddActionListener = false;//设置方格动作监听器的标识PaneButton pane[];//声明方格Rectangle nullPanel;//声明空方格,没有添图片public static int currentPID = 1;//当前选择的图片编号public PanelOfImage() {//构造方法进行初始化this.setLayout(null);//设置面板的布局为空this.setSize(400, 400);//设置面板的大小nullPanel = new Rectangle(200, 200, 100, 100);//设置空方格的位置pane = new PaneButton[9];//创建九个方格Icon icon;//声明图标for (int i = 0; i < 3; i++) {//循环为每个方格加载图片for (int j = 0; j < 3; j++) {//循环列icon = new ImageIcon("pictrue/pic_" + currentPID + "_"+ (i * 3 + j + 1) + ".jpg");//创建图标pane[i * 3 + j] = new PaneButton(icon);//创建方格在方格中加载图片pane[i * 3 + j].setLocation(j * 100, i * 100);//设置方格的位置this.add(pane[i * 3 + j]);//面板添加方格}}this.remove(pane[8]);// 移除多余的方格}public boolean isFinish() {//判断是否拼凑成功for (int i = 0; i < 8; i++) {int x = pane[i].getBounds().x;int y = pane[i].getBounds().y;if (y / 100 * 3 + x / 100 != i)return false;}return true;}public void reLoadPictrue() {//重新加载图片在重新选择图片时Icon icon;for (int i = 0; i < 3; i++) {//循环为每个方格加载图片for (int j = 0; j < 3; j++) {icon = new ImageIcon("pictrue/pic_" + currentPID + "_"+ (i * 3 + j + 1) + ".jpg");pane[i * 3 + j].setIcon(icon);}}}public void breakRank() {//方格打乱重新排序while (pane[0].getBounds().x <= 100 && pane[0].getBounds().y <= 100) {//当第一个方格距左上角近时int x = nullPanel.getBounds().x;int y = nullPanel.getBounds().y;int direction = (int) (Math.random() * 4);//随机产生一个数字对应空方格的上下左右移动if (direction == 0) {//空方格左移动,与左侧方格互换位置,左侧方格右移动x -= 100;//空主格左移if (test(x, y)) {for (int j = 0; j < 8; j++) {//循环寻打左侧的按钮if ((pane[j].getBounds().x == x)&& (pane[j].getBounds().y == y)) {//依次寻找左侧的按钮pane[j].move("RIGHT", 100);//方格向右移动一格nullPanel.setLocation(x, y);//重新设置空方格的位置break;//跳出循环}}}} else if (direction == 1) {//空方格右移动x += 100;if (test(x, y)) {for (int j = 0; j < 8; j++) {if ((pane[j].getBounds().x == x)&& (pane[j].getBounds().y == y)) {pane[j].move("LEFT", 100);//方格向左移动一格nullPanel.setLocation(x, y);break;}}}} else if (direction == 2) {//空方格上移动y -= 100;if (test(x, y)) {for (int j = 0; j < 8; j++) {if ((pane[j].getBounds().x == x)&& (pane[j].getBounds().y == y)) {pane[j].move("DOWN", 100);//方格向下移动一格nullPanel.setLocation(x, y);break;}}}} else {//空方格下移动y += 100;if (test(x, y)) {for (int j = 0; j < 8; j++) {if ((pane[j].getBounds().x == x)&& (pane[j].getBounds().y == y)) {pane[j].move("UP", 100);//方格向上移动一格nullPanel.setLocation(x, y);break;}}}}}if (!hasAddActionListener)//判断是否添加动作事件for (int i = 0; i < 8; i++){//循环为每个方格添加动作事件pane[i].addMouseListener(this);}hasAddActionListener = true;}private boolean test(int x, int y) {//检测方格是否在指定的范围内移动if ((x >= 0 && x <= 200) || (y >= 0 && y <= 200))return true;elsereturn false;}public void mouseClicked(MouseEvent arg0) {//鼠标点击时调用}public void mouseEntered(MouseEvent arg0) {//鼠标进入组件区域时调用}public void mouseExited(MouseEvent arg0) {//控制鼠标不能移动出面板的范围}public void mouseReleased(MouseEvent arg0) {//鼠标按键在组件上释放时调用}public void mousePressed(MouseEvent event) {//鼠标按下时调用PaneButton button = (PaneButton) event.getSource();//获得鼠标按的方格按钮int x1 = button.getBounds().x;//获得该方格按钮的横坐标int y1 = button.getBounds().y;//获得该方格按钮的纵坐标int nullDir_X = nullPanel.getBounds().x;//得到空方格的横坐标int nullDir_Y = nullPanel.getBounds().y;//得到空方格的纵坐标if (x1 == nullDir_X && y1 - nullDir_Y == 100)//进行比较果满足条件则交换button.move("UP", 100);//方格向上移动else if (x1 == nullDir_X && y1 - nullDir_Y == -100)button.move("DOWN", 100);//方格向下移动else if (x1 - nullDir_X == 100 & y1 == nullDir_Y)button.move("LEFT", 100);//方格向左移动else if (x1 - nullDir_X == -100 && y1 == nullDir_Y)button.move("RIGHT", 100);//方格向右移动elsereturn;nullPanel.setLocation(x1, y1);//重新设置空方格的位置this.repaint();//重新加载if (this.isFinish()) {//进行是否完成的判断JOptionPane.showMessageDialog(this, "恭喜你,完成拼图");for (int i = 0; i < 8; i++){//循环撤消鼠标事件pane[i].removeMouseListener(this);}hasAddActionListener = false;}}}import java.awt.*;//引入类import java.awt.event.*;import javax.swing.*;public class TextImagePieceTogether extends JFrame implements ActionListener {//操作实现拼图的游戏的类PanelOfImage imagePanel;//声明图片面板JPanel panelOfSouth, panelOfLook;////声明南侧面板和查看面板Button startButton;//声明开始按钮Button lookButton;//声明查看按钮Button chooseButton;//选择按钮Container container;// 容器,得到内容面板public TextImagePieceTogether() {//构造方法进行初始化container = this.getContentPane();//获得内容面板startButton = new Button("开始");//创建开始按钮startButton.addActionListener(this);//添加监听事件lookButton = new Button("查看");lookButton.addActionListener(this);chooseButton = new Button("选择");chooseButton.addActionListener(this);panelOfLook = new JPanel();//创建查看面板panelOfLook.setLayout(null);//设置布局Icon icon = new ImageIcon("pictrue/pic_" + PanelOfImage.currentPID+ ".jpg");//创建图标JLabel label = new JLabel(icon);//创建图标标签label.setBounds(0, 0, 300, 300);//设置标签的位置panelOfLook.add(label);//添加标签panelOfSouth = new JPanel();//创建南侧面板panelOfSouth.setBackground(Color.red);//设置背景颜色panelOfSouth.add(startButton);//添加开始按钮panelOfSouth.add(lookButton);//添加查看按钮panelOfSouth.add(chooseButton);//添加选择按钮imagePanel = new PanelOfImage();//创建图片面板container.add(imagePanel, BorderLayout.CENTER);container.add(panelOfSouth, BorderLayout.SOUTH);this.setTitle("拼图游戏");//设置标题this.setLocation(300, 200);//设置位置this.setSize(308, 365);//设置大小this.setResizable(false);//设置是否可以通过某个用户操作调整this.setVisible(true);//设置可视this.setDefaultCloseOperation(3);//设置默认关闭操作}public void actionPerformed(ActionEvent event) {//按钮触发的事件Button button = (Button) event.getSource();//获得事件按钮源if (button == startButton) {//如果是开始按钮imagePanel.breakRank();//调用图片方格打乱方法} else if (button == lookButton) {//如果是查看事件if (button.getLabel() == "查看") {//如果按钮标签为"查看"container.remove(imagePanel);//容器移除图片面板container.add(panelOfLook);//容器添加查看标签panelOfLook.updateUI();//不用调整大小就可以出现新增删的组件container.repaint();//重绘button.setLabel("返回");//设置按钮标签} else {container.remove(panelOfLook);//容器移除查看面板container.add(imagePanel);//容器添加图片面板container.repaint();//重绘button.setLabel("查看");}} else if (button == chooseButton) {//如果是选择按钮Choice choice = new Choice();//创建选择器choice.add("--小猫--");//添加列表项choice.add("--QQ--");int i = JOptionPane.showConfirmDialog(this, choice, "选择图片",JOptionPane.OK_CANCEL_OPTION);//弹出对话框if (i == JOptionPane.YES_OPTION) {//选择对话框的确定按钮PanelOfImage.currentPID = choice.getSelectedIndex() + 1;//获得列表项的编号imagePanel.reLoadPictrue();//图片重载Icon icon = new ImageIcon("pictrue/pic_"+ PanelOfImage.currentPID + ".jpg");//获得图片图标JLabel label = new JLabel(icon);//根据图标设置标签label.setBounds(0, 0, 300, 300);//设置标签的方位panelOfLook.removeAll();panelOfLook.add(label);panelOfLook.repaint();}}}public static void main(String[] args) {//java程序主入口处new TextImagePieceTogether();//实例化对象}}七、运行结果游戏界面:开始游戏:查看全图:更换图片:八、编程经验本练习制作拼图游戏的实例,运用了Java2中的图形处理技术和消息响应技术。

相关主题