《Java課程設(shè)計(jì)》word版 (2)_第1頁(yè)
《Java課程設(shè)計(jì)》word版 (2)_第2頁(yè)
《Java課程設(shè)計(jì)》word版 (2)_第3頁(yè)
《Java課程設(shè)計(jì)》word版 (2)_第4頁(yè)
《Java課程設(shè)計(jì)》word版 (2)_第5頁(yè)
已閱讀5頁(yè),還剩16頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論