课程设计报告 - -Java实现游戏连连看 - 图文

更新时间:2023-12-27 14:26:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

课程设计说明书 NO.1

JAVA语言实现连连看游戏 1.课程设计目的 Java语言是当今流行的网络编程语言,它具有面向对象、跨平台、分布应用等特点。面向对象的开发方法是当今世界最流行的开发方法,它不仅具有更贴近自然的语义,而且有利于软件的维护和继承。 学会Java程序开发的环境搭建与配置,并在实际运用中学习和掌握Java程序开发的全过程。进一步熟悉掌握Java程序设计语言的基础内容,如用户图形界面设计、Java多线程编程、Applet程序的设计、文件和网络输入输出流编程、Java数据库编程等。通过亲自动手写程序,一方面拓展知识面,一方面锻炼调试能力 2.设计方案论证 2.1设计思路 2.1.1用户可以通过点击菜单中的“开始游戏”选项,开始新游戏程序。程序会载入图片,并通过特定的算法排列图片,并标记图片,以便判断图片是否相同。记录图片坐标,以方便计算图片是否可以相连。确定图片大小,以确定用户点击的是那张图片。 2.1.2用户选择两张一样的图片,通过鼠标进行选取,如果用户两次点击的图片不相同,那么系统认为用户没有点(鼠标记数归0),以完成用户以后的选取工作。如果用户选择的是相同的图片,那么系统会消除这两张图片,并使鼠标记数为0,并消除这两张图片的标记,使里面的图片被标记在外面。以便用户可以进行以后的选择。 2.1.3用户也可使通过使用“炸弹”功能进行消除图片。方法是点击菜单中的“炸弹”选项使用,点击后如果界面上有两张可以相连的相同图片就随机消除两张可以相连的相同的图片。 2.1.4 炸弹数目是有限的,默认数目为三,每使用一次“炸弹”功能,炸弹数目就会自动减一,当炸弹数目为零时(使用三次“炸弹”功能)。并且用户想再次使用炸弹时,系统会弹出对话框提示用户,并把菜单中“炸弹”选项变为灰色(用户不可使用)。 2.1.5当系统开始游戏后,系统会在后台记录时间,如果在用户还没有消除所有图片时,系统时间到了,那么系统会弹出对话框,提示用户,时间到了,游戏失败。 2.1.6 当用户点击确定后,系统还会弹出对话框询问用户是否重新开始,用户选择“是”时,系统会开始新游戏;当用户选择“否”时,系统会返回开始界面;当用户选择“取 课程设计说明书 NO.2

消”时,系统会返回提示时间到的界面。 2.1.6 如果在时间未到时,用户使所有的图片都消失(两两消除,直到最后一对),系统会提示用户游戏以通过,点“确定”后回到开始界面。 2.2设计方法 在设计连连看小游戏是,需要编写6个Java源文件:MainFrame.java,ChessButton.java,MapUI.java,Settings.java,ArrayPoint.java,Map.java。 2.2.1 MainFrame.java 主窗口部分定义了程序用函数,实现了程序菜单(initMenuBar)的使用。 2.2.2 ChessButton.java 按键部分定义按键的位置,代表的值。 2.2.3 MapUI.java 游戏部分判断点击的图片,判断两图片是否可连,是否相同。判断是否胜利。实现炸弹功能。 2.2.4 Settings.java 数组确定了游戏各种参数属性。 2.2.5 ArrayPoint.java 取值部分定义图片的值。 2.2.6 Map.java 算法部分通过算法确定两张图片是否连通。 2.3功能模块 此设计共有以下几个功能模块。 2.3.1 开始游戏 程序会载入图片,并通过特定的算法排列图片,并标记图片,以便判断图片是否相同。记录图片坐标,以方便计算图片是否可以相连。确定图片大小,以确定用户点击的是那张图片。 2.3.2 使用“炸弹” 用户点击菜单中的“炸弹”选项使用,点击后如果界面上有两张可以相连的相同图片就随机消除两张可以相连的相同的图片。 2.3.3 限制炸弹“数目” 课程设计说明书 NO.3

弹 默认数目为三,每使用一次“炸弹”功能,炸弹数目就会自动减一,当炸弹数目为零时(使用三次“炸弹”功能)。并且用户想再次使用炸弹时,系统会弹出对话框提示用户,并把菜单中“炸弹”选项变为灰色(用户不可使用)。 2.3.4 对用户游戏时的判断 用户选择两张一样的图片,通过鼠标进行选取,如果用户两次点击的图片不相同,那么系统认为用户没有点(鼠标记数归0),以完成用户以后的选取工作。如果用户选择的是相同的图片,那么系统会消除这两张图片,并使鼠标记数为0,并消除这两张图片的标记,使里面的图片被标记在外面。以便用户可以进行以后的选择。 课程设计说明书 NO.4

2.4流程图如下 图2 主函数流程图

课程设计说明书 NO.5

Y 是否使用炸弹 接收用户点击 开始游戏 开始程序 N N 是否二次点击 消除点击计数 Y N 两张图片 消除两张一样的 可以相连的图片 是否相同 Y N Y Y 是否还有图 片未消除 消除点击计数 消除用户点击 的两张图片 两张图片是否可以相连 N 结束 图3 游戏进行流程图

课程设计说明书 NO.6

图4 使用炸弹流程图 图5 计算时间流程图 课程设计说明书 NO.7

2.5类、方法、属性说明 成员变量 成员变量描述 行数 列数 图片后缀名 每局所花时间(秒) 判断的时间间隔 炸弹的使用次数 方法 方法名 MenuBar() Bomb() Point() Chesses() Timer() 功能 实用程序菜单 设置炸弹 定义按键的位置 初步定义游戏界面,功能 时间限制 备注 无备注 无备注 无备注 无备注 无备注 变量类型 int int string int int int 名称 ROWS COLUMNS RELEX PERTIME PER BOMBCOUNT 3.设计结果与分析 用户可以通过点击菜单中的“开始游戏”选项,开始新游戏程序。程序会载入图片,并通过特定的算法排列图片,并标记图片,以便判断图片是否相同。记录图片坐标,以方便计算图片是否可以相连。确定图片大小,以确定用户点击的是那张图片。 课程设计说明书 NO.8

图6 开始游戏后画面 用户选择两张一样的图片,通过鼠标进行选取,如果用户两次点击的图片不相同,那么系统认为用户没有点(鼠标记数归0),以完成用户以后的选取工作。如果用户选择的是相同的图片(如第八行第二列和第八行第三列),那么系统会消除这两张图片,并使鼠标记数为0,并消除这两张图片的标记,使里面的图片被标记在外面。以便用户可以进行以后的选择。 图7 消除三对后画面 课程设计说明书 NO.9

用户也可使通过使用“炸弹”功能进行消除图片。方法是点击菜单中的“炸弹”选项使用,点击后如果界面上有两张可以相连的相同图片就随机消除两张可以相连的相同的图片(如第一行第一列河第一行第四列)。 图8 使用炸弹后画面 炸弹数目是有限的,默认数目为三,每使用一次“炸弹”功能,炸弹数目就会自动减一,当炸弹数目为零时(使用三次“炸弹”功能)。并且用户想再次使用炸弹时,系统会弹出对话框提示用户,并把菜单中“炸弹”选项变为灰色(用户不可使用)。 图9 炸弹使用光后画面 当系统开始游戏后,系统会在后台记录时间,如果在用户还没有消除所有图片时,系统时间到了,那么系统会弹出对话框,提示用户,时间到了,游戏失败。 课程设计说明书 NO.10

图10 时间到时的画面 当用户点击确定后,系统还会弹出对话框询问用户是否重新开始,用户选择“是”时,系统会开始新游戏;当用户选择“否”时,系统会返回开始界面;当用户选择“取消”时,系统会返回提示时间到的界面。 图11 点击确定时的画面 如果在时间未到时,用户使所有的图片都消失(两两消除,直到最后一对),系统会提示用户游戏以通过,点“确定”后回到开始界面。

课程设计说明书 NO.11

图12 通关画面 4.设计体会 通过这次课程设计我学到了不少东西,也发现了大量的问题,同时在设计的过程中发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固。因而,通过课程设计之后,把以前所学过的知识重新温故。有些在设计过程中已解决,有些还有待今后慢慢学习,只要认真学就会有更多的收获。总之这次课程设计使我更多的掌握了所学的知识,并运用到实践上,了解了java的重要性,对以后的学习起了重要作用。 在设计的过程中我遇到了很到问题,不过在老师和同学们的帮助和自己的思考下还是很好的完成了。这此课程设计还让我懂得了写程序不能闭门造车,要努力拓宽知识面,开阔视野,拓展思维。 5.参考文献 [1] 印旻. Java语言与面向对象程序设计[M],北京: 清华大学出版社,2005.4: 58-72 [2] 朱站立、沈伟. Java程序设计实用教程[M], 北京: 电子工业出版社, 2007.5: 82-95 [3] 朱福喜、尹为民、余振坤等. Java语言与面向对象程序设计[M], 第2版. 武汉: 武汉大学出版社,2006.1:123-130 [4] 艾力江. Java 2 范例入门与提高 [M],北京: 清华大学出版社 课程设计说明书 NO.12

6. 附录 MainFrame.java: import java.awt.BorderLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JFrame; import javax.swing.JMenu; import javax.swing.JMenuBar; import javax.swing.JMenuItem; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.SwingUtilities; import javax.swing.Timer; import cn.elva.Settings; import cn.elva.model.Map; public class MainFrame extends JFrame { private static final long serialVersionUID = 1L; private int bombCount = Settings.BOMBCOUNT; private JPanel jContentPane = null; private JMenuBar menuBar = null; private JMenu fileMenu = null; private JMenuItem reloadItem = null; private JMenuItem startItem = null; private JMenuItem bombItem = null; private JMenuItem exitItem = null; private MapUI mapUI = null; private long startTime; private long endTime; private Timer timer = null; private JMenuBar initMenuBar() { if (menuBar == null) { menuBar = new JMenuBar(); fileMenu = new JMenu(\文件\ startItem = new JMenuItem(\开始游戏\ startItem.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { reload(); 课程设计说明书 NO.13

} }); reloadItem = new JMenuItem(\重来一次\ reloadItem.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { reload(); } }); exitItem = new JMenuItem(\退出\ exitItem.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { System.exit(0); } }); fileMenu.add(startItem); fileMenu.add(reloadItem); fileMenu.add( bombItem ); fileMenu.add(exitItem); menuBar.add(fileMenu); } return menuBar; } public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable() { public void run() { MainFrame thisClass = new MainFrame(); thisClass.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); thisClass.setVisible(true); } }); } public MainFrame() { super(); initialize(); } 课程设计说明书 NO.14

private void initialize() { this.setSize(900, 900); this.setTitle(\ this.setJMenuBar(initMenuBar()); // this.setContentPane(getJContentPane()); this.setTitle(\连连看\ } private void reload() { mapUI = new MapUI(); startTime = System.currentTimeMillis() / 1000; endTime = startTime + Settings.PERTIME; jContentPane = new JPanel(); jContentPane.setLayout(new BorderLayout()); jContentPane.add(mapUI); this.setContentPane(jContentPane); this.validate(); Map.LEFTCOUNT = Settings.ROWS * Settings.COLUMNS; initTimer(); bombItem.setEnabled(true); bombCount=Settings.BOMBCOUNT; } private void initTimer() { ActionListener actionListener = new ActionListener() { public void actionPerformed(ActionEvent e) { startTime = System.currentTimeMillis() / 1000; if (startTime == endTime) { JOptionPane.showMessageDialog(MainFrame.this, \时间到了!!\ int result = JOptionPane.showConfirmDialog(MainFrame.this, \重玩一次?\\ if (result == JOptionPane.YES_OPTION) { reload(); } else { jContentPane.setVisible(false); validate(); 课程设计说明书 NO.15

} } } }; timer = new javax.swing.Timer(1000, actionListener); timer.start(); } } ChessButton.java public class ChessButton extends JButton { protected ArrayPoint point = null; public ChessButton(int row, int col, int value) { this(new ArrayPoint(row, col, value)); } public ChessButton(ArrayPoint point) { this.point = point; String name =\ URL url = ChessButton.class.getResource(name); ImageIcon icon = new ImageIcon( url ); this.setIcon(icon); } public ChessButton() { this(new ArrayPoint(0, 0, 0)); } public ArrayPoint getPoint() { return point; } public void setPoint(ArrayPoint point) { this.point = point; } } MapUI.java import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JOptionPane;

课程设计说明书 NO.16

import javax.swing.JPanel; import cn.elva.Settings; import cn.elva.model.ArrayPoint; import cn.elva.model.Map; public class MapUI extends JPanel implements ActionListener { private static final long serialVersionUID = 1L; private ChessButton[] chesses = null; private Map map = new Map(); private boolean two = false; private ArrayPoint priviousPoint; private ArrayPoint currPoint; public MapUI() { super(); initialize(); } private void initialize() { initChesses(); GridLayout gridLayout = new GridLayout(Settings.ROWS + 2,Settings.COLUMNS + 2); gridLayout.setHgap(2); gridLayout.setVgap(2); this.setLayout(gridLayout); this.setSize(300, 200); for (int row = 0; row < Settings.ROWS + 2; row++) { for (int col = 0; col < Settings.COLUMNS + 2; col++) { add(chesses[row * (Settings.COLUMNS + 2) + col]); } } } private void initChesses() { int[][] values = map.getMap(); this.chesses = new ChessButton[(Settings.ROWS + 2)* (Settings.COLUMNS + 2)]; for (int row = 0; row < 10; row++) { for (int col = 0; col < 10; col++) { int index = row * (Settings.COLUMNS + 2) + col; chesses[index] = new ChessButton(row, col, values[row][col]); 课程设计说明书 NO.17

chesses[index].addActionListener(this); if (row == 0 || row == (Settings.ROWS + 2 - 1) || col == 0 || col == (Settings.COLUMNS + 2 - 1)) { chesses[index].setVisible(false); } } } } public void clearCheese(ArrayPoint priviousPoint, ArrayPoint currPoint) { int[][] values = map.getMap(); values[priviousPoint.getI()][priviousPoint.getJ()] = 0; values[currPoint.getI()][currPoint.getJ()] = 0; int index1 = priviousPoint.getI() * (Settings.COLUMNS + 2)+ priviousPoint.getJ(); int index2 = currPoint.getI() * (Settings.COLUMNS + 2)+ currPoint.getJ(); chesses[index1].setVisible(false); chesses[index2].setVisible(false); if (map.LEFTCOUNT == 0) { JOptionPane.showMessageDialog(this, \恭喜您通过!!\ } } public void actionPerformed(ActionEvent e) { ChessButton button = (ChessButton) e.getSource(); ArrayPoint p = button.getPoint(); if (two) { currPoint = p; if( map.match(this.priviousPoint, this.currPoint)) { clearCheese(this.priviousPoint, this.currPoint); } two = false; } else { this.priviousPoint = p; two = true; } } public void bomb() 课程设计说明书 NO.18

{ int[][] values = map.getMap(); ArrayPoint p1 = null; ArrayPoint p2 = null; for (int row = 1; row < Settings.ROWS + 1; row++){ for (int col = 1; col < Settings.COLUMNS + 1; col++) { if (values[row][col] != 0){ p1 = new ArrayPoint(row, col, values[row][col]); for (int i = 1; i < Settings.ROWS + 1; i++) { for (int j = 1; j < Settings.COLUMNS + 1; j++) { if (values[i][j] != 0) { p2 = new ArrayPoint(i, j, values[i][j]); } else { continue; } //System.out.println(p1 + \ if (map.match(p1, p2)) { clearCheese(p1, p2); return; } } } } } } } } Settings.java package cn.elva; public interface Settings { public static final int ROWS = 8; public static final int COLUMNS=8; public static final String RELEX=\ public static final int PERTIME = 600; public static final int PER = 1; public static final int BOMBCOUNT = 3; 课程设计说明书 NO.19

} ArrayPoint.java package cn.elva.model; public class ArrayPoint { protected int i; protected int j; protected int value; public ArrayPoint( int i,int j,int value ) { this.i =i; this.j =j; this.value = value; } public String toString( ) { return i+\ } public int getI() { return i; } public void setI(int i) { this.i = i; } public int getJ() { return j; } public void setJ(int j) { this.j = j; } public int getValue() { return value; } public void setValue(int value) { this.value = value; } } 课程设计说明书 NO.20

Map.java package cn.elva.model; import java.util.Random; import cn.elva.Settings; public class Map { public static int LEFTCOUNT = Settings.ROWS * Settings.COLUMNS; private int[][] map = new int[Settings.ROWS + 2][Settings.COLUMNS + 2]; private int maxKinds = 4; public Map() { init(); } public int[][] getMap() { return map; } private void init() { int[] tempArr = new int[Settings.ROWS * Settings.COLUMNS]; int len = tempArr.length; for (int i = 0; i < len / maxKinds; i++) { tempArr[i * 4] = i + 1; tempArr[i * 4 + 1] = i + 1; tempArr[i * 4 + 2] = i + 1; tempArr[i * 4 + 3] = i + 1; } random(tempArr); for (int i = 1; i < Settings.ROWS + 1; i++) { for (int j = 1; j < Settings.COLUMNS + 1; j++) { this.map[i][j] = tempArr[(i - 1) * Settings.COLUMNS+ (j - 1)]; } } } private void random(int[] array) { Random random = new Random(); int len = array.length; for (int i = len; i > 0; i--) {

课程设计说明书 NO.21

int j = random.nextInt(i); int temp = array[i - 1]; array[i - 1] = array[j]; array[j] = temp; } } public boolean oneLineWithoutValue(ArrayPoint p1, ArrayPoint p2) { if (horizonMatch(p1, p2)) { return true; } else if (verticalMatch(p1, p2)) { return true; } return false; } public boolean oneLine(ArrayPoint p1, ArrayPoint p2) { if (p1.value != p2.value) { return false; } if (oneLineWithoutValue(p1, p2)) { return true; } return false; } public boolean verticalMatch(ArrayPoint p1, ArrayPoint p2) { if (p1.j != p2.j) { return false; } if (p1.i > p2.i) { ArrayPoint temp = null; temp = p1; p1 = p2; p2 = temp; } 课程设计说明书 NO.22

int spaceCount = p2.i - p1.i; if (spaceCount == 1 && p1.value == p2.value) { return true; } for (int i = p1.i + 1; i < p2.i; i++) { ArrayPoint point = new ArrayPoint(i, p1.j, map[i][p1.j]); if (point.value != 0) { return false; } } return true; } public boolean horizonMatch(ArrayPoint p1, ArrayPoint p2) { if (p1.i != p2.i) { return false; } if (p1.j > p2.j) { ArrayPoint temp = null; temp = p1; p1 = p2; p2 = temp; } int spaceCount = p2.j - p1.j; if (spaceCount == 1 && p1.value == p2.value) { return true; } for (int i = p1.j + 1; i < p2.j; i++) { ArrayPoint p = new ArrayPoint(p1.i, i, map[p1.i][i]); if (p.value != 0) { return false; } } return true; } 课程设计说明书 NO.23

private boolean isSameOne(ArrayPoint p1, ArrayPoint p2) { if (p1.i == p2.i && p1.j == p2.j) { return true; } else { return false; } } public boolean oneConnerWithoutValue(ArrayPoint p1, ArrayPoint p2) { ArrayPoint p1H = new ArrayPoint(p1.i, p2.j, map[p1.i][p2.j]); ArrayPoint p1V = new ArrayPoint(p2.i, p1.j, map[p2.i][p1.j]); if (horizonMatch(p1, p1H) && (p1H.value == 0)) { if (this.verticalMatch(p1H, p2)) { return true; } } if (verticalMatch(p1, p1V) && (p1V.value == 0)) { if (horizonMatch(p1V, p2)) { return true; } } return false; } public boolean oneConner(ArrayPoint p1, ArrayPoint p2) { ArrayPoint p1H = new ArrayPoint(p1.i, p2.j, map[p1.i][p2.j]); ArrayPoint p1V = new ArrayPoint(p2.i, p1.j, map[p2.i][p1.j]); if (p1.value != p2.value) { return false; } if (oneConnerWithoutValue(p1, p2)) { return true; } 课程设计说明书 NO.24

return false; } public boolean twoConner(ArrayPoint p1, ArrayPoint p2) { if (p1.value != p2.value) { return false; } int count = 0; ArrayPoint temp = null; for (int col = p1.j - 1; col >= 0; col--) { temp = new ArrayPoint(p1.i, col, map[p1.i][col]); if ((temp.value == 0) && this.oneLineWithoutValue(p1, temp)) { if (this.oneConnerWithoutValue(temp, p2)) { return true; } } else { break; } } count = Settings.COLUMNS + 2 - p1.j; for (int col = p1.j; col < Settings.COLUMNS + 2; col++) { temp = new ArrayPoint(p1.i, col, map[p1.i][col]); if ((temp.value == 0) && oneLineWithoutValue(p1, temp)) { if (oneConnerWithoutValue(temp, p2)) { return true; } } } count = p1.i; for (int row = count - 1; row >= 0; row--) { temp = new ArrayPoint(row, p1.j, map[row][p1.j]); if ((temp.value == 0) && oneLineWithoutValue(p1, temp)) { 课程设计说明书 NO.25

if (oneConnerWithoutValue(temp, p2)) { return true; } } } for (int row = p1.i + 1; row < Settings.ROWS + 2; row++) { temp = new ArrayPoint(row, p1.j, map[row][p1.j]); if ((temp.value == 0) && oneLineWithoutValue(p1, temp)) { if (oneConnerWithoutValue(temp, p2)) { return true; } } } return false; } public boolean match(ArrayPoint p1, ArrayPoint p2) { if (this.isSameOne(p1, p2)) return false; if (oneLine(p1, p2)) { map[p1.i][p1.j] = 0; map[p2.i][p2.j] = 0; LEFTCOUNT -= 2; return true; } if (oneConner(p1, p2)){ map[p1.i][p1.j] = 0; map[p2.i][p2.j] = 0; LEFTCOUNT -= 2; } if (twoConner(p1, p2)){ map[p1.i][p1.j] = 0; map[p2.i][p2.j] = 0; LEFTCOUNT -= 2; return true; } return false; }

本文来源:https://www.bwwdw.com/article/a5sx.html

Top