




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、太原工業(yè)學(xué)院計(jì)算機(jī)工程系Java課程設(shè)計(jì) 題目:人物連連看一、 設(shè)計(jì)題目 人物連連看二、 設(shè)計(jì)目的 Java語(yǔ)言是當(dāng)今流行的網(wǎng)絡(luò)編程語(yǔ)言,它具有面向?qū)ο?、跨平臺(tái)、分布應(yīng)用等特點(diǎn)。面向?qū)ο蟮拈_(kāi)發(fā)方法是當(dāng)今世界最流行的開(kāi)發(fā)方法,它不僅具有更貼近自然的語(yǔ)義,而且有利于軟件的維護(hù)和繼承。學(xué)會(huì)Java程序的開(kāi)發(fā)的環(huán)境搭建和配置,并在實(shí)際中學(xué)習(xí)和掌握J(rèn)ava程序開(kāi)發(fā)的全過(guò)程。進(jìn)一步熟悉Java程序設(shè)計(jì)語(yǔ)言的基礎(chǔ)內(nèi)容,如用戶圖形界面設(shè)計(jì)、Java多線程編程、Applet程序的設(shè)計(jì)。三、 功能描述通過(guò)Java語(yǔ)言編寫(xiě)一個(gè)人物連連看程序。程序?qū)崿F(xiàn)以下幾個(gè)功能:1、判斷鼠標(biāo)點(diǎn)擊的兩張圖片是否相同;2、判斷2張圖片
2、是否可以相連;3、判斷時(shí)間;4、判斷是否使用炸彈,炸彈剩余數(shù)目,自動(dòng)生成路徑消除兩張相同圖片;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/ 按鈕所對(duì)應(yīng)的數(shù)組中的值和位置,用ArrayPoint結(jié)構(gòu)來(lái)表示protected ArrayPoint point =
3、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 );thi
4、s.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 ja
5、vax.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
6、 serialVersionUID = 1L;private int bombCount = Settings.BOMBCOUNT; /炸彈的次數(shù)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 exit
7、Item = null;private MapUI mapUI = null;/ 游戲開(kāi)始時(shí)間private long startTime;/ 結(jié)束時(shí)間private long endTime;private Timer timer = null;/ private JMenuItem tiprivate JMenuBar initMenuBar()if (menuBar = null)menuBar = new JMenuBar();fileMenu = new JMenu("文件");startItem = new JMenuItem("開(kāi)始游戲")
8、;startItem.addActionListener(new ActionListener()public void actionPerformed(ActionEvent e)reload(););reloadItem = new JMenuItem("重來(lái)一次");reloadItem.addActionListener(new ActionListener()public void actionPerformed(ActionEvent e)reload(););bombItem = new JMenuItem("炸彈");bombItem.a
9、ddActionListener(new ActionListener()public void actionPerformed( ActionEvent e )if( bombCount=0 )JOptionPane.showMessageDialog(MainFrame.this,"你已經(jīng)沒(méi)有炸彈可用了!" );bombItem.setEnabled(false);return;mapUI.bomb();bombCount-;);exitItem = new JMenuItem("退出");exitItem.addActionListener(new
10、 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 自動(dòng)生成方法存根SwingUtilities.invokeLater(new Runn
11、able()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();/ th
12、is.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();jCont
13、entPane.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
14、 e)startTime = System.currentTimeMillis() / 1000;if (startTime = endTime)JOptionPane.showMessageDialog(MainFrame.this, "時(shí)間到了!");int result = JOptionPane.showConfirmDialog(MainFrame.this,"重玩一次?", "Again", JOptionPane.YES_NO_CANCEL_OPTION);if (result = JOptionPane.YES_OPT
15、ION)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.Set
16、tings;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;/ 棋子數(shù)組,用按鈕來(lái)表示private ChessButton chesses = null;/ 數(shù)據(jù)模型private Map map = new Map();/ 判斷
17、當(dāng)前點(diǎn)擊的棋子是否是第二次選中的private boolean two = false;/ 前面點(diǎn)的那個(gè)棋子private ArrayPoint priviousPoint;/ 第二次選中的棋子private ArrayPoint currPoint;/* * 構(gòu)造函數(shù) */public MapUI()super();initialize();/* * 初始化函數(shù) * * return void */private void initialize()initChesses();GridLayout gridLayout = new GridLayout(Settings.ROWS + 2,Se
18、ttings.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(
19、)int values = map.getMap();/ 初始化棋子,和數(shù)據(jù)模型里保持一樣this.chesses = new ChessButton(Settings.ROWS + 2)* (Settings.COLUMNS + 2);for (int row = 0; row < 10; row+)for (int col = 0; col < 10; col+)/ 通過(guò)二維的數(shù)據(jù)模型坐標(biāo)得到一維的棋子坐標(biāo)int index = row * (Settings.COLUMNS + 2) + col;/ 對(duì)棋子的數(shù)據(jù)模型,即ArrayPoint對(duì)象進(jìn)行設(shè)置,指定此棋子具體的位置和
20、值chessesindex = new ChessButton(row, col, valuesrowcol);/ 添加監(jiān)聽(tīng)器chessesindex.addActionListener(this);/ 將外圍的一圈設(shè)為不可見(jiàn),行,列為0 和為最大值的情況if (row = 0 | row = (Settings.ROWS + 2 - 1) | col = 0| col = (Settings.COLUMNS + 2 - 1)chessesindex.setVisible(false);public void clearCheese(ArrayPoint priviousPoint, Arra
21、yPoint currPoint)/ 處理匹配,看兩點(diǎn)中否聯(lián)通/ 獲得數(shù)據(jù)模型中的數(shù)組int values = map.getMap();/ 將模型中對(duì)應(yīng)的棋子設(shè)為0valuespriviousPoint.getI()priviousPoint.getJ() = 0;valuescurrPoint.getI()currPoint.getJ() = 0;/ 使兩個(gè)已經(jīng)消除的按鈕不可見(jiàn)int index1 = priviousPoint.getI() * (Settings.COLUMNS + 2)+ priviousPoint.getJ();int index2 = currPoint.getI
22、() * (Settings.COLUMNS + 2)+ currPoint.getJ();chessesindex1.setVisible(false);chessesindex2.setVisible(false);/ 如果棋子總數(shù)已為0,則程序結(jié)束if (map.LEFTCOUNT = 0)JOptionPane.showMessageDialog(this, "恭喜您通過(guò)!");/* * 事件監(jiān)聽(tīng)器處理函數(shù),也是處理棋子消除的地方 */public void actionPerformed(ActionEvent e)/ 獲得當(dāng)前的柜子ChessButton but
23、ton = (ChessButton) e.getSource();/ 獲得當(dāng)前棋子的數(shù)據(jù)結(jié)構(gòu)ArrayPoint p = button.getPoint();/ 如果已有兩個(gè)棋子選中, 則進(jìn)行判斷操作if (two)currPoint = p;if( map.match(this.priviousPoint, this.currPoint)clearCheese(this.priviousPoint, this.currPoint);/ 設(shè)置為沒(méi)有兩個(gè)按鈕的選中的狀態(tài)two = false;else/ 將當(dāng)前點(diǎn)擊的棋子賦給變量priviousPointthis.priviousPoint =
24、 p;/ 標(biāo)志位設(shè)為TRUE,用于點(diǎn)擊下個(gè)棋子的時(shí)候使用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, val
25、uesrowcol);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 S
26、ettings/行數(shù)public static final int ROWS = 8;/列數(shù)public static final int COLUMNS=8;/圖片后綴名public static final String RELEX=".jpg"/每局所花時(shí)間(秒)public static final int PERTIME = 600;/判斷的時(shí)間間隔public static final int PER = 1;/炸彈的使用次數(shù)public static final int BOMBCOUNT = 3;5.package cn.elva.model;public
27、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 in
28、t 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;/ 讓其最外層的數(shù)據(jù)不顯示,
29、可以解決邊框消除不掉的情況private int map = new intSettings.ROWS + 2Settings.COLUMNS + 2;/ private ArrayPoint prePoint;/ private ArrayPoint currPoint;/ 出現(xiàn)的不同圖片個(gè)數(shù)private int maxKinds = 4;public Map()init();public int getMap()return map;private void init()int tempArr = new intSettings.ROWS * Settings.COLUMNS;int l
30、en = tempArr.length;/ 根據(jù)圖片的種類數(shù)來(lái)確定數(shù)組大小,如有64張圖片,每四個(gè)為一樣的,則需要圖片數(shù)為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;/ 打亂一維數(shù)組內(nèi)數(shù)據(jù)的排列random(tempArr);/ 填充到二維數(shù)組中for (int i = 1; i < Settings.ROWS + 1; i+)for (int
31、j = 1; j < Settings.COLUMNS + 1; j+)this.mapij = 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-)int j = random.nextInt(i);int temp = arrayi - 1;arrayi - 1 = arrayj;arrayj = temp;public boo
32、lean 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 bo
33、olean 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;/ 之間的相隔的棋子數(shù)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+
34、)ArrayPoint point = new ArrayPoint(i, p1.j, mapip1.j);/ 只要其值為0就表示沒(méi)有棋子if (point.value != 0)return false;return true;public boolean horizonMatch(ArrayPoint p1, ArrayPoint p2)/ 如果行行號(hào)不等的話,剛不是水平方向的結(jié)果if (p1.i != p2.i)return false;if (p1.j > p2.j)ArrayPoint temp = null;temp = p1;p1 = p2;p2 = temp;/ 水平相隔
35、棋子數(shù)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, mapp1.ii);if (p.value != 0)return false;return true;private boolean isSameOne(ArrayPoint p1, ArrayPoint p2)if (p1.i =
36、 p2.i && p1.j = p2.j)return true;elsereturn false;public boolean oneConnerWithoutValue(ArrayPoint p1, ArrayPoint p2)/ 獲取P1水平方向的拐點(diǎn)ArrayPoint p1H = new ArrayPoint(p1.i, p2.j, mapp1.ip2.j);/ 獲取P1垂直方向的拐點(diǎn)ArrayPoint p1V = new ArrayPoint(p2.i, p1.j, mapp2.ip1.j);if (horizonMatch(p1, p1H) &&
37、 (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)/ 獲取P1水平方向的拐點(diǎn)ArrayPoint p1H = new ArrayPoint(p1.i, p2.j, mapp1.ip2.j);/ 獲取P1垂直方向的拐點(diǎn)ArrayPoint p1V = new ArrayPoint(p2.i, p1.j, mapp2.ip1.j);if (p1.value != p2.value)return false;if (oneConnerWithoutValue(p1, p2)return true;return false;public boolean twoConner(ArrayPoint p1, ArrayPoint p2)if (p1.value != p2.value)return false;int count = 0;ArrayPoint temp =
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 舞蹈社團(tuán)活動(dòng)風(fēng)采展示
- 蛋制品加工過(guò)程的安全控制
- 危廢處理車間工作總結(jié)
- 通訊寫(xiě)作技巧培訓(xùn)
- 藍(lán)黃色商務(wù)年終總結(jié)
- 醫(yī)院藥品二級(jí)庫(kù)房管理
- 腰痛臨床表現(xiàn)
- 小學(xué)英語(yǔ)連系動(dòng)詞的使用技巧
- 建筑行業(yè)古建筑保護(hù)與維修知識(shí)考點(diǎn)梳理
- 急診科醫(yī)生面對(duì)暴力和攻擊的應(yīng)對(duì)策略
- 數(shù)據(jù)挖掘?qū)д?第5章-分類-其他技術(shù)
- 年產(chǎn)4萬(wàn)噸鄰苯二甲酸酐的工藝設(shè)計(jì)
- 西醫(yī)醫(yī)師開(kāi)具中藥及中藥飲片處方權(quán)限考核試題及答案
- DB37-T 5026-2022《居住建筑節(jié)能設(shè)計(jì)標(biāo)準(zhǔn)》
- BACnet介紹解讀課件
- 全套IECQ QC080000-2017 有害物質(zhì)過(guò)程管理體系程序文件
- 《三角形的分類》-完整版課件
- 鐵路工程預(yù)算定額標(biāo)準(zhǔn)
- 叉車使用申請(qǐng)表
- 《中外歷史綱要上》第4課 西漢與東漢-統(tǒng)一多民族封建國(guó)家的鞏固(課件)(共23張PPT)
- [轉(zhuǎn)載]鄭桂華《安塞腰鼓》教學(xué)實(shí)錄
評(píng)論
0/150
提交評(píng)論