日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

java實現2048游戲源代碼

瀏覽:2日期:2022-08-29 13:34:00

本文實例為大家分享了java實現2048游戲源代碼,供大家參考,具體內容如下

一.主要功能:

1、游戲初始化:新建游戲4×4的16宮格畫布,隨機格子上生成2或者4兩個數字2、格子的移動:先判斷能否移動,移動后判斷能否合并,合并后改變格子顏色和數字3、新格子的生成:移動一次,就在剩余的空格子中隨機生成一個2或者44、判贏:16宮格中合并出了“2048”則為游戲勝利5、判輸:16宮格中沒有剩余空格子且不能再向任何方向移動則為游戲失敗

二.項目的主要結構:

java實現2048游戲源代碼

在項目2018游戲中,有4個源文件,此外,還有3個.png和兩個.wav格式的音樂文件。一個音樂是按鍵移動的聲音,另外一個是碰撞后的消除的聲音。然后游戲的最高分保存是在Recording源文件中,之后附上所需的圖片文件和音樂文件:

來了來了.

java實現2048游戲源代碼

java實現2048游戲源代碼

java實現2048游戲源代碼

三.代碼

1、Game.java

package shixun;import java.awt.Color;import java.awt.Font;import java.awt.Graphics;import javax.swing.ImageIcon;import javax.swing.JButton;import javax.swing.JCheckBox;import javax.swing.JFrame;import javax.swing.JLabel;public class Game extends JFrame { private static final long serialVersionUID = 1L; public static void main(String[] args) { Game UI = new Game(); UI.IntUI(); } // 用于存放數據的數組,構成游戲4*4界面的數值 private int Numbers[][] = new int[4][4] ; private void IntUI() { this.setTitle('2048小游戲'); this.setLocation(450, 100); this.setSize(400, 500); this.setLayout(null); // 開始游戲按鈕 ImageIcon imgicon = new ImageIcon('res/start.png'); JButton bt = new JButton(imgicon); bt.setFocusable(false); bt.setBorderPainted(false); bt.setFocusPainted(false); bt.setContentAreaFilled(false); bt.setBounds(5, 10, 120, 30);// 設置按鈕的x,y坐標位置和寬度與高度 this.add(bt); //后退一步按鈕 ImageIcon backicon = new ImageIcon('res/backicon.png'); JButton back = new JButton(backicon); back.setFocusable(false); back.setBorderPainted(false); back.setFocusPainted(false); back.setContentAreaFilled(false); back.setBounds(270, 10, 120, 30);// 設置按鈕的x,y坐標位置和寬度與高度 this.add(back); // 關于按鈕 ImageIcon imgicon2 = new ImageIcon('res/about.png'); JButton about = new JButton(imgicon2); about.setFocusable(false); about.setBorderPainted(false); about.setFocusPainted(false); about.setContentAreaFilled(false); about.setBounds(160, 10, 70, 30); this.add(about); // 分數顯示 JLabel lb = new JLabel('分數:0'); lb.setBounds(40, 45, 120, 30); lb.setFont(new Font('幼圓', Font.CENTER_BASELINE, 18)); lb.setForeground(new Color(0x000000)); this.add(lb); //最高分數 Recorder.getRecording(); int maxscore = Recorder.getMaxscore_2048(); JLabel M=new JLabel('最高分:0'); M.setBounds(150,45,120,30); M.setFont(new Font('幼圓', Font.CENTER_BASELINE, 18)); M.setForeground(new Color(0x000000)); this.add(M); //靜音 JCheckBox isSoundBox=new JCheckBox('靜音'); isSoundBox.setBounds(290, 45, 120, 30); isSoundBox.setFont(new Font('幼圓', Font.CENTER_BASELINE, 18)); isSoundBox.setFocusable(false); isSoundBox.setBorderPainted(false); isSoundBox.setFocusPainted(false); isSoundBox.setContentAreaFilled(false); this.add(isSoundBox); this.setDefaultCloseOperation(3); this.setResizable(false); this.setVisible(true);// 顯示界面 // 創建事件處理類 MyListener cl = new MyListener(this,Numbers,lb,M, bt, about,back,isSoundBox); bt.addActionListener(cl); about.addActionListener(cl); back.addActionListener(cl); isSoundBox.addActionListener(cl); this.addKeyListener(cl); }// 重寫窗體 @Overridepublic void paint(Graphics g) { super.paint(g); g.setColor(new Color(0xBBADA0)); g.fillRoundRect(15, 110, 370, 370, 15, 15);// 大矩形框 g.setColor(new Color(0xCDC1B4)); for (int i = 0; i < 4; i++) { for (int j = 0; j < 4; j++) { g.fillRoundRect(25 + i * 90, 120 + j * 90, 80, 80, 15, 15);// 小矩形框 } } // 調整數字的位置并上色 for (int i = 0; i < 4; i++) { for (int j = 0; j < 4; j++) { if (Numbers[j][i] != 0) { int FontSize = 30; int MoveX = 0, MoveY = 0; switch (Numbers[j][i]) { case 2: g.setColor(new Color(0xeee4da)); FontSize = 30; MoveX = 0; MoveY = 0; break; case 4: g.setColor(new Color(0xede0c8)); FontSize = 30; MoveX = 0; MoveY = 0; break; case 8: g.setColor(new Color(0xf2b179)); FontSize = 30; MoveX = 0; MoveY = 0; break; case 16: g.setColor(new Color(0xf59563)); FontSize = 29; MoveX = -5; MoveY = 0; break; case 32: g.setColor(new Color(0xf67c5f)); FontSize = 29; MoveX = -5; MoveY = 0; break; case 64: g.setColor(new Color(0xf65e3b)); FontSize = 29; MoveX = -5; MoveY = 0; break; case 128: g.setColor(new Color(0xedcf72)); FontSize = 28; MoveX = -10; MoveY = 0; break; case 256: g.setColor(new Color(0xedcc61)); FontSize = 28; MoveX = -10; MoveY = 0; break; case 512: g.setColor(new Color(0xedc850)); FontSize = 28; MoveX = -10; MoveY = 0; break; case 1024: g.setColor(new Color(0xedc53f)); FontSize = 27; MoveX = -15; MoveY = 0; break; case 2048: g.setColor(new Color(0xedc22e)); FontSize = 27; MoveX = -15; MoveY = 0; break; default: g.setColor(new Color(0x000000)); break; } g.fillRoundRect(25 + i * 90, 120 + j * 90, 80, 80, 15, 15);// 小矩形框上色 g.setColor(new Color(0x000000)); g.setFont(new Font('Kristen ITC', Font.PLAIN, FontSize)); g.drawString(Numbers[j][i] + '', 25 + i * 90 + 30 + MoveX, 120 + j * 90 + 50 + MoveY); } } } }}

2、MyListener.java

package shixun;import java.awt.Component;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.awt.event.KeyAdapter;import java.awt.event.KeyEvent;import java.util.Arrays;import java.util.Random;import javax.swing.JButton;import javax.swing.JCheckBox;import javax.swing.JLabel;import javax.swing.JOptionPane;public class MyListener extends KeyAdapter implements ActionListener {/** * KevinWu */ private Game UI;// 界面對象 private int Numbers[][];// 存放數據的數組 private Random rand = new Random(); private int BackUp[][]= new int[4][4];//用于備份數組,供回退時使用 private int BackUp2[][]= new int[4][4];//用于備份數組,供起死回生時使用 public JLabel lb; public JLabel M; int score = 0; int maxscore=Recorder.getMaxscore_2048(); int tempscore,tempscore2;//記錄回退isWin的分數值 public JButton bt,about,back; public JCheckBox isSoundBox; private boolean isWin=false,relive=false,hasBack=false,isSound=true; public MyListener(Game UI, int Numbers[][], JLabel lb,JLabel M ,JButton bt,JButton about,JButton back,JCheckBox isSoundBox) { this.UI = UI; this.Numbers = Numbers; this.lb = lb; this.bt=bt; this.about=about; this.back=back; this.isSoundBox=isSoundBox; this.M=M; } @Override public void actionPerformed(ActionEvent e) { // TODO Auto-generated method stub if(e.getSource() ==bt ){ isWin=false; for (int i = 0; i < 4; i++) for (int j = 0; j < 4; j++) Numbers[i][j] = 0;score = 0;// 保證每次重置游戲都是0分開始 lb.setText('分數:' + score); M.setText('最高分:'+maxscore); int r1 = rand.nextInt(4); int r2 = rand.nextInt(4); int c1 = rand.nextInt(4); int c2 = rand.nextInt(4); while (r1 == r2 && c1 == c2) { r2 = rand.nextInt(4); c2 = rand.nextInt(4); } // 生成數字(2或者4) int value1 = rand.nextInt(2) * 2 + 2; int value2 = rand.nextInt(2) * 2 + 2; // 把數字存進對應的位置 Numbers[r1][c1] = value1; Numbers[r2][c2] = value2; UI.paint(UI.getGraphics()); } else if(e.getSource()==about){ JOptionPane.showMessageDialog(UI, '游戲規則:n' + '開始時棋盤內隨機出現兩個數字,出現的數字僅可能為2或4n' + '玩家可以選擇上下左右四個方向,若棋盤內的數字出現位移或合并,視為有效移動n' + '玩家選擇的方向上若有相同的數字則合并,每次有效移動可以同時合并,但不可以連續合并n' + '合并所得的所有新生成數字想加即為該步的有效得分n' + '玩家選擇的方向行或列前方有空格則出現位移n' + '每有效移動一步,棋盤的空位(無數字處)隨機出現一個數字(依然可能為2或4)n' + '棋盤被數字填滿,無法進行有效移動,判負,游戲結束n' + '棋盤上出現2048,判勝,游戲結束。n' ); } else if(e.getSource()==back&&hasBack==false){ hasBack=true; if(relive==false){ score=tempscore; lb.setText('分數:' + score); for(int i=0;i<BackUp.length;i++){ Numbers[i]=Arrays.copyOf(BackUp[i], BackUp[i].length); } } else{ score=tempscore2; lb.setText('分數:' + score); for(int i=0;i<BackUp2.length;i++){ Numbers[i]=Arrays.copyOf(BackUp2[i], BackUp2[i].length); } relive=false; } UI.paint(UI.getGraphics()); } else if(e.getSource().equals(isSoundBox)){ if (isSoundBox.isSelected()) isSound=false; else isSound=true; } } // 鍵盤監聽 public void keyPressed(KeyEvent event) {int Counter = 0;// 計算器,判斷是否移動了 int NumCounter = 0;// 用于統計整個大方框中數字的個數,判斷是否已滿 int NumNearCounter = 0;// 用于統計相鄰格子數字相同的個數 /* * 方向鍵鍵值:左:37上:38右:39下:40 */ hasBack = false; if (BackUp != null || BackUp.length != 0) { tempscore2 = tempscore;// 先把分數備份好 // 下面的for循環調用java.util.Arrays.copyOf()方法復制數組,實現備份 for (int i = 0; i < BackUp.length; i++) { BackUp2[i] = Arrays.copyOf(BackUp[i], BackUp[i].length); } } tempscore = score;// 先把分數備份好 // 下面的for循環調用java.util.Arrays.copyOf()方法復制數組,實現備份 for (int i = 0; i < Numbers.length; i++) { BackUp[i] = Arrays.copyOf(Numbers[i], Numbers[i].length); } if (isWin == false) { switch (event.getKeyCode()) { case 37: // 向左移動 if (isSound == true) new PlaySound('move.wav').start(); for (int h = 0; h < 4; h++) for (int l = 0; l < 4; l++) if (Numbers[h][l] != 0) { int temp = Numbers[h][l]; int pre = l - 1; while (pre >= 0 && Numbers[h][pre] == 0) { Numbers[h][pre] = temp; Numbers[h][pre + 1] = 0; pre--; Counter++; } } for (int h = 0; h < 4; h++) for (int l = 0; l < 4; l++) if (l + 1 < 4 && (Numbers[h][l] == Numbers[h][l + 1]) && (Numbers[h][l] != 0 || Numbers[h][l + 1] != 0)) { if (isSound == true) new PlaySound('merge.wav').start(); Numbers[h][l] = Numbers[h][l] + Numbers[h][l + 1]; Numbers[h][l + 1] = 0; Counter++; score += Numbers[h][l]; if (Numbers[h][l] == 2048) { isWin = true; } }for (int h = 0; h < 4; h++) for (int l = 0; l < 4; l++) if (Numbers[h][l] != 0) { int temp = Numbers[h][l]; int pre = l - 1; while (pre >= 0 && Numbers[h][pre] == 0) { Numbers[h][pre] = temp; Numbers[h][pre + 1] = 0; pre--; Counter++; } } break; case 39:// 向右移動 if (isSound == true) new PlaySound('move.wav').start(); for (int h = 3; h >= 0; h--) for (int l = 3; l >= 0; l--) if (Numbers[h][l] != 0) { int temp = Numbers[h][l]; int pre = l + 1; while (pre <= 3 && Numbers[h][pre] == 0) { Numbers[h][pre] = temp; Numbers[h][pre - 1] = 0; pre++; Counter++; } } for (int h = 3; h >= 0; h--) for (int l = 3; l >= 0; l--) if (l + 1 < 4 && (Numbers[h][l] == Numbers[h][l + 1]) && (Numbers[h][l] != 0 || Numbers[h][l + 1] != 0)) { if (isSound == true) new PlaySound('merge.wav').start(); Numbers[h][l + 1] = Numbers[h][l] + Numbers[h][l + 1]; Numbers[h][l] = 0; Counter++; score += Numbers[h][l + 1]; if (Numbers[h][l + 1] == 2048) { isWin = true; } } for (int h = 3; h >= 0; h--) for (int l = 3; l >= 0; l--) if (Numbers[h][l] != 0) { int temp = Numbers[h][l]; int pre = l + 1; while (pre <= 3 && Numbers[h][pre] == 0) { Numbers[h][pre] = temp; Numbers[h][pre - 1] = 0; pre++; Counter++; } } break; case 38: //向上移動 if (isSound == true) new PlaySound('move.wav').start(); for (int l = 0; l < 4; l++) for (int h = 0; h < 4; h++) if (Numbers[h][l] != 0) { int temp = Numbers[h][l]; int pre = h - 1; while (pre >= 0 && Numbers[pre][l] == 0) { Numbers[pre][l] = temp; Numbers[pre + 1][l] = 0; pre--; Counter++; } } for (int l = 0; l < 4; l++) for (int h = 0; h < 4; h++) if (h + 1 < 4 && (Numbers[h][l] == Numbers[h + 1][l]) && (Numbers[h][l] != 0 || Numbers[h + 1][l] != 0)) { if (isSound == true) new PlaySound('merge.wav').start(); Numbers[h][l] = Numbers[h][l] + Numbers[h + 1][l]; Numbers[h + 1][l] = 0; Counter++; score += Numbers[h][l]; if (Numbers[h][l] == 2048) { isWin = true; } } for (int l = 0; l < 4; l++) for (int h = 0; h < 4; h++) if (Numbers[h][l] != 0) { int temp = Numbers[h][l]; int pre = h - 1; while (pre >= 0 && Numbers[pre][l] == 0) { Numbers[pre][l] = temp; Numbers[pre + 1][l] = 0; pre--; Counter++; } } break; case 40: // 向下移動 if (isSound == true) new PlaySound('move.wav').start(); for (int l = 3; l >= 0; l--) for (int h = 3; h >= 0; h--) if (Numbers[h][l] != 0) { int temp = Numbers[h][l]; int pre = h + 1; while (pre <= 3 && Numbers[pre][l] == 0) { Numbers[pre][l] = temp; Numbers[pre - 1][l] = 0; pre++; Counter++; } } for (int l = 3; l >= 0; l--) for (int h = 3; h >= 0; h--) if (h + 1 < 4 && (Numbers[h][l] == Numbers[h + 1][l]) && (Numbers[h][l] != 0 || Numbers[h + 1][l] != 0)) { if (isSound == true) new PlaySound('merge.wav').start(); Numbers[h + 1][l] = Numbers[h][l] + Numbers[h + 1][l]; Numbers[h][l] = 0; Counter++; score += Numbers[h + 1][l]; if (Numbers[h + 1][l] == 2048) { isWin = true; } } for (int l = 0; l < 4; l++) for (int h = 0; h < 4; h++) if (Numbers[h][l] != 0) { int temp = Numbers[h][l]; int pre = h - 1; while (pre >= 0 && Numbers[pre][l] == 0) { Numbers[pre][l] = temp; Numbers[pre + 1][l] = 0; pre--; Counter++; } } break;case 40: // 向下移動 if (isSound == true) new PlaySound('move.wav').start(); for (int l = 3; l >= 0; l--) for (int h = 3; h >= 0; h--) if (Numbers[h][l] != 0) { int temp = Numbers[h][l]; int pre = h + 1; while (pre <= 3 && Numbers[pre][l] == 0) { Numbers[pre][l] = temp; Numbers[pre - 1][l] = 0; pre++; Counter++; } } for (int l = 3; l >= 0; l--) for (int h = 3; h >= 0; h--) if (h + 1 < 4 && (Numbers[h][l] == Numbers[h + 1][l]) && (Numbers[h][l] != 0 || Numbers[h + 1][l] != 0)) { if (isSound == true) new PlaySound('merge.wav').start(); Numbers[h + 1][l] = Numbers[h][l] + Numbers[h + 1][l]; Numbers[h][l] = 0; Counter++; score += Numbers[h + 1][l]; if (Numbers[h + 1][l] == 2048) { isWin = true; } } for (int l = 3; l >= 0; l--) for (int h = 3; h >= 0; h--) if (Numbers[h][l] != 0) { int temp = Numbers[h][l]; int pre = h + 1; while (pre <= 3 && Numbers[pre][l] == 0) { Numbers[pre][l] = temp; Numbers[pre - 1][l] = 0; pre++; Counter++; } } break;default:break;} if(maxscore<=score) { maxscore=score; Recorder.setMaxscore(maxscore); Recorder.keepRecording(); } for (int i = 0; i < 3; i++) { for (int j = 0; j < 3; j++) { if (Numbers[i][j] == Numbers[i][j + 1] && Numbers[i][j] != 0) { NumNearCounter++; } if (Numbers[i][j] == Numbers[i + 1][j] && Numbers[i][j] != 0) { NumNearCounter++; } if (Numbers[3][j] == Numbers[3][j + 1] && Numbers[3][j] != 0) { NumNearCounter++; } if (Numbers[i][3] == Numbers[i + 1][3] && Numbers[i][3] != 0) { NumNearCounter++; } } } for (int i = 0; i < 4; i++) { for (int j = 0; j < 4; j++) { if (Numbers[i][j] != 0) { NumCounter++; } } } if (Counter > 0) { lb.setText('分數:' + score); M.setText('最高分:'+maxscore); int r1 = rand.nextInt(4); int c1 = rand.nextInt(4); while (Numbers[r1][c1] != 0) { r1 = rand.nextInt(4); c1 = rand.nextInt(4); } int value1 = rand.nextInt(2) * 2 + 2; Numbers[r1][c1] = value1; }if (isWin == true){ UI.paint(UI.getGraphics()); JOptionPane.showMessageDialog(UI, '恭喜你贏了!n您的最終得分為:' + score); } if (NumCounter == 16 && NumNearCounter == 0) { relive = true; JOptionPane.showMessageDialog(UI, '沒地方可以合并咯!!' + 'n很遺憾,您輸了~>_<~' + 'n悄悄告訴你,游戲有起死回生功能哦,不信你“退一步”試試?' + 'n說不定能扭轉乾坤捏 (^_~)'); } UI.paint(UI.getGraphics()); } } }

3、PlaySound.java

package shixun;import java.io.File;import java.io.IOException;import javax.sound.sampled.AudioFormat;import javax.sound.sampled.AudioInputStream;import javax.sound.sampled.AudioSystem;import javax.sound.sampled.DataLine;import javax.sound.sampled.SourceDataLine;//播放聲音的線程public class PlaySound extends Thread { private String filename; public PlaySound(String wavfile) { filename = 'res/' + wavfile; } public void run() { File soundFile = new File(filename); AudioInputStream audioInputStream = null; try { audioInputStream = AudioSystem.getAudioInputStream(soundFile); } catch (Exception e1) { e1.printStackTrace(); return; } AudioFormat format = audioInputStream.getFormat(); SourceDataLine auline = null; DataLine.Info info = new DataLine.Info(SourceDataLine.class, format); try { auline = (SourceDataLine) AudioSystem.getLine(info); auline.open(format); } catch (Exception e) { e.printStackTrace(); return; } auline.start(); int nBytesRead = 0; // 這是緩沖 byte[] abData = new byte[512]; try { while (nBytesRead != -1) { nBytesRead = audioInputStream.read(abData, 0, abData.length); if (nBytesRead >= 0) auline.write(abData, 0, nBytesRead); } } catch (IOException e) { e.printStackTrace(); return; } finally { auline.drain(); auline.close(); } }}

4、Recorder.java

package shixun;import java.io.BufferedReader;import java.io.BufferedWriter;import java.io.File;import java.io.FileReader;import java.io.FileWriter;import java.io.IOException;public class Recorder { private static int maxscore_2048=0; public static int getMaxscore_2048() { // TODO Auto-generated method stub return maxscore_2048; } public static void setMaxscore(int maxscore_2048) { // TODO Auto-generated method stub Recorder.maxscore_2048=maxscore_2048; } private static FileReader fr=null;private static BufferedReader br=null;private static FileWriter fw=null;private static BufferedWriter bw=null;//從文件中讀取,記錄public static void getRecording(){ boolean flag =false;//判斷文件是否新建 try { File f=new File('src/myRecording.txt'); if(f.exists()) { fr=new FileReader(f); br=new BufferedReader(fr); String n=br.readLine(); maxscore_2048=Integer.parseInt(n); } else { flag=f.createNewFile(); } } catch(Exception e) { e.printStackTrace(); } finally { try { if(!flag) { br.close(); fr.close(); } }catch(Exception e2) { e2.printStackTrace(); } } } //保存最高分記錄 public static void keepRecording() { try { File f=new File('src/myRecording.txt'); fw=new FileWriter(f); bw=new BufferedWriter(fw); bw.write(maxscore_2048+'rn'); }catch(IOException e) { e.printStackTrace(); } finally { try { bw.close(); fw.close(); } catch(IOException e) { e.printStackTrace(); } } } }

四.游戲截圖

java實現2048游戲源代碼

java實現2048游戲源代碼

更多有趣的經典小游戲實現專題,分享給大家:

C++經典小游戲匯總

python經典小游戲匯總

python俄羅斯方塊游戲集合

JavaScript經典游戲 玩不停

java經典小游戲匯總

javascript經典小游戲匯總

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持好吧啦網。

標簽: Java
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
日韩在线第七页| 亚洲福利久久| 久热精品在线| 91亚洲国产高清| 成人精品高清在线视频| 欧美黄色一区| 精品日本视频| 国产一区二区精品久| 精品国产乱码久久久久久1区2匹| 国产亚洲字幕| 麻豆一区二区三| 精品国产精品国产偷麻豆| 精品国产亚洲一区二区三区大结局| 综合色就爱涩涩涩综合婷婷| 亚洲日本久久| 国产精品一线天粉嫩av| 欧美国产极品| 日韩欧美国产精品综合嫩v| 久久久精品网| 尹人成人综合网| 免费观看日韩电影| 欧美日韩精品一区二区三区视频| 国产精品巨作av| 国产一区不卡| 国产精品av久久久久久麻豆网| 综合日韩在线| 麻豆精品新av中文字幕| 桃色av一区二区| 99精品综合| 人人精品人人爱| 欧美亚洲免费| 国产在线不卡一区二区三区| 91精品国产成人观看| 日韩精品一二三区| 国产免费播放一区二区| 精品视频一区二区三区在线观看| 天堂√中文最新版在线| 国产视频一区免费看| 日韩av中文字幕一区二区三区| 免费一区二区三区在线视频| 国产亚洲一区二区手机在线观看 | 国产精品毛片在线看| 欧美 日韩 国产一区二区在线视频| 成人一区而且| 久久福利一区| 国产日韩欧美一区在线| 九九久久国产| 欧美日韩视频一区二区三区| 日韩欧美中文字幕电影| 精品免费av一区二区三区| 亚洲韩日在线| 91福利精品在线观看| av日韩中文| 一区二区三区国产盗摄| 国产一区二区三区四区| 三级在线观看一区二区| 国产日韩欧美一区| 久久激情网站| 国产日韩亚洲欧美精品| 99视频精品视频高清免费| 奇米狠狠一区二区三区| 蜜臀久久精品| 日韩综合一区二区| 视频二区不卡| 欧美午夜三级| 欧美亚洲精品在线| 国产亚洲第一伦理第一区| 久久精品亚洲人成影院| 国产探花在线精品一区二区| 91精品二区| 精品中文字幕一区二区三区 | 婷婷五月色综合香五月| 午夜影院一区| 国产亚洲一区二区三区啪| 亚洲国内欧美| 国产一区二区三区免费在线| 日韩欧美高清一区二区三区| 激情久久久久久久| 免费日韩一区二区三区| 免费人成网站在线观看欧美高清| 日韩天堂在线| 久久精品亚洲一区二区| 蜜桃一区二区三区在线| 久久国内精品自在自线400部| 中文日韩欧美| 欧美aa一级| 国产精品v亚洲精品v日韩精品| 夜久久久久久| 日韩一区二区三区在线免费观看| 久久福利在线| 日韩精选在线| 亚洲一区二区网站| 蜜桃视频在线网站| 久久精品女人| 国产色99精品9i| 亚洲欧美日韩视频二区| 91精品推荐| 精品福利久久久| 欧美日本不卡| 亚洲精品九九| 久久香蕉精品| 亚洲精品**中文毛片| 你懂的国产精品| 色综合视频一区二区三区日韩 | 日韩精品福利一区二区三区| 久久精品青草| 欧美激情福利| 欧美日韩 国产精品| 亚洲一级淫片| 蜜桃久久av一区| 午夜国产精品视频| 99久久激情| 日韩国产激情| 国产一区二区三区不卡av| 国产精品亚洲综合久久| 欧美三级第一页| 久久精品 人人爱| 91精品美女| 亚洲欧洲美洲国产香蕉| 欧美专区18| 国产精品普通话对白| 国内激情久久| 激情婷婷久久| 红桃视频国产一区| 婷婷综合社区| 99国产精品自拍| 最新日韩欧美| 日韩制服丝袜先锋影音| 综合精品一区| 欧美中文一区| 国产精品毛片视频| 国产精品久久久久久妇女| 国产日韩亚洲欧美精品| 偷拍亚洲精品| 国产精品亚洲综合久久| 精品淫伦v久久水蜜桃| 成午夜精品一区二区三区软件| 中文一区一区三区高中清不卡免费| 精品美女久久| 久久久国产亚洲精品| 免费精品国产的网站免费观看| 亚洲先锋成人| 香蕉久久国产| 亚洲精品精选| 国产伦精品一区二区三区千人斩| 国产欧美精品久久| 麻豆国产精品| 日韩欧美1区| 日本少妇一区| 亚洲欧美久久| 韩国女主播一区二区三区| 午夜久久影院| 久久一区精品| 成人污污视频| 欧美sss在线视频| 婷婷激情综合| 日韩欧美中文字幕一区二区三区 | 日韩欧美综合| 日韩欧美看国产| 亚洲精品网址| 日韩三级精品| 91精品国产自产在线丝袜啪| 久久亚洲黄色| 亚洲精品中文字幕乱码| 亚洲精品视频一二三区| 国产精品超碰| 六月婷婷综合| 午夜在线精品偷拍| 国产精品黄网站| 日韩av二区| 六月婷婷一区| 国产精品乱战久久久| 日韩在线看片| 亚洲欧美高清| 国产亚洲精品美女久久| 中文字幕高清在线播放| 99国产精品| 欧美xxxx性| 激情综合网站| 18国产精品| а√在线中文在线新版| 99re国产精品| 免费在线日韩av| 久久国产精品成人免费观看的软件| 免费精品视频在线| 美女久久久久久| 欧美日韩国产探花| 国产极品久久久久久久久波多结野| 久久男人天堂| 男女男精品网站| 97在线精品| 亚洲另类av| 成人午夜毛片| 亚洲丝袜美腿一区| 美女久久99| 亚洲精品欧美| 99久久夜色精品国产亚洲狼| 国产精品天天看天天狠| 欧美日韩视频一区二区三区| 久久影院一区二区三区|