《Java课程设计》word版 (2).doc_第1页
《Java课程设计》word版 (2).doc_第2页
《Java课程设计》word版 (2).doc_第3页
《Java课程设计》word版 (2).doc_第4页
《Java课程设计》word版 (2).doc_第5页
已阅读5页,还剩16页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

太原工业学院计算机工程系Java课程设计 题目:人物连连看一、 设计题目 人物连连看二、 设计目的 Java语言是当今流行的网络编程语言,它具有面向对象、跨平台、分布应用等特点。面向对象的开发方法是当今世界最流行的开发方法,它不仅具有更贴近自然的语义,而且有利于软件的维护和继承。学会Java程序的开发的环境搭建和配置,并在实际中学习和掌握Java程序开发的全过程。进一步熟悉Java程序设计语言的基础内容,如用户图形界面设计、Java多线程编程、Applet程序的设计。三、 功能描述通过Java语言编写一个人物连连看程序。程序实现以下几个功能:1、判断鼠标点击的两张图片是否相同;2、判断2张图片是否可以相连;3、判断时间;4、判断是否使用炸弹,炸弹剩余数目,自动生成路径消除两张相同图片;5、判断剩余图片,是否胜利。四流程图五、源代码 1. import .URL;import javax.swing.ImageIcon;import javax.swing.JButton;import cn.elva.Settings;import cn.elva.model.ArrayPoint;public class ChessButton extends JButton/ 按钮所对应的数组中的值和位置,用ArrayPoint结构来表示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 =Resource/+point.getValue() + Settings.RELEX;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;2.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 JFrameprivate 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 JMenuItem tiprivate JMenuBar initMenuBar()if (menuBar = null)menuBar = new JMenuBar();fileMenu = new JMenu(文件);startItem = new JMenuItem(开始游戏);startItem.addActionListener(new ActionListener()public void actionPerformed(ActionEvent e)reload(););reloadItem = new JMenuItem(重来一次);reloadItem.addActionListener(new ActionListener()public void actionPerformed(ActionEvent e)reload(););bombItem = new JMenuItem(炸弹);bombItem.addActionListener(new ActionListener()public void actionPerformed( ActionEvent e )if( bombCount=0 )JOptionPane.showMessageDialog(MainFrame.this,你已经没有炸弹可用了! );bombItem.setEnabled(false);return;mapUI.bomb();bombCount-;);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)/ PAN_TODO 自动生成方法存根SwingUtilities.invokeLater(new Runnable()public void run()MainFrame thisClass = new MainFrame();thisClass.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);thisClass.setVisible(true););public MainFrame()super();initialize();private void initialize()this.setSize(900, 900);this.setTitle(llk);this.setJMenuBar(initMenuBar();/ this.setContentPane(getJContentPane();this.setTitle(连连看);private void reload()mapUI = new MapUI();startTime = System.currentTimeMillis() / 1000;endTime = startTime + Settings.PERTIME;/ jContentPane.setVisible(true);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,重玩一次?, Again, JOptionPane.YES_NO_CANCEL_OPTION);if (result = JOptionPane.YES_OPTION)reload();elsejContentPane.setVisible(false);validate();timer = new javax.swing.Timer(1000, actionListener);timer.start();3.import java.awt.GridLayout;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import javax.swing.JOptionPane;import javax.swing.JPanel;import cn.elva.Settings;import cn.elva.model.ArrayPoint;import cn.elva.model.Map;public class MapUI extends JPanel implements ActionListenerprivate static final long serialVersionUID = 1L;/private int bombCount = Settings.BOMBCOUNT;/ 棋子数组,用按钮来表示private ChessButton chesses = null;/ 数据模型private Map map = new Map();/ 判断当前点击的棋子是否是第二次选中的private boolean two = false;/ 前面点的那个棋子private ArrayPoint priviousPoint;/ 第二次选中的棋子private ArrayPoint currPoint;/* * 构造函数 */public MapUI()super();initialize();/* * 初始化函数 * * return void */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(chessesrow * (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;/ 对棋子的数据模型,即ArrayPoint对象进行设置,指定此棋子具体的位置和值chessesindex = new ChessButton(row, col, valuesrowcol);/ 添加监听器chessesindex.addActionListener(this);/ 将外围的一圈设为不可见,行,列为0 和为最大值的情况if (row = 0 | row = (Settings.ROWS + 2 - 1) | col = 0| col = (Settings.COLUMNS + 2 - 1)chessesindex.setVisible(false);public void clearCheese(ArrayPoint priviousPoint, ArrayPoint currPoint)/ 处理匹配,看两点中否联通/ 获得数据模型中的数组int values = map.getMap();/ 将模型中对应的棋子设为0valuespriviousPoint.getI()priviousPoint.getJ() = 0;valuescurrPoint.getI()currPoint.getJ() = 0;/ 使两个已经消除的按钮不可见int index1 = priviousPoint.getI() * (Settings.COLUMNS + 2)+ priviousPoint.getJ();int index2 = currPoint.getI() * (Settings.COLUMNS + 2)+ currPoint.getJ();chessesindex1.setVisible(false);chessesindex2.setVisible(false);/ 如果棋子总数已为0,则程序结束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/ 将当前点击的棋子赋给变量priviousPointthis.priviousPoint = p;/ 标志位设为TRUE,用于点击下个棋子的时候使用two = true;/* * 炸弹的功能 * */public void bomb()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 (valuesrowcol != 0)p1 = new ArrayPoint(row, col, valuesrowcol);for (int i = 1; i Settings.ROWS + 1; i+)for (int j = 1; j Settings.COLUMNS + 1; j+)if (valuesij != 0)p2 = new ArrayPoint(i, j, valuesij);elsecontinue;/System.out.println(p1 + | + p2);if (map.match(p1, p2)clearCheese(p1, p2);return;4.package cn.elva;public interface Settings/行数public static final int ROWS = 8;/列数public static final int COLUMNS=8;/图片后缀名public static final String RELEX=.jpg;/每局所花时间(秒)public static final int PERTIME = 600;/判断的时间间隔public static final int PER = 1;/炸弹的使用次数public static final int BOMBCOUNT = 3;5.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+,+j+,+value;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;6.package cn.elva.model;import java.util.Random;import cn.elva.Settings;public class Mappublic static int LEFTCOUNT = Settings.ROWS * Settings.COLUMNS;/ 让其最外层的数据不显示,可以解决边框消除不掉的情况private int map = new intSettings.ROWS + 2Settings.COLUMNS + 2;/ private ArrayPoint prePoint;/ private ArrayPoint currPoint;/ 出现的不同图片个数private int maxKinds = 4;public Map()init();public int getMap()return map;private void init()int tempArr = new intSettings.ROWS * Settings.COLUMNS;int len = tempArr.length;/ 根据图片的种类数来确定数组大小,如有64张图片,每四个为一样的,则需要图片数为64/4=16for (int i = 0; i len / maxKinds; i+)tempArri * 4 = i + 1;tempArri * 4 + 1 = i + 1;tempArri * 4 + 2 = i + 1;tempArri * 4 + 3 = i + 1;/ 打乱一维数组内数据的排列random(tempArr);/ 填充到二维数组中for (int i = 1; i Settings.ROWS + 1; i+)for (int j = 1; j 0; i-)int j = random.nextInt(i);int temp = arrayi - 1;arrayi - 1 = arrayj;arrayj = 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;/ 之间的相隔的棋子数int spaceCount = p2.i - p1.i;/ 如果相邻,直接消除if (spaceCount = 1 & p1.value = p2.value)return true;for (int i = p1.i + 1; i p2.j)ArrayPoint temp = null;temp = p1;p1 = p2;p2 = temp;/ 水平相隔棋子数int spaceCount =

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论