日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

java中showconfirmdialog_Java小游戏之连连看

發(fā)布時間:2023/11/27 生活经验 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java中showconfirmdialog_Java小游戏之连连看 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

連連看大家應(yīng)該都玩過,不多說直接上一個做好的界面截圖吧,所有的功能都在上面的,要做的就只是如何去實現(xiàn)它們了。

差不多就是這個樣子。先說一下大致的思路吧。首先編寫基本的界面:把什么按鈕啊,表格啊什么的都畫上去。然后就是編寫事件處理類,因為操作使用鼠標(biāo),所以加上鼠標(biāo)監(jiān)聽。然后獲取點擊的坐標(biāo),根據(jù)坐標(biāo)得出圖片在數(shù)組中的位置。接著創(chuàng)建一個類,實現(xiàn)連連看消除的算法。這樣就基本上可以開始游戲了。然后實現(xiàn)排行榜按鈕和存檔按鈕的基本功能。最后加上一個線程類,用于處理倒計時。下面的介紹也基于這個順序。

界面實現(xiàn):這個其實沒什么好說的,把JFrame的知識用上就好了。考慮到圖片的閃爍問題,在界面類中重寫paint方法,加上雙緩沖(雙緩沖不懂的,可以自行百度或者看看我寫的Java版本2048)。所以就直接貼代碼了。

package com.cbs.look;public interface LookConfig {int x=50;//初始x坐標(biāo),原來是10int y=100;//初始y坐標(biāo),原來是50int space=10;//圖片間的間隔int arc=50;//圓角矩形的弧度int size=60;//圖片的大小int num=9;//圖片類型
}
package com.cbs.look;import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.RenderingHints;import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;/*** 連連看的主界面類* * @author CBS* */
@SuppressWarnings("serial")
public class GameLook extends JFrame implements LookConfig {private int[][] array = new int[8][8];// 數(shù)組用于保存界面的信息JLabel timeJl;// 用于顯示剩余時間public static void main(String[] args) throws InterruptedException {GameLook g = new GameLook();g.showUI();}/*** 初始化界面* * @throws InterruptedException*/public void showUI() throws InterruptedException {setTitle("連連看");setSize(700, 800);setDefaultCloseOperation(3);setLocationRelativeTo(null);setResizable(true);setLayout(null);// 添加新游戲按鈕
//        ImageIcon start = new ImageIcon("res/start.png");JButton startJB = new JButton("新游戲");startJB.setBounds(30, 700, 100, 40);
//        startJB.setBorderPainted(false);// 設(shè)置邊框為空startJB.setFocusable(false);
//        startJB.setContentAreaFilled(false);// 設(shè)置內(nèi)容空this.add(startJB);// 添加排行榜按鈕JButton save = new JButton("排行榜");save.setFocusable(false);save.setBounds(190, 700, 100, 40);this.add(save);// 添加存檔按鈕JButton saveGame = new JButton("存檔");saveGame.setFocusable(false);saveGame.setBounds(320, 700, 100, 40);this.add(saveGame);// 添加剩余時間JLabel jl = new JLabel("Time:");jl.setFont(new Font("", Font.BOLD, 20));jl.setBounds(440, 700, 80, 50);this.add(jl);// 顯示剩余時間timeJl = new JLabel("90");timeJl.setFont(new Font("", Font.BOLD, 20));timeJl.setBounds(520, 700, 80, 50);this.add(timeJl);setVisible(true);GameListener gl = new GameListener();gl.setFrame(this);gl.setTimeJl(timeJl);gl.setArray(array);saveGame.addActionListener(gl);startJB.addActionListener(gl);save.addActionListener(gl);int i=JOptionPane.showConfirmDialog(this, "是否讀取上次的存檔", "讀檔",JOptionPane.YES_NO_OPTION);if(i==1){JOptionPane.showMessageDialog(this, "請按新游戲開始游戲吧!");}else{GameSave2 gs2=new GameSave2();CunD c=gs2.opean();if(c!=null){array=c.getArray();gl.setArray(array);this.addMouseListener(gl);this.repaint();TimeOut tt =new TimeOut(timeJl, this, gl);gl.setTt(tt);tt.setSeconds(c.getTime());tt.start();}else{JOptionPane.showMessageDialog(this, "讀取失敗!");}}}@Overridepublic void paint(Graphics g) {super.paint(g);buffPaint(g);}/*** 使用雙緩沖技術(shù)解決閃屏問題* * @param g傳入的畫筆對象*/public void buffPaint(Graphics g) {Image i = createImage(space + (size + space) * array[0].length, space+ (size + space) * array.length);Graphics2D g2d = (Graphics2D) i.getGraphics();g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);// 繪制背景矩形g2d.setColor(new Color(210, 180, 140));g2d.fillRoundRect(0, 0, space + (size + space) * array[0].length, space+ (size + space) * array.length, arc, arc);// 繪制背景方格g2d.setColor(new Color(245, 245, 220));for (int r = 0; r < array.length; r++) {for (int c = 0; c < array[r].length; c++) {g2d.fillRect(space + (size + space) * c, space + (size + space)* r, size, size);}}// 繪制圖片g2d.setColor(Color.BLUE);g2d.setFont(new Font("宋體", Font.BOLD, 30));for (int r = 0; r < array.length; r++) {for (int c = 0; c < array[r].length; c++) {if (array[r][c] != 0) {ImageIcon icon = new ImageIcon("res/" + array[r][c]+ ".jpg");Image image = icon.getImage();g2d.drawImage(image, space + (size + space) * c, space+ (size + space) * r, size, size, null);}}}g.drawImage(i, x, y, this);}
}

事件處理類:鼠標(biāo)的事件處理主要負(fù)責(zé)的是記錄兩次點擊的坐標(biāo),然后判斷是否能夠把兩個圖片消除,如果可以消除圖片把對應(yīng)的數(shù)組位置的數(shù)置為0,然后重繪畫板,如果不行同樣重繪畫板消除選框及連線。動作的事件處理主要負(fù)責(zé)實現(xiàn)不同的按鈕的功能。

package com.cbs.look;import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.List;
import java.util.Random;import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.plaf.FontUIResource;
/*** 事件處理類* @author CBS*/
public class GameListener extends MouseAdapter implements LookConfig,ActionListener {// 用于控制坐標(biāo)的獲取private boolean flag = true;private int r1, c1, r2, c2;// 對應(yīng)數(shù)組的下標(biāo)位置private int x1, y1, x2, y2;// 鼠標(biāo)點擊的坐標(biāo)private int array[][];// 保存數(shù)組private JFrame frame;// 用于獲取窗體對象,調(diào)用Repaint方法private Graphics2D g;// 畫筆對象JLabel timeJl;// 用于顯示剩余時間TimeOut tt ;// 倒計時線程類private int x;// 保存畫框的頂點x坐標(biāo)private int y;// 保存畫框的頂點y坐標(biāo)public TimeOut getTt() {return tt;}public void setTt(TimeOut tt) {this.tt = tt;}public void setTimeJl(JLabel timeJl) {this.timeJl = timeJl;}public void setFrame(JFrame frame) {this.frame = frame;g = (Graphics2D) frame.getGraphics();}public void setArray(int[][] array) {this.array = array;}@Overridepublic void mousePressed(MouseEvent e) {// 獲取坐標(biāo)if (flag) {x1 = e.getX() - 40;y1 = e.getY() - 50;flag = false;if (y1 / (size + space) - 1 >= array.length)r1 = array.length - 1;else if (y1 / (size + space) - 1 < 0)r1 = 0;elser1 = y1 / (size + space) - 1;if (x1 / (size + space) >= array[0].length)c1 = array[0].length - 1;elsec1 = x1 / (size + space);g.setColor(Color.RED);g.setStroke(new BasicStroke(5));x = space + space + c1 * (size + space) + 40;y = size + r1 * (size + space) + 50;g.drawRect(x, y, size, size);} else {x2 = e.getX() - 40;y2 = e.getY() - 50;flag = true;if (y2 / (size + space) - 1 >= array.length)r2 = array.length - 1;else if (y1 / (size + space) - 1 < 0)r1 = 0;elser2 = y2 / (size + space) - 1;if (x2 / (size + space) >= array[0].length)c2 = array[0].length - 1;elsec2 = x2 / (size + space);g.setColor(Color.RED);g.setStroke(new BasicStroke(4));x = space + space + c2 * (size + space) + 40;y = size + r2 * (size + space) + 50;g.drawRect(x, y, size, size);}GameUtil gu = new GameUtil(this.frame);if (array[r1][c1] == array[r2][c2] && flag && !(r1 == r2 && c2 == c1)&& (array[r1][c1] != 0 || array[r2][c2] != 0)) {if (gu.wuZhe(r1, c1, r2, c2, array)) {array[r1][c1] = 0;array[r2][c2] = 0;g.setColor(Color.PINK);g.drawLine(2 * space + size / 2 + c2 * (size + space) + 40,size + size / 2 + r2 * (size + space) + 50, 2 * space+ size / 2 + c1 * (size + space) + 40, size+ size / 2 + r1 * (size + space) + 50);} else if (gu.yiZhe(r1, c1, r2, c2, array)) {array[r1][c1] = 0;array[r2][c2] = 0;g.setColor(Color.PINK);g.drawLine(2 * space + size / 2 + gu.getPath().get(0).y* (size + space) + 40, size + size / 2+ gu.getPath().get(0).x * (size + space) + 50, 2* space + size / 2 + c1 * (size + space) + 40, size+ size / 2 + r1 * (size + space) + 50);g.drawLine(2 * space + size / 2 + gu.getPath().get(0).y* (size + space) + 40, size + size / 2+ gu.getPath().get(0).x * (size + space) + 50, 2* space + size / 2 + c2 * (size + space) + 40, size+ size / 2 + r2 * (size + space) + 50);} else if (gu.erZhe(r1, c1, r2, c2, array)) {array[r1][c1] = 0;array[r2][c2] = 0;g.setColor(Color.PINK);g.drawLine(2 * space + size / 2 + gu.getPath().get(1).y* (size + space) + 40, size + size / 2+ gu.getPath().get(1).x * (size + space) + 50, 2* space + size / 2 + c1 * (size + space) + 40, size+ size / 2 + r1 * (size + space) + 50);// path的下標(biāo)為一的位置要減一,因為數(shù)組擴(kuò)大了g.drawLine(2 * space + size / 2 + (gu.getPath().get(0).y - 1)* (size + space) + 40, size + size / 2+ (gu.getPath().get(0).x - 1) * (size + space) + 50, 2* space + size / 2 + gu.getPath().get(1).y* (size + space) + 40, size + size / 2+ gu.getPath().get(1).x * (size + space) + 50);g.drawLine(2 * space + size / 2 + (gu.getPath().get(0).y - 1)* (size + space) + 40, size + size / 2+ (gu.getPath().get(0).x - 1) * (size + space) + 50, 2* space + size / 2 + c2 * (size + space) + 40, size+ size / 2 + r2 * (size + space) + 50);}//實現(xiàn)消除控制重繪的刷新時間Thread t=new Thread();try {t.sleep(100);frame.repaint();} catch (InterruptedException e1) {// TODO Auto-generated catch blocke1.printStackTrace();}if (isWin(array)) {tt.setFlag(false);frame.removeMouseListener(this);JOptionPane.showMessageDialog(frame, "恭喜你,"+ "你贏了!!請點擊新游戲開始新一局");int i = JOptionPane.showConfirmDialog(frame, "是否記錄將你的信息記入排行榜","排行榜", JOptionPane.YES_NO_OPTION);if (i == 0) {String str = JOptionPane.showInputDialog(frame, "請輸入你的名字","排行榜", JOptionPane.YES_NO_OPTION);int time=90-tt.getSeconds();User u = new User(str, time);GameSave gs = new GameSave();gs.save(u);}}}//未實現(xiàn)消除,重繪去掉線條if (flag) {Thread t=new Thread();try {t.sleep(100);frame.repaint();} catch (InterruptedException e1) {// TODO Auto-generated catch blocke1.printStackTrace();}}}// 按鈕動作監(jiān)聽public void actionPerformed(ActionEvent e) {String str = e.getActionCommand();if ("新游戲".equals(str)) {for (int r = 0; r < array.length; r++)for (int c = 0; c < array[r].length; c++)if (array[r][c] != 0) {array[r][c] = 0;}if(tt!=null){if(tt.isFlag()){frame.removeMouseListener(this);tt.setFlag(false);}}randomData();frame.repaint();frame.addMouseListener(this);// 啟動線程tt = new TimeOut(timeJl, frame, this);if(!tt.isFlag())tt.setFlag(false);tt.start();}if ("排行榜".equals(str)) {GameSave gs = new GameSave();List<User> list = gs.opean();for (int i = 0; i < list.size(); i++) {int flag = i;for (int j = i + 1; j < list.size(); j++) {if (list.get(i).getTime() > list.get(j).getTime())flag = j;}if (flag != i) {User u1 = list.get(i);User u2 = list.get(flag);list.set(i, u2);list.set(flag, u1);}}JFrame jf = new JFrame();jf.setTitle("排行榜");jf.setDefaultCloseOperation(2);jf.setSize(300, 500);FlowLayout fl = new FlowLayout(FlowLayout.LEFT);jf.setLayout(fl);jf.setLocationRelativeTo(null);for (int i = 0; i < list.size(); i++) {JLabel jl = new JLabel(list.get(i).toString());jl.setFont(new FontUIResource("楷體", Font.BOLD, 20));jf.add(jl);}jf.setVisible(true);}if("存檔".equals(str)){System.out.println(23333);GameSave2 gs2=new GameSave2();int time=tt.getSeconds();CunD c=new CunD(array, time);boolean is=gs2.save(c);if(is)JOptionPane.showMessageDialog(frame, "存檔成功!");elseJOptionPane.showMessageDialog(frame, "存檔失敗!");}}/*** 生成隨機(jī)數(shù)字*/public void randomData() {Random random = new Random();int r1, r2, c1, c2;for (int i = 0; i < array.length * array[0].length / 2; i++) {do {r1 = random.nextInt(array.length);c1 = random.nextInt(array[r1].length);} while (array[r1][c1] != 0);array[r1][c1] = random.nextInt(num) + 1;do {r2 = random.nextInt(array.length);c2 = random.nextInt(array[r2].length);} while (array[r2][c2] != 0);array[r2][c2] = array[r1][c1];}}//遍歷數(shù)組,判斷輸贏public boolean isWin(int[][] array) {for (int r = 0; r < array.length; r++)for (int c = 0; c < array[r].length; c++)if (array[r][c] != 0)return false;return true;}
}

這里的圖片我使用的是直接繪制圖片,而不是通過按鈕,所以坐標(biāo)的判斷有些麻煩。數(shù)組的下標(biāo)取得是通過鼠標(biāo)坐標(biāo)整除方格的邊長加間隔,然后由數(shù)組下標(biāo)取得屏幕坐標(biāo)則相反。初始數(shù)據(jù)是由randomData方法生成,不同的數(shù)字對應(yīng)不同的圖片。

連連看的算法:這里我使用的算法是比較容易理解和實現(xiàn)的分類算法,據(jù)說還有一種比較厲害的算法叫廣度優(yōu)先搜索,那個我不會,所以就只能用這種了。先說說連連看的規(guī)則吧,就是用不超過兩次拐彎的直線能夠相連就能夠消除。這樣分類算法就很好理解了,按照消除要拐彎的次數(shù)分為無折相連,一折相連和二折相連。首先是無折相連這個很好理解,要么他們左右相鄰或者是上下相鄰,要么就是同一行,兩個方快中間沒有阻隔或者是同一列中間沒有阻隔。

就像上面的圖,左邊是不相鄰的,右邊是相鄰的,這兩種都屬于無折的相連。然后是一折的相連。一折的相連就是拐一個彎,先看看示意圖把:

其實無論是哪種情況,能夠?qū)崿F(xiàn)一折相連的方塊都是在矩形的兩個對頂角,所以只要判斷矩形的另外兩個對頂角是否能夠?qū)崿F(xiàn)無折相連就行了。最后是二折相連,同樣是先看示意圖:

二折的情況看似復(fù)雜,其實只要在水平方向上和垂直方向上分別進(jìn)行遍歷,如果是空格就判斷這個空格是否能夠和另一個格子一折相連就行了。其實整個算法有點像是遞歸,一折調(diào)用無折,二折調(diào)用一折。算法的思路大概就是這樣。然后就上代碼吧:

package com.cbs.look;import java.awt.Point;
import java.util.ArrayList;
import java.util.List;import javax.swing.JFrame;/*** 核心算法* 判斷兩個方塊是否聯(lián)通* @author CBS* */
public class GameUtil implements LookConfig {//path主要是記錄下相連的數(shù)組的位置,為了方便實現(xiàn)連線的功能private List<Point> path=new ArrayList<Point>();public List<Point> getPath() {return path;}public GameUtil(JFrame frame) {}/*** 無折算法,無折的情況,要么同行,判斷列是否連通;要么同列判斷行是否連通* * @param r1第一個方塊行下標(biāo)* @param c1第一個方塊列下標(biāo)* @param r2第二個方塊行下標(biāo)* @param c2第二個方塊列下標(biāo)* @param array用于保存數(shù)組的信息* @return 如果能夠連通返回TRUE,or返回FALSE*/public boolean wuZhe(int r1, int c1, int r2, int c2, int[][] array) {if (r1 != r2 && c1 != c2)return false;// 如果兩點的x坐標(biāo)相等,則在水平方向上掃描if (r1 == r2) {if (c1 == c2 - 1 || c2 == c1 - 1)// 列相鄰return true;for (int i = Math.min(c1, c2) + 1; i < Math.max(c2, c1); i++)if (array[r1][i] != 0)return false;}// 如果兩點的y坐標(biāo)相等,則在豎直方向上掃描else if (c1 == c2) {if (r1 == r2 - 1 || r2 == r1 - 1)// 行相鄰return true;for (int i = Math.min(r1, r2) + 1; i < Math.max(r2, r1); i++)if (array[i][c1] != 0)return false;}return true;}/*** 一折算法,無論是哪種情況下,都只需要判斷對角的r1,c2和r2,c1和兩點是否連通* * @param r1第一個方塊行下標(biāo)* @param c1第一個方塊列下標(biāo)* @param r2第二個方塊行下標(biāo)* @param c2第二個方塊列下標(biāo)* @param array 用于保存數(shù)組的信息* @return 如果能夠連通返回TRUE,or返回FALSE*/public boolean yiZhe(int r1, int c1, int r2, int c2, int[][] array) {// 如果屬于0折的情況,直接返回FALSEif (r1 == r2 || c1 == c2)return false;// 測試對角點1if (array[r1][c2] == 0) {boolean test1 = wuZhe(r1, c1, r1, c2, array);boolean test2 = test1 ? wuZhe(r1, c2, r2, c2, array) : test1;if (test1 && test2){path.add(new Point(r1,c2));return true;}}// 測試對角點2if (array[r2][c1] == 0) {boolean test1 = wuZhe(r1, c1, r2, c1, array);boolean test2 = test1 ? wuZhe(r2, c1, r2, c2, array) : test1;if (test1 && test2){path.add(new Point(r2,c1));return true;}}return false;}/*** 二折算法* * @param r1第一個方塊行下標(biāo)* @param c1第一個方塊列下標(biāo)* @param r2第二個方塊行下標(biāo)* @param c2第二個方塊列下標(biāo)* @param array用于保存數(shù)組的信息* @return 如果能夠連通返回TRUE,or返回FALSE*/public boolean erZhe(int r1, int c1, int r2, int c2, int[][] array) {//在原來數(shù)組的基礎(chǔ)上擴(kuò)大一圈,用于判斷邊界的方格int[][] newArray = new int[array.length + 2][array[0].length + 2];for (int r = 0; r < array.length; r++) {for (int c = 0; c < array[r].length; c++) {newArray[r + 1][c + 1] = array[r][c];}}//判斷是否二折連接// 向下垂直遍歷for (int i = r1 + 2; i < newArray.length; i++) {if (newArray[i][c1+1] == 0 ) {if(yiZhe(r2+1, c2+1, i, c1+1, newArray)){path.add(new Point(i-1, c1));return true;}}elsebreak;}// 向上垂直遍歷for (int i = r1 ; i > -1; i--) {if (newArray[i][c1+1] == 0  ){if(yiZhe(i, c1+1, r2+1, c2+1, newArray)){path.add(new Point(i-1, c1));return true;}}elsebreak;}// 向右水平遍歷for (int i = c1 + 2; i < newArray[0].length; i++) {if (newArray[r1+1][i] == 0 ){if( yiZhe(r2+1, c2+1, r1+1, i, newArray)){path.add(new Point(r1,i-1));return true;}}elsebreak;}// 向左水平遍歷for (int i = c1 ; i > -1; i--) {if (newArray[r1+1][i] == 0  ) {if(yiZhe(r1+1, i, r2+1, c2+1, newArray)){path.add(new Point(r1,i-1));return true;}}else break;}return false;}}

還有一個要說一下就是上面第一張圖的那種二折情況,如果這種二折情況處于數(shù)組的邊界的話,在使用上面的二折算法判斷就會因為數(shù)組的問題,永遠(yuǎn)不可能實現(xiàn)相連。解決的方法就是:把數(shù)組擴(kuò)大,在整個的數(shù)組外邊加上一層,也就是說原來4*4變成6*6。把所有除原來4*4之外的位置的值都設(shè)為0,這樣就能夠遍歷到了。不過在判斷的時候要注意使用的是新數(shù)組的坐標(biāo)還是舊數(shù)組的坐標(biāo)(把新數(shù)組的坐標(biāo)行下標(biāo)和列下標(biāo)都減一就是舊數(shù)組的行下標(biāo)和列下標(biāo))。能夠消除就意味著你的連連看游戲已經(jīng)可以玩了,剩下的就是一些優(yōu)化的問題了。

排行榜和存檔功能的實現(xiàn):這兩個功能放一起講,因為都用到了Java的IO的一些知識。這里主要用到的是Java中的FileOutputStream和FileInputStream這兩個類。FileOutputStream這個類是把內(nèi)存中的數(shù)據(jù)輸出到外部的存儲設(shè)備,主要的方法就是write(向目標(biāo)文件一次寫入一個字節(jié))和close(關(guān)閉輸出流);FileInputStream則是把外部的數(shù)據(jù)輸入到內(nèi)存中供程序使用,主要的方法就是read(從目標(biāo)文件一次讀取一個字節(jié))和close(關(guān)閉輸入流)。存檔的思路就是:把當(dāng)前的數(shù)組情況和時間記錄下來(使用一個類來保存這兩個信息),保存到一個文件中,下次打開游戲的時候詢問用戶是否載入進(jìn)度。排行榜的話是如果玩家獲勝,就記錄下玩家的姓名和通關(guān)用時(同樣使用一個類),保存到文件中。下面是代碼,把存檔和排行榜的相關(guān)類都放進(jìn)去了:

package com.cbs.look;/*** 存檔* * @author CBS*/public class CunD {private int array[][];private int time;public CunD() {}public CunD(int[][] array, int time) {this.array = array;this.time = time;}public int[][] getArray() {return array;}public void setArray(int[][] array) {this.array = array;}public int getTime() {return time;}public void setTime(int time) {this.time = time;}}
package com.cbs.look;import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;/*** 用于保存游戲存檔的信息* * @author CBS*/
public class GameSave2 {public boolean save(CunD d) {String path = "src/com/cbs/look/info.txt";try {OutputStream os = new FileOutputStream(path);os.write(d.getTime());for (int r = 0; r < d.getArray().length; r++) {for (int c = 0; c < d.getArray()[0].length; c++) {os.write(d.getArray()[r][c]);}}os.close();return true;} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}return false;}public CunD opean() {String path = "src/com/cbs/look/info.txt";try {InputStream is = new FileInputStream(path);int time = is.read();int array[][]=new int[8][8];for (int i = 0; i < array.length; i++)for (int j = 0; j < array[0].length; j++)array[i][j] = is.read();CunD c=new CunD(array,time);is.close();return c;} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}return null;}
}
package com.cbs.look;/*** 記錄排行榜的用戶信息的類* * @author CBS* */
public class User {private String name;//用戶名private int time;//記錄用戶通過所用時間public User() {}public User(String name, int time) {this.name = name;this.time = time;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getTime() {return time;}public void setTime(int time) {this.time = time;}@Overridepublic String toString() {String str=name+"用時為:"+time;return str;}}
package com.cbs.look;import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;/*** 用于保存游戲排行榜信息* * @author CBS*/
public class GameSave {public boolean save(User user) {String path = "src/com/cbs/look/save3.txt";try {List<User> array = opean();if(array!=null){array.add(user);for (int i=0;i<array.size()-1;i++) {int flag=i;for(int j=i+1;j<array.size();j++){if(array.get(i).getTime()>array.get(j).getTime())flag=j;}if(flag!=i){User u1=array.get(i);User u2=array.get(flag);array.set(i, u2);array.set(flag, u1);}}}else{array=new ArrayList<User>(); array.add(user);}OutputStream os = new FileOutputStream(path);DataOutputStream dos=new DataOutputStream(os);//先寫入有幾條信息os.write(array.size());for (int i = 0; i < array.size(); i++) {User u =  array.get(i);dos.writeByte(u.getName().getBytes().length);dos.write(u.getName().getBytes());dos.writeInt(u.getTime());}os.close();dos.close();return true;} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}return false;}public List<User> opean() {String path = "src/com/cbs/look/save3.txt";try {InputStream is = new FileInputStream(path);DataInputStream dis = new DataInputStream(is); //讀取有幾條信息int size=is.read();List<User> list=new ArrayList<User>();if(size!=-1){for(int i=0;i<size;i++){byte bsize=dis.readByte();byte[] b=new byte[bsize];is.read(b);int time=dis.readInt();User u=new User(new String(b),time);list.add(u);}}dis.close();is.close();return list;} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}return null;}
}

倒計時的實現(xiàn):倒計時其實很簡單使用一個線程就好(如果線程不了解請自行百度或者學(xué)習(xí),不用很了解,知道就行,只是為了做個倒計時罷了),每次線程休眠一秒就讓時間減一,然后把時間在窗體中輸出就行了。也沒什么可說的,上代碼咯:

package com.cbs.look;
/*** 線程類,控制時間*/
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;public class TimeOut extends Thread {private int seconds=90;//游戲時間private JFrame frame;//主窗體對象private JLabel jl;//倒計時標(biāo)簽private boolean flag = true;// 控制線程結(jié)束private GameListener gl;//事件處理類// 在別的類中控制線程的關(guān)閉public void setFlag(boolean flag) {this.flag = flag;}public boolean isFlag() {return flag;}public int getSeconds() {return seconds;}public void setSeconds(int seconds) {this.seconds = seconds;}public TimeOut(JLabel jl, JFrame frame, GameListener gl) {this.jl = jl;this.frame = frame;this.gl = gl;}@Overridepublic void run() {
//        seconds = 90;jl.setText(seconds + "");while (seconds-- > 0 && flag) {jl.setText(seconds + "");if (seconds == 0) {JOptionPane.showMessageDialog(frame, "不好意思,時間用光了,請開始新游戲");frame.removeMouseListener(gl);}try {Thread.sleep(1000);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}}

這樣所有的東西也就都講完了,剩下的就是如何把它們組織在一起形成你的東西了。

github:MissingBread/game

有需自取

總結(jié)

以上是生活随笔為你收集整理的java中showconfirmdialog_Java小游戏之连连看的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。