java GUIメモリカードゲーム(記憶ゲーム)



Java Gui Memory Card Game



プロジェクト制作
まず、小さなプログラムを作成するときに最初に考慮すべきことは、プログラムインターフェイスのレイアウトです。次に、基本的な機能を実現するためのアルゴリズム設計と、その他の機能が追加されます。次に、バグと詳細の処理、組み込みヘルプ開発システムの作成があります。
1つ:インターフェースレイアウト
1:ログインウィンドウ:

使用したレイアウトマネージャー:GirdBagLayout(グリッドグループレイアウトマネージャーはボックスマネージャーも使用できます)。このウィンドウで、ゲームを開始して終了するためのマウスモニターを設定する必要があります。名前を入力せずにゲームを開始すると、ポップアップが表示されます。名前を入力し、名前がわかったらゲームを開始して、メインウィンドウに名前を渡してください。リスニング機能で転送を完了します。
2:ゲームインターフェース:
画像
このインターフェースは、ページのように見えるか、それをうまく行うかを考慮する必要があります。これには、Javaレイアウトを深く理解する必要があります。
これがボーダーレイアウトだと思って真ん中と下をとると間違っているので、コンポーネントがボーダーの近くに配置されてしまい、見た目に影響します。
トップレベルのコンテナフェッチ:その周りにギャップを残す方法、それに対処する3つの方法があります。まず、ボーダーレイアウトマネージャーを使用します。すべてのコンポーネントを中央に配置する必要があり、残りは境界の処理です。
方法1:特定の領域を埋めるために各境界に新しいJLabel( '”)を追加します。
方法2:レイアウトを設定するとき、bordelayout(int、int)は必要な境界値を設定します。次に、境界線に空の行が表示されます。ただし、これは2つの境界線の場合です。このためには、スペースのない空のラベルを使用して、各境界線に新しいJLabel()または新しいJLabel( '')を追加する必要があります。このようにして、境界は名目上呼び出されて存在し、bordelayoutの2つの隣接する境界(int、int)間のギャップが満たされます。
方法3:setpreferredsize()を使用して、各境界のサイズを設定および修正します。
シンプルで正確な2番目のタイプをお勧めします。
二次コンテナが削除されます。コンテナを取り外した後も、トランプと3つのボタンがあります。トランプは統一された方法で操作されなければならず、4つのボタンは統一された方法で操作されなければなりません。 JPanelコンテナは、一番上のコンテナの中央に追加されます。 JPanelコンテナは再び境界線レイアウトを使用し、2つのボタンを分離するために中央と下部のみが使用されます。
3層コンテナ:グリッドレイアウトのJpanelを3層コンテナの中央部分に追加できます。このJPanelはボタンを追加しています。次のパートでは、グリッドレイアウトのJpanelまたはボックスレイアウトのBoxコンテナを追加できます。 (このプログラムはグリッドレイアウトを使用します)
このようにして、3層コンテナのパーツとレイアウトを整理します。快適なレイアウトを実現できます。
2:アルゴリズムの実装
ゲームアルゴリズムの実装は、ランダムレイアウトとフロップジャッジメントに大別されます。
ランダムレイアウト:
①8枚のカードと1枚のカードをファイルと同じscrフォルダに戻します。文字列配列を使用してアドレスを格納し(配列を使用するには番号を配置する必要があります)、imageicon / icon配列を使用してカードを順番に格納します(16、裏面は個別に格納できます)。 1234567812345678の16枚のアイコン配列がこの順序で保存されます。
②ランダムなカード配置の実装を開始し、16ビットのイメージアイコン/アイコン配列を作成し、ランダムな画像に対応する番号を格納する整数型リストセットを作成します(個人の能力が十分ではないため、比較アイコンに移動して、グラフは%8)の比較に変換され、ランダムなカードシーケンスが配置されます。これは抽象的なカード配置位置です。ボタン配列がフロップを実行する場合にのみ、このアイコン配列が対応して呼び出されます。 (ボタン配列の初期化は背面の図です)。コードは次のように表示されます。



public void suiji() { boolean b=false Random r=new Random() for(int i=0i<16i++) { int randomint=r.nextInt(16) for(int j=0jif(randomint==list.get(j)) {b=true} } if(!b) { random[i]=image[randomint]list.add(randomint)} if(b) {i--b=false} } }

上記のアルゴリズムは、実際には比較的非効率的です。これは、戻る回数が多く、無駄な計算が多くなるためです。すべてのアルゴリズムを効果的で無駄のないものにするための最適化されたスキームがあります。

public void suiji() { Random r=new Random() Listlisttime=new ArrayList() for(int i=0i<16i++) {listtime.add(i)} for(int i=0i<16i++) { int randomint=r.nextInt(listtime.size()) int team=listtime.get(randomint) listtime.remove(randomint) random[i]=image[team]list.add(team) } }

(私は2番目のオプションを使用します。)
ランダムレイアウトが完了し、Actionlistennerインターフェイスがクラスから継承され、リスナー関数が記述されます。クリックされたボタンは、seticon()を呼び出すのと同じ位置にあるランダムにソートされたアイコン/イメージアイコン配列に対応し、完了することができます。
フロップジャッジメント:
list1コレクションを作成して、クリックされたすべてのボタンマークをロードできます。このセットのsize()が偶数の場合、判定が実行され、2つの結果が得られます。 2枚のカードが同じ場合、それらは消え、2枚のカードは異なります。カード裏面の画像にアイコンを設定します。ここで、カードの判断には、以前に保存された乱数のセットが使用され、%8が呼び出されてそれらが等しいかどうかが確認されます。
同じ状況:2枚のカードが消えます。ボタンのいくつかのプロパティを使用するだけです
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)//フォーカスをキャンセル
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)//フォーカスをキャンセル
jbutton [list1.get(list1.size()-2)]。setEnabled(false)
もちろん、それが終わったかどうかを判断するためにint型番号を作成する必要があります。カードが消えると、int型の値が1つ増えます。 16になったら停止します。
2枚のカードの判定は開封時に行われます。あなたがそれに対処しないならば、あなたは状況に遭遇するでしょう。同時に、彼は何が回されたかを見ずに戻った。この状況を回避するには、スレッドを追加する必要があります。スレッドが消えても、めくっても、0.3秒後に実行されます。
3:その他の機能
追加したその他の機能には、タイムレコーディング、スコアレコーディング(I / O)、プロンプト機能、バックグラウンドミュージック、イベントの終了、再起動などがあります。
①時間記録:スレッドコントロールを使用してタイトルに時間を表示します。開始時に開始し、16枚のカードが消えるとスレッドが終了します。
②スコア記録:
スコアの記録と名前の記録を実現するには、IOストリームの知識が必要です。その中で、BufferedReaderとBufferedWriterはこのプログラムの要件を満たしています。 io()関数が確立され、スコアがクリックされるたびにスコアが呼び出されます。 Io()関数で、最初にファイルファイルを作成して、このファイルがディスクDにあるかどうかを確認します。ない場合は、ディスクDにtetファイルを作成します。最初にファイルの内容を読み取り、各行を文字列配列に入れます。次にポップアップしますグレードのランキング情報を表示します。読み取った後、コンテンツを配列に格納します。 (最初に読み取りと書き込みのみを行います。それ以外の場合、ファイルは空になります)
ゲームが終了すると、io()が自動的に呼び出されてレコードが保存されますが、ウィンドウはポップアップしません(ブール値またはその他の数値制御を使用できます)。データ配列の最後の桁に(int)time + s + nameを追加します
、ここでの並べ替えでは、文字列のセグメンテーション、唾( 's')を使用し、前の有効時間と比較して並べ替える必要があります。ファイルの書き込み時に書き込まれるレコードは3つまでです。
③プロンプト機能:基数を使用するとプロンプト機能が有効になります。前のリストセットで、同じ値%8と等しくない値を持つ番号を見つけ、対応するボタンに1つ配置します。スレッドは、リマインダーとして機能して、戻る前に0.3秒間彼を非表示にします。
④BGMとクリック着信音:
バックグラウンドミュージックの追加はアイコンに似ていますが、少し異なります。バックグラウンドミュージックの実装方法は次のとおりです。
パブリックAudioClip音楽//バックグラウンドミュージック
URL url = Memorize.class.getResource( 'music / fed2.wav')// source
{music = Applet.newAudioClip(url)}
music.play()開始
ループを追加する必要がある場合:
{を試してください
Thread.sleep(40)
} catch(InterruptedException e1){
e1.printStackTrace()
}
music.loop()
さらに、ウィンドウXの音楽をクリックするこの種のループは引き続き再生されるため、クローズドリスニング時間を設定する必要があります。メインクラスにactionlisternerを実装します。オーバーロードされた関数を追加します
addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e){
System.exit(0)}})
クリックされた着信音:
このプログラムは、2つのクリック着信音を追加します。 1つはボタン1.play()のマウスクリックイベントに直接着信音を追加することです。もう1つはコンテナにマウスクリックイベントを追加することです。ボタンがない場合は、別の着信音が再生されます。
⑤終了イベント:16枚のカードがすべて消えたら、16個のボタンが配置されているパネルでremoveall()関数を使用し、パネルのレイアウトを絶対レイアウトに変更します。スレッド1とアルゴリズムを使用してすべてのカードを作成します。左から右に飛ぶと、上部のコンテナの背景もちらつき、置き換えられ(制御スレッドはゆっくりと遅くなります)、速いものから遅いものへのプロセスを実現します。スレッド1が終了し、スレッド2が実行されます。名前+当選おめでとうございます。書道と絵は上から真ん中に移動します。終了すると、下に再起動ボタンと終了ボタンが表示されます。ここではスレッドjoin()が使用されます。
⑥再起動し、restart()関数を設定し、パネルをグリッドレイアウトに変更し、再ランダム化して、変更した値を再度初期化します。
4:バグと詳細処理の記事
小さなプログラムは、バグの最適化によって最適化できるものを生成するべきではありません。具体的な治療法は次のとおりです。
1:アイコン処理:小さなプログラムの作成は完全に独自の要素である必要があり、JAVAコーヒーアイコンは破棄する必要があります
画像
コアは、フォームを設定するときにseticonimage()関数を使用することです。
2:変形防止処理:特別なレイアウトや処理を使用しない場合、フォームが伸びたり、醜くなり、外観に影響を与えます。固定ウィンドウを使用して、ストレッチしないようにすることができます。対応する関数はsetResizable(false)です
3:位置処理:小さなプログラムが左上隅に表示される境界線をクリックすると、常に少し見苦しくなります。フォームを中央に配置するように設定できます。対応する機能は次のとおりです。
setLocationRelativeTo(null)注:この関数はsetsize()の後にある必要があります。フォーム全体の中央にサイズを設定したいので、最初にプレイでサイズを設定すると、フォームが中央点から右下に伸びます。
4.ボタン制御の厳密さ。 ①開始前に画像をクリックしても、マウスクリックイベントは発生しません。 ②画像を開いたとき、再度クリックすることはありません。その結果、画像を2回続けてクリックすると、画像が自動的に消えます。 ③再度判定した場合は、クリックイベントが発生しないように注意してください(再度判定した場合、スレッド内の他のボタンのクリックが速すぎて、最後に操作した2つのボタンが変わったため)判断の開始を制御するブール値を使用できます。
5:インターフェイスが再描画されている場合でも、インターフェイスにグラフィックの変更がある場合は、repaint()関数を使用します。それ以外の場合は、「カード所有者」に似たインターフェイスが表示されます
(repaint()関数を使用せずにゲームを再起動した結果)
6:スレッドタイマーを使用する場合は、単にカウントダウンするかどうかは関係ありません。この時間を使用する必要がある場合は、スレッドを制御し、スリープの前または後に追加するかどうかを制御する必要があります。
7:スレッドのライフサイクルを適切に制御し、制約条件を設定する必要があります。不要なリソースを占有しないように、スレッドが終了すると終了します。
8:ウィンドウを終了し、disopose()は現在のウィンドウを閉じ、system.exit(0)はすべてを閉じるので、ゲームを開始するときにdispose()を使用します。すべての終了はexit(0)を使用します。
9:ボタンが多すぎる場合は、内部クラスを使用して監視を記述しないでください。コードが長すぎます。代わりに、インターフェースを匿名で使用する方がはるかに簡潔になります。
5:システム処理を支援する
③ヘルプファイルをGUIプログラムに埋め込みます。
方法1で使用した方法:cmdコマンドで開く
コードは次のとおりです。
public void help()
{{
ファイルfile = new File(“ doc / help.chm”)
ランタイムce = Runtime.getRuntime()
{を試してください
ce.exec(“ cmd / c start“ + file.getAbsolutePath())
} catch(IOException e){
e.printStackTrace()
}
}
ここでは、ファイルファイルを作成して、コンパイル時のprojiectの内部フォルダー、およびエクスポート時のjarプログラムの相対パスを確立します。これは、docファイルを配置してからファイルを修正する必要はありませんが、比較的配置することで使用できます。コンパイルプロセス中、パス名にスペースを含めることはできません。スペースを含めると、認識されません。 jarファイルを実行しているときは、フォルダー名を変更できません。 (多くのプログラムの内部ファイルは変更できません。)
方法2で使用される方法:java.awt.desktopで開くこともできます
コードは次のとおりです。
public void help()
{ファイルfile = new File(“ doc / help.chm”)
{を試してください
Desktop.getDesktop()。open(file)
} catch(IOException e){
// TODOが自動的に生成したcatchブロック
e.printStackTrace()
}}
このメソッドは、より多くのニーズを満たすために、親クラスパス内のスペースを識別できます。この手順は、オプション1からオプション2に最適化されています。
特定のコードを添付してください:初期インターフェース:



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('Start the game') JButton b=new JButton('drop out') // JButton jb2=new JButton('OK') 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 parameters d.gridx=0//Horizontal direction d.gridy=0//Vertical direction d.weighty=0.1 d.anchor=d.SOUTH//It should be the alignment //d.grid JLabel lab=new JLabel('Welcome to the memorize game',JLabel.CENTER) lab.setFont(new Font('Song Ti',1,30)) lab.setForeground(Color.red) c.add(lab,d)d.anchor=d.CENTER // need a line JPanel jp4=new JPanel() jp4.setLayout(new FlowLayout()) JLabel lab2=new JLabel('Please enter your name',JLabel.CENTER) lab2.setFont(new Font('Song Ti',1,16)) /// jtex.setFocusable(false) // Cancel focus 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 automatically generated method stub if(e.getSource()==a) { if(jtex.getText().equals('')) {JOptionPane.showMessageDialog(this,'Please type in your name!') jtex.setFocusable(true) } else {new Memorize().name=jtex.getText()dispose()} } if(e.getSource()==b) {System.exit(0)} //if(e.getSource()==jb2) {A=truename=jtex.getText()} } }

ゲームインターフェイス:

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 jishiint time=-1//Timing public AudioClip music//Background music public AudioClip lingsheng,lingsheng2//Clicked ringtone URL url=Memorize.class.getResource('music/fade2.wav')//source {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 stream String jilu[]//io boolean judgleB=false//io boolean tanchu=false// String name='' static boolean A=false//Control start static boolean a[]=new boolean[16]// Should it disappear boolean b[]=new boolean[16]//Not clickable when it is true static int B=0//Calculate the number of cards that have disappeared static Listlist1=new ArrayList()//Store the number of the clicked button //Parts needed for the middle plate static List list=new ArrayList()//Store the number sequence after random ImageIcon imageicon=new ImageIcon(this.getClass().getResource('image/beimian.jpg')) Image beimian=imageicon.getImage() String sousename[]=new String[8]//The name of the card ImageIcon image[]=new ImageIcon[16]//16 card icons are also available ImageIcon random[]=new ImageIcon[16]//Icon array after using random numbers static JButton jbutton[]=new JButton[16] //Parts needed for the lower panel block JButton start=new JButton('Start') //start button JButton score=new JButton('Score') //score button JButton hint=new JButton('hint') JButton help=new JButton('Help') //help button JButton restart=new JButton('Restart') JButton exit =new JButton('drop out') //Middle //Middle top grid //Middle bottom grid JPanel jp=new JPanel()JPanel jp2=new JPanel()JPanel jp1=new JPanel() Container c=this.getContentPane() /** * Constructor **/ public Memorize() { fuzhi()//Assign sousename and image array suiji()//Assign a random array 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))//intermediate jp2.setLayout(new GridLayout(1,4,20, 0))//the following 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)//Set the panel to be transparent must have jp2.setOpaque(false)//jp2 (set to transparent below) 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() } /** * Set the title, used to repeatedly set the personalized title in the thread **/ public void settile() { this.setTitle('memorize game-time used'+time+'s') } /** * Timer, title timing and final time end interception **/ public void jishi() { jishi=new Thread(new Runnable() { public void run() { while(B<16) { time++ settile() try {Thread.sleep(1000)}//Hibernate 1S catch(Exception e) {e.printStackTrace()} } } }) jishi.start() } /** * Use the characteristics of String to assign icon/imageicon arrays **/ public void fuzhi() { for(int i=0i<16i++) { sousename [i%8]='image/'+(i%8+1)+'.jpg' //Simplify the code image[i]=new ImageIcon(this.getClass().getResource(sousename[i%8])) } } /** * Random sort position **/ public void suiji() { Random r=new Random() Listlisttime=new ArrayList() for(int i=0i<16i++) {listtime.add(i)} for(int i=0i<16i++) { int randomint=r.nextInt(listtime.size()) int team=listtime.get(randomint) listtime.remove(randomint) random[i]=image[team]list.add(team) } } /** * Need to add buttons when starting and restarting **/ public void addjubutton() { for(int i=0i<16i++) { jbutton[i]=new JButton(imageicon) jbutton[i].addActionListener(this) jp1.add(jbutton[i]) } } /** * End the event, using the animation of two threads **/ public void end() { jp1.removeAll() jp1.setLayout(null) JLabel jl=new JLabel(name+'Congratulations you won',JLabel.CENTER) //jl.setForeground(Color.black) jl.setFont(new Font('Song Ti',0,24)) jp1.add(jl) jp1.setOpaque(false) JLabel label[]=new JLabel[16] for(int j=0j<16j++) {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()//Background replacement 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('The current thread was interrupted')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('Song Ti',0,24+count/20)) if(count%30==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('Song Ti',1,22))exit.setFont(new Font('Song Ti',1,22))} try {Thread.sleep(10)d0.join()} catch(InterruptedException e){System.out.println('The current thread was interrupted')break} } }}) d0.start()d1.start() setVisible(true) } /** * Function to store grades and names **/ public void io()//Called at the end { //String jilu[]=new String[4] shijianjilu=new String[4][]//io stream jilu=new String[4] int geshu=0 File file=new File('word.txt') if(!file.exists()) {try { file.createNewFile()} catch (IOException e) { // TODO automatically generated catch block e.printStackTrace()}} try {//Read first FileReader fi=new FileReader(file) BufferedReader bffi=new BufferedReader(fi) String s=nullint exam=0 while((s=bffi.readLine())!=null) { jilu[exam++]=s //System.out.println(s) } if(B==16&&judgleB==false) { jilu[exam]=time+'s'+'Name:'+nameexam++judgleB=true} geshu=exam if(exam==0&&tanchu) {tanchu=false JOptionPane.showMessageDialog(this, 'you will be the NO.1!') } if(exam==1&&tanchu) { tanchu=falseJOptionPane.showMessageDialog(this,'Top1 player time:'+jilu[0]) } for(int j=0j's') } if(exam==2) {//paixu if(Integer.parseInt(shijianjilu[0][0])> Integer.parseInt(shijianjilu[1][0])) { String temp=jilu[0]jilu[0]=jilu[1]jilu[1]=temp }if(tanchu) {tanchu=falseJOptionPane.showMessageDialog(this,'Top1 player time:'+jilu[0]+ ' top2 player time:'+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=falseJOptionPane.showMessageDialog(this,'Top1 player time:'+jilu[0]+ ' top2 player time:'+jilu[1])} } } bffi.close() fi.close() } catch (Exception e) { // TODO automatically generated catch block e.printStackTrace() } if(geshu!=0) { try {FileWriter writer=new FileWriter(file) BufferedWriter bfwriter=new BufferedWriter(writer) for(int i=0i2i++) { bfwriter.write(jilu[i]) bfwriter.newLine() // System.out.println(jilu[i]) } bfwriter.close() writer.close() } catch(Exception e) {e.printStackTrace()} }} /** * Judgment function * Used to judge whether to disappear or turn back * Determine whether to end **/ public void judgle() { if(list1.size()%2==0) //The last set of data is judged by an even number { 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)// Transparent jbutton[list1.get(list1.size()-1)].setBorderPainted(false)// Cancel the border jbutton[list1.get(list1.size()-1)].setFocusPainted(false) // Cancel focus jbutton[list1.get(list1.size()-1)].setEnabled(false) jbutton[list1.get(list1.size()-2)].setIcon(null) jbutton[list1.get(list1.size()-2)].setContentAreaFilled(false)// Transparent jbutton[list1.get(list1.size()-2)].setBorderPainted(false)// Cancel the border jbutton[list1.get(list1.size()-2)].setFocusPainted(false) // Cancel focus jbutton[list1.get(list1.size()-2)].setEnabled(false) a[list1.get(list1.size()-2)]=trueB++ a[list1.get(list1.size()-1)]=trueB++ // 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('The current thread was interrupted')} } } }) d1.start() } } /** * Reminder function * When the click is an odd number, the position of another card can be prompted. **/ public void hint() { if(list1.size()%2==1) { for(int i=0ifinal int k=i if(list.get(i)%8==list.get(list1.get(list1.size()-1))%8&& list.get(i)!=list.get(list1.get(list1.size()-1))) { jbutton[i].setIcon(null) jbutton[i].setContentAreaFilled(false) Thread hint=new Thread(new Runnable() { public void run() { int j=0 while(j<2) { if(j==1) { jbutton[k].setIcon(imageicon) jbutton[k].setContentAreaFilled(true) } try {Thread.sleep(200)j++}//Hibernate 1S catch(Exception e) {e.printStackTrace()} } } }) hint.start() } } } } /** * Help system * Pop-up html help API file **/ public void help() { File file = new File('help.chm') try { Desktop.getDesktop().open(file) } catch (IOException e) { // TODO automatically generated catch block e.printStackTrace() } } /** * Restart * Restore and initialize all changed variables **/ public void restart() { music.stop() judgleB=false//If you don’t have it, you can only save it for the first time. A=false//Control start a=new boolean[16]// Should it disappear b=new boolean[16]//Not clickable when it is true B=0time=-1 this.setTitle('memorize game') list1=new ArrayList()//Store the number of the clicked button list=new ArrayList() jp1.removeAll() jp1.setLayout(new GridLayout(4,4,40,20))//intermediate io() suiji() addjubutton() repaint() setVisible(true) } /** * Rewritten mouse monitor function **/ public void actionPerformed(ActionEvent e) { // TODO automatically generated method stub lingsheng.play() if(e.getSource()==hint) { hint() } if(e.getSource()==help) { help() } if(e.getSource()==start) {if(!A){A=truemusic.play()try { Thread.sleep(40) } catch (InterruptedException e1) { //TODO automatically generated catch block e1.printStackTrace() } music.loop() jishi() } } if(e.getSource()==score) {tanchu=trueio()}//The wrong position will cause the first click to not appear if(A) //Array monitor {for(int i=0i<16i++) { 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() //Execute the start interface }}