java GUI記憶紙牌游戲(memorize game)

      網(wǎng)友投稿 711 2025-04-04

      Project制作


      首先,一個(gè)小程序的制作要考慮的首先是程序界面的布局;其次是算法的設(shè)計(jì),實(shí)現(xiàn)基本功能;然后再添加其他功能。然后就是Bug以及細(xì)節(jié)的處理;最后就是制作嵌入幫助開發(fā)系統(tǒng)。

      一:界面布局篇

      1:登陸窗口:

      使用的布局管理器:GirdBagLayout(網(wǎng)格組布局管理器也可用Box箱式管理器),在這個(gè)窗口需要對(duì)開始游戲和退出設(shè)置鼠標(biāo)監(jiān)聽,如果開始游戲卻沒輸入名字,會(huì)彈出請(qǐng)出入名字,有名字后開始游戲,會(huì)將這個(gè)名字傳遞到主窗口中。在監(jiān)聽函數(shù)中完成傳遞。

      2:游戲界面:

      這個(gè)界面需要考慮如何將頁面作何很像或是做好。這就需要對(duì)Java布局的深入理解。

      如果認(rèn)為這是一個(gè)邊界布局取中間和下面那就錯(cuò)了,這樣元件會(huì)緊貼邊界排布,影響美觀。

      頂層容器取中:如何在四周留下空隙呢,處理方式有三種,首先使用邊界布局管理器,將所有的元件放在中間是必須的,剩下的就是對(duì)邊界的處理。

      方式一:在各個(gè)邊界添加new JLabel(” ”)中間有空格的JLabel填充一定區(qū)域。

      方式二:在設(shè)置布局的時(shí)候,bordelayout(int,int)設(shè)置你需要的邊界值。這樣邊界就會(huì)有空系。但是,這是在兩邊界使用的情況下,為此,需要在各個(gè)邊界添加new JLabel(),或new JLabel(””)中間無空格的空label。這樣邊界就被名義上的調(diào)用而存在,就會(huì)滿足bordelayout(int,int)兩相鄰邊界的空隙。

      方式三:將各個(gè)邊界使用setpreferredsize()設(shè)置固定各個(gè)邊界的大小。

      本人推薦使用第二種,操作簡(jiǎn)單,也比較精確。

      次層容器取中下,在container的容器取中之后,還剩紙牌和三個(gè)按鈕,紙牌是要統(tǒng)一操作,四個(gè)按鈕要統(tǒng)一操作。頂層容器的中間添加JPanel容器,JPanel容器再次使用邊界布局,只使用中間和下兩個(gè)部分就可以將兩種按鈕分開。

      三層容器:第三層容器的中間部分可以添加一個(gè)網(wǎng)格布局的Jpanel,此JPanel在添加按鈕。下部分可以添加一個(gè)網(wǎng)格布局的Jpanel或Box布局的Box容器。(此方案采用網(wǎng)格布局)

      這樣梳理三層容器各個(gè)所取的部分和布局方式。就可以實(shí)現(xiàn)舒心的布局。

      二:算法實(shí)現(xiàn)篇

      實(shí)現(xiàn)游戲算法的大致分為為:隨機(jī)布局和翻牌判斷

      隨機(jī)布局:

      ① 要將八張牌和一張牌背放到與文件相同的scr文件夾中。用String數(shù)組存下地址(編號(hào)要順序排才能用上數(shù)組),用imageicon/icon數(shù)組順序存入牌,(16個(gè),背面可單獨(dú)存)。這樣順序的1234567812345678十六張牌的圖標(biāo)數(shù)組就存好了。

      ② 開始實(shí)現(xiàn)隨機(jī)放牌,建立16位imageicon/icon數(shù)組,還要建立一個(gè)Integer類型的list集合,用來儲(chǔ)存隨機(jī)圖篇對(duì)應(yīng)的數(shù)字(個(gè)人能力還達(dá)不到比較圖標(biāo),所以把圖的比較轉(zhuǎn)化為數(shù)%8的比較),將隨機(jī)過后的牌順序放入,這是一個(gè)抽象的放牌位置。只是按鈕數(shù)組的執(zhí)行翻牌的時(shí)候?qū)?yīng)的調(diào)用此圖標(biāo)數(shù)組。(按鈕數(shù)組的初始化是背面圖片)。代碼如下:

      public void suiji() { boolean b=false; Random r=new Random(); for(int i=0;i<16;i ) { int randomint=r.nextInt(16); for(int j=0;jlisttime=new ArrayList<>(); for(int i=0;i<16;i ) {listtime.add(i);} for(int i=0;i<16;i ) { int randomint=r.nextInt(listtime.size()); int team=listtime.get(randomint); listtime.remove(randomint); random[i]=image[team];list.add(team); } }

      1

      2

      3

      4

      5

      6

      7

      8

      9

      10

      11

      12

      13

      14

      15

      16

      17

      (本人采用的是第二這種方案。)

      隨機(jī)布局就完成了,在類中繼承Actionlistenner接口,從寫監(jiān)聽函數(shù)。點(diǎn)擊的按鈕對(duì)應(yīng)調(diào)用seticon()相同位置的隨機(jī)排序后的icon/imageicon數(shù)組,就可以完成了。

      翻牌判斷:

      可以建立一個(gè)list1集合裝載所有點(diǎn)擊的按鈕記號(hào)。當(dāng)這個(gè)集合的size()為偶數(shù)時(shí),執(zhí)行判斷,有兩個(gè)結(jié)果,兩張牌相同時(shí),消失,兩張牌不同,把圖標(biāo)設(shè)置成牌背面圖片。這里,牌的判斷就用到之前儲(chǔ)存隨機(jī)數(shù)字的集合,調(diào)用%8看是否相等。

      相等的情況:兩張牌消失。就用到按鈕的一些屬性

      jbutton[list1.get(list1.size()-2)].setIcon(null);

      jbutton[list1.get(list1.size()-2)].setContentAreaFilled(false);// 透明

      jbutton[list1.get(list1.size()-2)].setBorderPainted(false);// 取消邊框

      jbutton[list1.get(list1.size()-2)].setFocusPainted(false); // 取消焦點(diǎn)

      jbutton[list1.get(list1.size()-2)].setEnabled(false);

      jbutton[list1.get(list1.size()-1)].setIcon(null);

      jbutton[list1.get(list1.size()-1)].setContentAreaFilled(false);// 透明

      jbutton[list1.get(list1.size()-1)].setBorderPainted(false);// 取消邊框

      jbutton[list1.get(list1.size()-1)].setFocusPainted(false); // 取消焦點(diǎn)

      jbutton[list1.get(list1.size()-2)].setEnabled(false);

      當(dāng)然,要建立一個(gè)int類型數(shù)字判斷是否結(jié)束,當(dāng)消失一張牌這個(gè)int類型值就加一。當(dāng)?shù)扔?6時(shí)結(jié)束停止。

      兩張牌的判斷是翻開就進(jìn)行的,如果不做處理,就會(huì)遇到一種情況,相同時(shí),還沒看清是否相同就消失了,不相同時(shí),沒看見翻得是什么就返回去了。為了避免這種情況,要在里面添加線程,讓無論消失還是翻過去都要在0.3秒后執(zhí)行。

      三:其他功能篇

      我們添加的其他功能有時(shí)間記錄,Score記錄(i/o),提示功能,背景音樂,結(jié)束事件,重新開始。

      ① 時(shí)間記錄:我們將時(shí)間放在title上顯示,用線程控制,start的時(shí)候開始,消失16張牌的時(shí)候線程結(jié)束。

      ② Score記錄:

      要實(shí)現(xiàn)分?jǐn)?shù)的記錄和姓名的記錄,需要用到IO流的知識(shí)。其中的BufferedReader和BufferedWriter滿足此程序的使用要求,建立io()函數(shù),每點(diǎn)擊一次score就調(diào)用一次。Io()函數(shù)中首先建立file文件,判斷D盤有沒有這個(gè)文件,如果沒有,就再D盤建立一個(gè)tet文件,先讀取該文件的內(nèi)容,按照每行放入String數(shù)組中,再彈出窗口顯示成績(jī)的排名信息。讀取過后再存入放在數(shù)組中的內(nèi)容。(只能先讀取在寫入,否則文件將會(huì)被清空)

      如果游戲結(jié)束,會(huì)自動(dòng)調(diào)用io()儲(chǔ)存記錄,但是不彈出窗口(可用布爾或其他數(shù)值控制)。將數(shù)據(jù)的數(shù)組后一位添加(int)time s 姓名

      ,這里的排序就需要用到字符串分割,spit(”s”),用前面的有效時(shí)間做比較,排序。文件寫入的時(shí)候?qū)懭氩怀^三個(gè)記錄。

      ③ 提示功能:提示功能就是基數(shù)次的時(shí)候會(huì)生效,在前面的list集合中找到數(shù)值%8相等并且數(shù)值不等的那個(gè)數(shù),在對(duì)應(yīng)的按鈕上放一個(gè)線程讓他消失0.3秒在回來,做一個(gè)提示作用。

      ④ 背景音樂和點(diǎn)擊鈴聲:

      背景音樂的添加和圖標(biāo)有點(diǎn)類似但是略有不同,背景音樂的實(shí)現(xiàn)方法如下:

      public AudioClip music;//背景音樂

      URL url=Memorize.class.getResource(“music/fade2.wav”);//源

      {music=Applet.newAudioClip(url);}

      music.play();開始

      如果循環(huán)需要添加:

      try {

      Thread.sleep(40);

      } catch (InterruptedException e1) {

      e1.printStackTrace();

      }

      music.loop();

      此外,這種循環(huán)點(diǎn)擊窗體X音樂還會(huì)繼續(xù)播放,需要設(shè)置一個(gè)關(guān)閉的監(jiān)聽時(shí)間。在主類中implements actionlisterner。在重載函數(shù)中添加

      addWindowListener(new WindowAdapter(){

      public void windowClosing(WindowEvent e){

      System.exit(0); } });

      點(diǎn)擊的鈴聲:

      這個(gè)程序添加兩種點(diǎn)擊鈴聲,一是在按鈕上的鼠標(biāo)點(diǎn)擊事件中直接添加鈴聲1.play();二是在container的容器上添加鼠標(biāo)點(diǎn)擊事件,點(diǎn)擊到?jīng)]有按鈕的區(qū)域會(huì)播放另一種鈴聲。

      ⑤ 結(jié)束事件:當(dāng)十六張牌全部消失時(shí),在放了16個(gè)按鈕的那個(gè)面板上使用removeall();函數(shù),再將面板的布局改為絕對(duì)布局,使用線程1和算法制作出所有的牌從左往右的飛過效果,頂層容器的背景也閃爍更換,(控制線程慢慢減慢)就可以達(dá)到一個(gè)由快到慢的過程。線程1結(jié)束在執(zhí)行線程2,name 恭喜你贏了字畫從上面移到中間,結(jié)束時(shí)下方出現(xiàn)重新開始按鈕和退出按鈕。這里用到線程的加入join()。

      ⑥ 重新開始,設(shè)置restart()函數(shù),將面板再次改為網(wǎng)格布局,重新隨機(jī)化,將變化的數(shù)值再次初始化。

      四:bug和細(xì)節(jié)處理篇

      一個(gè)小程序就要不產(chǎn)生任何Bug優(yōu)化所能優(yōu)化的東西。具體處理有:

      1:圖標(biāo)處理:一個(gè)小程序的制作就應(yīng)該完全是自己的元素,Java咖啡圖標(biāo)應(yīng)該拋去

      核心就是在設(shè)置窗體的時(shí)候使用seticonimage()函數(shù)。

      2:防變形處理:如果你沒有使用特殊的布局或者處理時(shí),你的窗體拉伸或?qū)е潞艹螅苡绊懨烙^,你可以使用固定窗口不可拉伸。對(duì)應(yīng)的函數(shù)為setResizable(false);

      3:位置處理:如果一個(gè)小程序點(diǎn)擊出現(xiàn)在左上角的邊框總有點(diǎn)不好看。可以設(shè)置窗體居中,對(duì)應(yīng)的函數(shù)為:

      setLocationRelativeTo(null)注意:這個(gè)函數(shù)要在setsize()的后面。因?yàn)橐O(shè)置好大小在整個(gè)窗體居中,如果先劇中在設(shè)置大小就會(huì)導(dǎo)致這個(gè)窗體從中心點(diǎn)開始向右下方延伸。

      4.按鈕控制的嚴(yán)謹(jǐn)性,①在start開始前點(diǎn)圖圖片不會(huì)產(chǎn)生鼠標(biāo)點(diǎn)擊事件②圖片被翻開的時(shí)候就不會(huì)被再次點(diǎn)擊,處理不好會(huì)導(dǎo)致連續(xù)點(diǎn)兩次一個(gè)圖片,圖片會(huì)自己消失。③當(dāng)再判斷消失或者翻回去的時(shí)候要注意讓點(diǎn)擊事件不在生效,(因?yàn)樵倥袛嗟臅r(shí)候他在線程內(nèi)你手速太快點(diǎn)擊其他按鈕,那么操作的最近兩個(gè)按鈕就發(fā)生了變化)這個(gè)可以使用控制start的那個(gè)boolean值進(jìn)行判斷。

      5:界面有圖形的變換時(shí)要用好repaint();函數(shù),即使重繪界面。否則,會(huì)出現(xiàn)一些類似“卡主”的界面

      (重新開始游戲沒使用repaint()函數(shù)的結(jié)果)

      6:如果使用線程計(jì)時(shí)器,如果單純的計(jì)時(shí)倒無所謂,如果這個(gè)時(shí)間需要使用,需要對(duì)線程控制好,控制好休眠前自加還是休眠后自加。

      7:線程的生命周期要控制好,設(shè)置好約束條件,該結(jié)束的時(shí)候就結(jié)束,避免占用不必要的資源。

      8:窗口的退出,disopose()關(guān)閉當(dāng)前窗口,system.exit(0);關(guān)閉所有,所以當(dāng)開始游戲的時(shí)候使用dispose();所有的退出使用exit(0);

      9:按鈕過多的時(shí)候?qū)懕O(jiān)聽就不要用內(nèi)部類實(shí)現(xiàn),代碼會(huì)太長(zhǎng)。改用接口匿名會(huì)簡(jiǎn)潔的多。

      五:幫助系統(tǒng)處理篇

      ③ 將幫助文件嵌入到GUI程序中。

      方法一使用的方法:使用cmd指令打開

      代碼如下:

      public void help()

      {

      File file = new File(“doc/help.chm”);

      Runtime ce=Runtime.getRuntime();

      try {

      ce.exec("cmd /c start " file.getAbsolutePath());

      } catch (IOException e) {

      e.printStackTrace();

      }

      }

      這里建立file文件建立相對(duì)路徑,編譯時(shí)相對(duì)與projiect內(nèi)部文件夾,導(dǎo)出時(shí)相對(duì)jar程序。這個(gè),就不用將doc文件放置再固定文件,而是相對(duì)放置就可以使用,在編譯的過程中,路徑名稱不能包括空格,否則會(huì)識(shí)別不出,在運(yùn)行jar文件時(shí),文件夾名稱也不可以改動(dòng)。(很多程序的內(nèi)部文件是不可以改動(dòng)的。)

      方法二使用的方法:也可用借助java.awt.desktop打開

      代碼如下:

      public void help()

      {File file = new File(“doc/help.chm”);

      try {

      Desktop.getDesktop().open(file);

      } catch (IOException e) {

      // TODO 自動(dòng)生成的 catch 塊

      e.printStackTrace();

      }}

      這種方法可以識(shí)別父類路徑中有空格的情況,符合更多需要。此程序從方案一優(yōu)化到方案二。

      附上具體代碼:初始界面:

      import java.awt.Color; import java.awt.Container; import java.awt.FlowLayout; import java.awt.Font; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.ImageIcon; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JTextField; public class chushi extends JFrame implements ActionListener{ static String name=null; //boolean A=false; JButton a=new JButton("開始游戲"); JButton b=new JButton("退 出"); // JButton jb2=new JButton("確定"); JTextField jtex=new JTextField(10); ImageIcon imageicon=new ImageIcon(this.getClass().getResource("image/tubiao.png")); public chushi() { this.setIconImage(imageicon.getImage()); Container c=this.getContentPane(); this.setTitle("memorize game"); this.setSize(450, 250); this.setLocationRelativeTo(null); c.setLayout(new GridBagLayout()); GridBagConstraints d=new GridBagConstraints();//gridbag參數(shù) d.gridx=0;//橫方向 d.gridy=0;//縱方向 d.weighty=0.1; d.anchor=d.SOUTH;//應(yīng)該是對(duì)齊方式吧 //d.gridheight=2; JLabel lab=new JLabel("歡迎來到memorize游戲",JLabel.CENTER); lab.setFont(new Font("宋體",1,30)); lab.setForeground(Color.red); c.add(lab,d);d.anchor=d.CENTER; //需要一行 JPanel jp4=new JPanel(); jp4.setLayout(new FlowLayout()); JLabel lab2=new JLabel("請(qǐng)輸入你的名字",JLabel.CENTER); lab2.setFont(new Font("宋體",1,16)); /// jtex.setFocusable(false); // 取消焦點(diǎn) jp4.add(lab2); //wenben jp4.add(jtex); // jp4.add( jb2); d.gridy=1; c.add(jp4,d); d.gridy=2; c.add(a,d); d.gridy=3; c.add(b,d); a.addActionListener(this);b.addActionListener(this);//jb2.addActionListener(this); this.setVisible(true); this.setDefaultCloseOperation(DISPOSE_ON_CLOSE); } public void actionPerformed(ActionEvent e) { // TODO 自動(dòng)生成的方法存根 if(e.getSource()==a) { if(jtex.getText().equals("")) {JOptionPane.showMessageDialog(this,"請(qǐng)輸入姓名!"); jtex.setFocusable(true); } else {new Memorize().name=jtex.getText();dispose();} } if(e.getSource()==b) {System.exit(0);} //if(e.getSource()==jb2) {A=true;name=jtex.getText();} } }

      1

      2

      3

      4

      5

      6

      7

      8

      9

      10

      11

      12

      13

      14

      15

      16

      17

      18

      19

      20

      21

      22

      23

      24

      25

      26

      27

      28

      29

      30

      31

      32

      33

      34

      35

      36

      37

      38

      39

      40

      41

      42

      43

      44

      45

      46

      47

      48

      49

      50

      51

      52

      53

      54

      55

      56

      57

      58

      59

      60

      61

      62

      63

      64

      65

      66

      67

      68

      69

      70

      71

      72

      73

      74

      75

      76

      77

      78

      游戲界面:

      import java.applet.Applet; import java.applet.AudioClip; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Container; import java.awt.Desktop; import java.awt.FlowLayout; import java.awt.Font; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.awt.GridLayout; import java.awt.Image; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import java.net.URL; import java.util.ArrayList; import java.util.List; import java.util.Random; import javax.swing.ImageIcon; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JTextField; public class Memorize extends JFrame implements ActionListener{ static Thread jishi;int time=-1;//計(jì)時(shí) public AudioClip music;//背景音樂 public AudioClip lingsheng,lingsheng2;//點(diǎn)擊的鈴聲 URL url=Memorize.class.getResource("music/fade2.wav");//源 {music=Applet.newAudioClip(url); lingsheng=Applet.newAudioClip(Memorize.class.getResource("music/lingsheng.wav")); lingsheng2=Applet.newAudioClip(Memorize.class.getResource("music/lingsheng2.wav")); } String shijianjilu[][];//io流 String jilu[];//io boolean judgleB=false;//io boolean tanchu=false;// String name=""; static boolean A=false;//控制start static boolean a[]=new boolean[16];//是否應(yīng)該消失 boolean b[]=new boolean[16];//為true時(shí)不可在點(diǎn)擊 static int B=0;//計(jì)算已經(jīng)消失的牌數(shù) static Listlist1=new ArrayList<>();//存放了點(diǎn)擊按鈕的編號(hào) //中間板塊所需要的部件 static List list=new ArrayList<>();//存放了隨機(jī)過后的數(shù)字順序 ImageIcon imageicon=new ImageIcon(this.getClass().getResource("image/beimian.jpg")); Image beimian=imageicon.getImage(); String sousename[]=new String[8];//牌的名字 ImageIcon image[]=new ImageIcon[16];//16張牌 icon也可以 ImageIcon random[]=new ImageIcon[16];//使用過隨機(jī)數(shù)后的圖標(biāo)數(shù)組 static JButton jbutton[]=new JButton[16]; //下面板塊所需要的部件 JButton start=new JButton("Start"); //start按鈕 JButton score=new JButton("Score"); //score按鈕 JButton hint=new JButton("hint"); JButton help=new JButton("Help"); //help按鈕 JButton restart=new JButton("重新開始"); JButton exit =new JButton("退出"); //中間 //中間上網(wǎng)格 //中間下網(wǎng)格 JPanel jp=new JPanel();JPanel jp2=new JPanel();JPanel jp1=new JPanel(); Container c=this.getContentPane(); /** * 構(gòu)造函數(shù) **/ public Memorize() { fuzhi();//賦值sousename和image數(shù)組 suiji();//賦值random數(shù)組 addjubutton(); c.setLayout(new BorderLayout(30,20)); c.setBackground(new Color(250,100,120)); //this.setResizable(false); this.setTitle("memorize game"); this.setIconImage(beimian); this.setSize(800, 900); this.setLocationRelativeTo(null); this.setVisible(true); this.setDefaultCloseOperation(DISPOSE_ON_CLOSE); setResizable(false); jp.setLayout(new BorderLayout(20,20)); jp1.setLayout(new GridLayout(4,4,40,20));//中間 jp2.setLayout(new GridLayout(1,4,20, 0));//下面 c.add(new JLabel(""),BorderLayout.NORTH); c.add(new JLabel(""),BorderLayout.WEST); c.add(new JLabel(""),BorderLayout.EAST); c.add(new JLabel(""),BorderLayout.SOUTH); c.add(jp,BorderLayout.CENTER); jp.setOpaque(false);//設(shè)置面板為透明必須有 jp2.setOpaque(false);//jp2(下面設(shè)置為透明) jp1.setOpaque(false); jp.add(jp1,BorderLayout.CENTER); jp.add(jp2,BorderLayout.SOUTH); jp2.add(start); jp2.add(score); jp2.add(hint); jp2.add(help); hint.addActionListener(this); help.addActionListener(this); start.addActionListener(this); score.addActionListener(this); restart.addActionListener(this); exit.addActionListener(this); c.addMouseListener(new MouseAdapter() { public void mouseClicked(MouseEvent e) { lingsheng2.play(); } }); addWindowListener(new WindowAdapter(){ public void windowClosing(WindowEvent e){ System.exit(0); } }); //end(); } /** * 設(shè)置標(biāo)題,用于線程中重復(fù)設(shè)置個(gè)性標(biāo)題 **/ public void settile() { this.setTitle("memorize game-用時(shí)" time "s"); } /** * 計(jì)時(shí)器,標(biāo)題的計(jì)時(shí)和最后的時(shí)間結(jié)束截取 **/ public void jishi() { jishi=new Thread(new Runnable() { public void run() { while(B<16) { time ; settile(); try {Thread.sleep(1000);}//休眠1S catch(Exception e) {e.printStackTrace();} } } }); jishi.start(); } /** * 使用String的特性賦值icon/imageicon數(shù)組 **/ public void fuzhi() { for(int i=0;i<16;i ) { sousename [i%8]="image/" (i%8 1) ".jpg"; //簡(jiǎn)化代碼 image[i]=new ImageIcon(this.getClass().getResource(sousename[i%8])); } } /** * 隨機(jī)排序位置 **/ public void suiji() { Random r=new Random(); Listlisttime=new ArrayList<>(); for(int i=0;i<16;i ) {listtime.add(i);} for(int i=0;i<16;i ) { int randomint=r.nextInt(listtime.size()); int team=listtime.get(randomint); listtime.remove(randomint); random[i]=image[team];list.add(team); } } /** * 當(dāng)開始的時(shí)候和重新開始的時(shí)候需要重新添加按鈕 **/ public void addjubutton() { for(int i=0;i<16;i ) { jbutton[i]=new JButton(imageicon); jbutton[i].addActionListener(this); jp1.add(jbutton[i]); } } /** * 結(jié)束事件,利用兩個(gè)線程的動(dòng)畫 **/ public void end() { jp1.removeAll(); jp1.setLayout(null); JLabel jl=new JLabel(name ",恭喜你贏了",JLabel.CENTER); //jl.setForeground(Color.black); jl.setFont(new Font("宋體",0,24)); jp1.add(jl); jp1.setOpaque(false); JLabel label[]=new JLabel[16]; for(int j=0;j<16;j ) {label[j]=new JLabel(image[j]);jp1.add(label[j]);label[j].setBounds(0, 120 j/8*280, 150, 200);} //jp.add(jp1,BorderLayout.CENTER); Random r=new Random();//背景更換 Color color[]={Color.ORANGE,Color.red,Color.yellow,Color.cyan,Color.pink}; Thread d0=new Thread(new Runnable() { int i=0; int count=0; public void run() { while(i<8) {if(count/10%5==0) { int randomint=r.nextInt(5); c.setBackground(color[randomint]);} label[i].setBounds(count, 120, 150, 200); label[i 8].setBounds(count, 400, 150, 200); repaint(); count=count 10; if(count>800) {i ;count=0;} try { Thread.sleep(2 i);} catch(InterruptedException e){System.out.println("當(dāng)前線程被中斷");break;} } } }); Thread d1=new Thread(new Runnable() { int count=0; public void run() { while(count<350) { c.setBackground(new Color(250,100,120)); jl.setBounds(180, count, 400, 100); jl.setFont(new Font("宋體",0,24 count/20)); if(count0==0) { jl.setForeground(color[count/15%5]);} count=count 2; if(count==348) { jp1.add(restart);restart.setBounds(200, 450, 150, 40); jp1.add(exit);exit.setBounds(400, 450, 150, 40); restart.setFont(new Font("宋體",1,22));exit.setFont(new Font("宋體",1,22));} try {Thread.sleep(10);d0.join();} catch(InterruptedException e){System.out.println("當(dāng)前線程被中斷");break;} } }}); d0.start();d1.start(); setVisible(true); } /** * 儲(chǔ)存成績(jī)和姓名的函數(shù) **/ public void io()//結(jié)束時(shí)調(diào)用 { //String jilu[]=new String[4]; shijianjilu=new String[4][];//io流 jilu=new String[4]; int geshu=0; File file=new File("word.txt"); if(!file.exists()) {try { file.createNewFile();} catch (IOException e) { // TODO 自動(dòng)生成的 catch 塊 e.printStackTrace();}} try {//先讀取 FileReader fi=new FileReader(file); BufferedReader bffi=new BufferedReader(fi); String s=null;int exam=0; while((s=bffi.readLine())!=null) { jilu[exam ]=s; //System.out.println(s); } if(B==16&&judgleB==false) { jilu[exam]=time "s" "姓名:" name;exam ;judgleB=true;} geshu=exam; if(exam==0&&tanchu) {tanchu=false; JOptionPane.showMessageDialog(this, "you will be the NO.1!"); } if(exam==1&&tanchu) { tanchu=false;JOptionPane.showMessageDialog(this,"top1玩家用時(shí):" jilu[0]); } for(int j=0;j Integer.parseInt(shijianjilu[1][0])) { String temp=jilu[0];jilu[0]=jilu[1];jilu[1]=temp; }if(tanchu) {tanchu=false;JOptionPane.showMessageDialog(this,"top1玩家用時(shí):" jilu[0] "\ntop2玩家用時(shí):" jilu[1]);} } if(exam==3) {//paixu if(Integer.parseInt(shijianjilu[1][0])> Integer.parseInt(shijianjilu[2][0])) { String temp=jilu[1];jilu[1]=jilu[2];jilu[2]=temp; if(Integer.parseInt(shijianjilu[0][0])> Integer.parseInt(shijianjilu[2][0])) { String temp2=jilu[0];jilu[0]=jilu[1];jilu[1]=temp2; } if(tanchu) {tanchu=false;JOptionPane.showMessageDialog(this,"top1玩家用時(shí):" jilu[0] "\ntop2玩家用時(shí):" jilu[1]);} } } bffi.close(); fi.close(); } catch (Exception e) { // TODO 自動(dòng)生成的 catch 塊 e.printStackTrace(); } if(geshu!=0) { try {FileWriter writer=new FileWriter(file); BufferedWriter bfwriter=new BufferedWriter(writer); for(int i=0;i<2;i ) { bfwriter.write(jilu[i]); bfwriter.newLine(); // System.out.println(jilu[i]); } bfwriter.close(); writer.close(); } catch(Exception e) {e.printStackTrace();} }} /** * 判斷函數(shù) * 用于判斷是該消失還是翻回去 * 判斷是否結(jié)束 **/ public void judgle() { if(list1.size()%2==0) //最后那組數(shù)據(jù)用偶數(shù)判斷 { A=false; Thread d1=new Thread(new Runnable() { public void run() { int count=0; while(count<3) { if(count==1&&list.get(list1.get(list1.size()-1))%8==list.get(list1.get(list1.size()-2))%8) { jbutton[list1.get(list1.size()-1)].setIcon(null); jbutton[list1.get(list1.size()-1)].setContentAreaFilled(false);// 透明 jbutton[list1.get(list1.size()-1)].setBorderPainted(false);// 取消邊框 jbutton[list1.get(list1.size()-1)].setFocusPainted(false); // 取消焦點(diǎn) jbutton[list1.get(list1.size()-1)].setEnabled(false); jbutton[list1.get(list1.size()-2)].setIcon(null); jbutton[list1.get(list1.size()-2)].setContentAreaFilled(false);// 透明 jbutton[list1.get(list1.size()-2)].setBorderPainted(false);// 取消邊框 jbutton[list1.get(list1.size()-2)].setFocusPainted(false); // 取消焦點(diǎn) jbutton[list1.get(list1.size()-2)].setEnabled(false); a[list1.get(list1.size()-2)]=true;B ; a[list1.get(list1.size()-1)]=true;B ; // listhelp.remove(list1.get(list1.size()-2)); // listhelp.remove(list1.get(list1.size()-1)); A=true; } if(count==1&&list.get(list1.get(list1.size()-1))%8!=list.get(list1.get(list1.size()-2))%8) { if(a[list1.get(list1.size()-2)]==false) jbutton[list1.get(list1.size()-1)].setIcon(imageicon); b[list1.get(list1.size()-1)]=false; jbutton[list1.get(list1.size()-2)].setIcon(imageicon);b[list1.get(list1.size()-2)]=false; A=true; } if(count==2) { if(B==16) {io();end();} } count ; try {Thread.sleep(300);} catch(InterruptedException e){System.out.println("當(dāng)前線程被中斷");} } } }); d1.start(); } } /** * 提示功能 * 點(diǎn)擊為奇數(shù)時(shí)可以提示另一張牌的位置。 **/ public void hint() { if(list1.size()%2==1) { for(int i=0;i();//存放了點(diǎn)擊按鈕的編號(hào) list=new ArrayList<>(); jp1.removeAll(); jp1.setLayout(new GridLayout(4,4,40,20));//中間 io(); suiji(); addjubutton(); repaint(); setVisible(true); } /** * 重寫的鼠標(biāo)監(jiān)聽函數(shù) **/ public void actionPerformed(ActionEvent e) { // TODO 自動(dòng)生成的方法存根 lingsheng.play(); if(e.getSource()==hint) { hint(); } if(e.getSource()==help) { help(); } if(e.getSource()==start) {if(!A){A=true;music.play();try { Thread.sleep(40); } catch (InterruptedException e1) { //TODO 自動(dòng)生成的 catch 塊 e1.printStackTrace(); } music.loop(); jishi(); } } if(e.getSource()==score) {tanchu=true;io();}//位置放錯(cuò)會(huì)導(dǎo)致第一次點(diǎn)擊不出現(xiàn) if(A) //數(shù)組監(jiān)聽 {for(int i=0;i<16;i ) { if(e.getSource()==jbutton[i]) { if(b[i]==false) { jbutton[i].setIcon(random[i]);list1.add(i); judgle(); b[i]=true; } }} } if(e.getSource()==restart) {restart();} if(e.getSource()==exit) {System.exit(0);} } public static void main(String[] args) { chushi kaishi=new chushi(); //執(zhí)行開始界面 }}

      1

      2

      3

      4

      5

      6

      7

      8

      9

      10

      11

      12

      13

      14

      15

      16

      17

      18

      19

      20

      21

      22

      23

      24

      25

      26

      27

      28

      29

      30

      31

      32

      33

      34

      35

      36

      37

      38

      39

      40

      41

      42

      43

      44

      45

      46

      47

      48

      49

      50

      51

      52

      53

      54

      55

      56

      57

      58

      59

      60

      61

      62

      63

      64

      65

      66

      67

      68

      69

      70

      71

      72

      73

      74

      75

      76

      77

      78

      79

      80

      81

      82

      83

      84

      85

      86

      87

      88

      89

      90

      91

      92

      93

      94

      95

      96

      97

      98

      99

      100

      101

      102

      103

      104

      105

      106

      107

      108

      109

      110

      111

      112

      113

      114

      115

      116

      117

      118

      119

      120

      121

      122

      123

      124

      125

      126

      127

      128

      129

      130

      131

      132

      133

      134

      135

      136

      137

      138

      139

      140

      141

      142

      143

      144

      145

      146

      147

      148

      149

      150

      151

      152

      153

      154

      155

      156

      157

      158

      159

      160

      161

      162

      163

      164

      165

      166

      167

      168

      169

      170

      171

      172

      173

      174

      175

      176

      177

      178

      179

      180

      181

      182

      183

      184

      185

      186

      187

      188

      189

      190

      191

      192

      193

      194

      195

      196

      197

      198

      199

      200

      201

      202

      203

      204

      205

      206

      207

      208

      209

      210

      211

      212

      213

      214

      215

      216

      217

      218

      219

      220

      221

      222

      223

      224

      225

      226

      227

      228

      229

      230

      231

      232

      233

      234

      235

      236

      237

      238

      239

      240

      241

      242

      243

      244

      245

      246

      247

      248

      249

      250

      251

      252

      253

      254

      255

      256

      257

      258

      259

      260

      261

      262

      263

      264

      265

      266

      267

      268

      269

      270

      271

      272

      273

      274

      275

      276

      277

      278

      279

      280

      281

      282

      283

      284

      285

      286

      287

      288

      289

      290

      291

      292

      293

      294

      295

      296

      297

      298

      299

      300

      301

      302

      303

      304

      305

      306

      307

      308

      309

      310

      311

      312

      313

      314

      315

      316

      317

      318

      319

      320

      321

      322

      323

      324

      325

      326

      327

      328

      329

      330

      331

      332

      333

      334

      335

      336

      337

      338

      339

      340

      341

      342

      343

      344

      345

      346

      347

      348

      349

      350

      351

      352

      353

      354

      355

      356

      357

      358

      359

      360

      361

      362

      363

      364

      365

      366

      367

      368

      369

      370

      371

      372

      373

      374

      375

      376

      377

      378

      379

      380

      381

      382

      383

      384

      385

      386

      387

      388

      389

      390

      391

      392

      393

      394

      395

      396

      397

      398

      399

      400

      401

      402

      403

      404

      405

      406

      407

      408

      409

      410

      411

      412

      413

      414

      415

      416

      417

      418

      419

      java GUI記憶紙牌游戲(memorize game)

      420

      421

      422

      423

      424

      425

      426

      427

      428

      429

      430

      431

      432

      433

      434

      5G游戲 AI GUI Java 容器

      版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。

      版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。

      上一篇:怎么在表格里查找?(怎么在表格里查找)
      下一篇:excel打印預(yù)覽多出來一列該怎么辦?
      相關(guān)文章
      亚洲午夜久久久久妓女影院| 亚洲成人网在线播放| 亚洲人成网站在线观看播放青青| 国产AV无码专区亚洲AV男同| 亚洲黄黄黄网站在线观看| 亚洲精品伦理熟女国产一区二区 | 亚洲国产精品无码第一区二区三区| 亚洲嫩草影院在线观看| 亚洲综合视频在线| 亚洲成Av人片乱码色午夜| 亚洲精品国产精品乱码不99| 中文字幕在亚洲第一在线| 亚洲国产精品专区在线观看 | 日本中文一区二区三区亚洲| 国产亚洲精彩视频| 亚洲精品国产综合久久一线| 亚洲伊人成无码综合网| 亚洲熟妇av一区二区三区| 亚洲成a人片在线观看日本| 亚洲国产精品久久久久久| 久久亚洲国产成人精品性色| 亚洲精品福利在线观看| 亚洲乱码卡三乱码新区| 亚洲色精品VR一区区三区| 亚洲欧美综合精品成人导航| 国产产在线精品亚洲AAVV| 亚洲精品国产va在线观看蜜芽| 国产偷国产偷亚洲高清日韩| 亚洲精品高清无码视频| 亚洲av色福利天堂| 亚洲婷婷综合色高清在线| 亚洲欧洲无卡二区视頻| 亚洲国产第一页www| 国产成人亚洲综合无码精品| 国产精品亚洲片在线| 亚洲色四在线视频观看| 亚洲成人黄色在线| 亚洲国产成人无码AV在线影院| 婷婷亚洲综合五月天小说在线| MM131亚洲国产美女久久| 国产亚洲成av人片在线观看|