激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - Java實現打飛機小游戲(附完整源碼)

Java實現打飛機小游戲(附完整源碼)

2021-01-22 10:57CSDN鄧帥 Java教程

這篇文章主要介紹了Java實現打飛機小游戲(附完整源碼),這里整理了詳細的代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下

寫在前面

技術源于分享,所以今天抽空把自己之前用java做過的小游戲整理貼出來給大家參考學習。java確實不適合寫桌面應用,這里只是通過這個游戲讓大家理解oop面向對象編程的過程,純屬娛樂。代碼寫的很簡單,也很容易理解,并且注釋寫的很清楚了,還有問題,自己私下去補課學習。

效果如下

Java實現打飛機小游戲(附完整源碼)

完整代碼

敵飛機

?
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
import java.util.random;
 
 
 敵飛機: 是飛行物,也是敵人
 
public class airplane extends flyingobject implements enemy {
 private int speed = 3; //移動步驟
 
 /** 初始化數據 */
 public airplane(){
  this.image = shootgame.airplane;
  width = image.getwidth();
  height = image.getheight();
  y = -height;  
  random rand = new random();
  x = rand.nextint(shootgame.width - width);
 }
 
 /** 獲取分數 */
 @override
 public int getscore() {
  return 5;
 }
 
 /** //越界處理 */
 @override
 public  boolean outofbounds() {
  return y>shootgame.height;
 }
 
 /** 移動 */
 @override
 public void step() {
  y += speed;
 }
 
}

分數獎勵

?
1
2
3
4
5
6
7
8
9
/**
 * 獎勵
 */
public interface award {
 int double_fire = 0; //雙倍火力
 int life = 1; //1條命
 /** 獲得獎勵類型(上面的0或1) */
 int gettype();
}

蜜蜂

?
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
import java.util.random;
 
/** 蜜蜂 */
public class bee extends flyingobject implements award{
 private int xspeed = 1; //x坐標移動速度
 private int yspeed = 2; //y坐標移動速度
 private int awardtype; //獎勵類型
 
 /** 初始化數據 */
 public bee(){
  this.image = shootgame.bee;
  width = image.getwidth();
  height = image.getheight();
  y = -height;
  random rand = new random();
  x = rand.nextint(shootgame.width - width);
  awardtype = rand.nextint(2); //初始化時給獎勵
 }
 
 /** 獲得獎勵類型 */
 public int gettype(){
  return awardtype;
 }
 
 /** 越界處理 */
 @override
 public boolean outofbounds() {
  return y>shootgame.height;
 }
 
 /** 移動,可斜著飛 */
 @override
 public void step() { 
  x += xspeed;
  y += yspeed;
  if(x > shootgame.width-width){
   xspeed = -1;
  }
  if(x < 0){
   xspeed = 1;
  }
 }
}

子彈類:是飛行物體

?
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
/**
 * 子彈類:是飛行物
 */
public class bullet extends flyingobject {
 private int speed = 3; //移動的速度
 
 /** 初始化數據 */
 public bullet(int x,int y){
  this.x = x;
  this.y = y;
  this.image = shootgame.bullet;
 }
 
 /** 移動 */
 @override
 public void step(){ 
  y-=speed;
 }
 
 /** 越界處理 */
 @override
 public boolean outofbounds() {
  return y<-height;
 }
 
}

敵人的分數

?
1
2
3
4
5
6
7
/**
 * 敵人,可以有分數
 */
public interface enemy {
 /** 敵人的分數 */
 int getscore();
}

飛行物(敵機,蜜蜂,子彈,英雄機)

?
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
import java.awt.image.bufferedimage;
 
/**
 * 飛行物(敵機,蜜蜂,子彈,英雄機)
 */
public abstract class flyingobject {
 protected int x; //x坐標
 protected int y; //y坐標
 protected int width; //寬
 protected int height; //高
 protected bufferedimage image; //圖片
 
 public int getx() {
  return x;
 }
 
 public void setx(int x) {
  this.x = x;
 }
 
 public int gety() {
  return y;
 }
 
 public void sety(int y) {
  this.y = y;
 }
 
 public int getwidth() {
  return width;
 }
 
 public void setwidth(int width) {
  this.width = width;
 }
 
 public int getheight() {
  return height;
 }
 
 public void setheight(int height) {
  this.height = height;
 }
 
 public bufferedimage getimage() {
  return image;
 }
 
 public void setimage(bufferedimage image) {
  this.image = image;
 }
 
 /**
  * 檢查是否出界
  * @return true 出界與否
  */
 public abstract boolean outofbounds();
 
 /**
  * 飛行物移動一步
  */
 public abstract void step();
 
 /**
  * 檢查當前飛行物體是否被子彈(x,y)擊(shoot)中
  * @param bullet 子彈對象
  * @return true表示被擊中了
  */
 public boolean shootby(bullet bullet){
  int x = bullet.x; //子彈橫坐標
  int y = bullet.y; //子彈縱坐標
  return this.x<x && x<this.x+width && this.y<y && y<this.y+height;
 }
 
}

英雄機

?
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
import java.awt.image.bufferedimage;
 
/**
 * 英雄機:是飛行物 java學習交流qq群:589809992 我們一起學java!
 */
public class hero extends flyingobject{
 
 private bufferedimage[] images = {}; //英雄機圖片
 private int index = 0;    //英雄機圖片切換索引
 
 private int doublefire; //雙倍火力
 private int life; //命
 
 /** 初始化數據 */
 public hero(){
  life = 3; //初始3條命
  doublefire = 0; //初始火力為0
  images = new bufferedimage[]{shootgame.hero0, shootgame.hero1}; //英雄機圖片數組
  image = shootgame.hero0; //初始為hero0圖片
  width = image.getwidth();
  height = image.getheight();
  x = 150;
  y = 400;
 }
 
 /** 獲取雙倍火力 */
 public int isdoublefire() {
  return doublefire;
 }
 
 /** 設置雙倍火力 */
 public void setdoublefire(int doublefire) {
  this.doublefire = doublefire;
 }
 
 /** 增加火力 */
 public void adddoublefire(){
  doublefire = 40;
 }
 
 /** 增命 */
 public void addlife(){ //增命
  life++;
 }
 
 /** 減命 */
 public void subtractlife(){ //減命
  life--;
 }
 
 /** 獲取命 */
 public int getlife(){
  return life;
 }
 
 /** 當前物體移動了一下,相對距離,x,y鼠標位置 */
 public void moveto(int x,int y){ 
  this.x = x - width/2;
  this.y = y - height/2;
 }
 
 /** 越界處理 */
 @override
 public boolean outofbounds() {
  return false;
 }
 
 /** 發射子彈 */
 public bullet[] shoot(){ 
  int xstep = width/4//4半
  int ystep = 20; //步
  if(doublefire>0){ //雙倍火力
   bullet[] bullets = new bullet[2];
   bullets[0] = new bullet(x+xstep,y-ystep); //y-ystep(子彈距飛機的位置)
   bullets[1] = new bullet(x+3*xstep,y-ystep);
   return bullets;
  }else//單倍火力
   bullet[] bullets = new bullet[1];
   bullets[0] = new bullet(x+2*xstep,y-ystep);
   return bullets;
  }
 }
 
 /** 移動 */
 @override
 public void step() {
  if(images.length>0){
   image = images[index++/10%images.length]; //切換圖片hero0,hero1
  }
 }
 
 /** 碰撞算法 */
 public boolean hit(flyingobject other){
 
  int x1 = other.x - this.width/2;     //x坐標最小距離
  int x2 = other.x + this.width/2 + other.width; //x坐標最大距離
  int y1 = other.y - this.height/2;    //y坐標最小距離
  int y2 = other.y + this.height/2 + other.height; //y坐標最大距離
 
  int herox = this.x + this.width/2;    //英雄機x坐標中心點距離
  int heroy = this.y + this.height/2;    //英雄機y坐標中心點距離
 
  return herox>x1 && herox<x2 && heroy>y1 && heroy<y2; //區間范圍內為撞上了
 }
 
}

游戲啟動主類

?
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
import java.awt.font;
import java.awt.color;
import java.awt.graphics;
import java.awt.event.mouseadapter;
import java.awt.event.mouseevent;
import java.util.arrays;
import java.util.random;
import java.util.timer;
import java.util.timertask;
import java.awt.image.bufferedimage;
 
import javax.imageio.imageio;
import javax.swing.imageicon;
import javax.swing.jframe;
import javax.swing.jpanel;
/**
 * java學習交流qq群:589809992 我們一起學java!
 */
public class shootgame extends jpanel {
 public static final int width = 400; // 面板寬
 public static final int height = 654; // 面板高
 /** 游戲的當前狀態: start running pause game_over */
 private int state;
 private static final int start = 0;
 private static final int running = 1;
 private static final int pause = 2;
 private static final int game_over = 3;
 
 private int score = 0; // 得分
 private timer timer; // 定時器
 private int intervel = 1000 / 100; // 時間間隔(毫秒)
 
 public static bufferedimage background;
 public static bufferedimage start;
 public static bufferedimage airplane;
 public static bufferedimage bee;
 public static bufferedimage bullet;
 public static bufferedimage hero0;
 public static bufferedimage hero1;
 public static bufferedimage pause;
 public static bufferedimage gameover;
 
 private flyingobject[] flyings = {}; // 敵機數組
 private bullet[] bullets = {}; // 子彈數組
 private hero hero = new hero(); // 英雄機
 
 static { // 靜態代碼塊,初始化圖片資源
  try {
   background = imageio.read(shootgame.class
     .getresource("background.png"));
   start = imageio.read(shootgame.class.getresource("start.png"));
   airplane = imageio
     .read(shootgame.class.getresource("airplane.png"));
   bee = imageio.read(shootgame.class.getresource("bee.png"));
   bullet = imageio.read(shootgame.class.getresource("bullet.png"));
   hero0 = imageio.read(shootgame.class.getresource("hero0.png"));
   hero1 = imageio.read(shootgame.class.getresource("hero1.png"));
   pause = imageio.read(shootgame.class.getresource("pause.png"));
   gameover = imageio
     .read(shootgame.class.getresource("gameover.png"));
  } catch (exception e) {
   e.printstacktrace();
  }
 }
 
 /** 畫 */
 @override
 public void paint(graphics g) {
  g.drawimage(background, 0, 0, null); // 畫背景圖
  painthero(g); // 畫英雄機
  paintbullets(g); // 畫子彈
  paintflyingobjects(g); // 畫飛行物
  paintscore(g); // 畫分數
  paintstate(g); // 畫游戲狀態
 }
 
 /** 畫英雄機 */
 public void painthero(graphics g) {
  g.drawimage(hero.getimage(), hero.getx(), hero.gety(), null);
 }
 
 /** 畫子彈 */
 public void paintbullets(graphics g) {
  for (int i = 0; i < bullets.length; i++) {
   bullet b = bullets[i];
   g.drawimage(b.getimage(), b.getx() - b.getwidth() / 2, b.gety(),
     null);
  }
 }
 
 /** 畫飛行物 */
 public void paintflyingobjects(graphics g) {
  for (int i = 0; i < flyings.length; i++) {
   flyingobject f = flyings[i];
   g.drawimage(f.getimage(), f.getx(), f.gety(), null);
  }
 }
 
 /** 畫分數 */
 public void paintscore(graphics g) {
  int x = 10; // x坐標
  int y = 25; // y坐標
  font font = new font(font.sans_serif, font.bold, 22); // 字體
  g.setcolor(new color(0xff0000));
  g.setfont(font); // 設置字體
  g.drawstring("score:" + score, x, y); // 畫分數
  y=y+20; // y坐標增20
  g.drawstring("life:" + hero.getlife(), x, y); // 畫命
 }
 
 /** 畫游戲狀態 */
 public void paintstate(graphics g) {
  switch (state) {
  case start: // 啟動狀態
   g.drawimage(start, 0, 0, null);
   break;
  case pause: // 暫停狀態
   g.drawimage(pause, 0, 0, null);
   break;
  case game_over: // 游戲終止狀態
   g.drawimage(gameover, 0, 0, null);
   break;
  }
 }
 
 public static void main(string[] args) {
  jframe frame = new jframe("fly");
  shootgame game = new shootgame(); // 面板對象
  frame.add(game); // 將面板添加到jframe中
  frame.setsize(width, height); // 設置大小
  frame.setalwaysontop(true); // 設置其總在最上
  frame.setdefaultcloseoperation(jframe.exit_on_close); // 默認關閉操作
  frame.seticonimage(new imageicon("images/icon.jpg").getimage()); // 設置窗體的圖標
  frame.setlocationrelativeto(null); // 設置窗體初始位置
  frame.setvisible(true); // 盡快調用paint
 
  game.action(); // 啟動執行
 }
 
 /** 啟動執行代碼 */
 public void action() {
  // 鼠標監聽事件
  mouseadapter l = new mouseadapter() {
   @override
   public void mousemoved(mouseevent e) { // 鼠標移動
    if (state == running) { // 運行狀態下移動英雄機--隨鼠標位置
     int x = e.getx();
     int y = e.gety();
     hero.moveto(x, y);
    }
   }
 
   @override
   public void mouseentered(mouseevent e) { // 鼠標進入
    if (state == pause) { // 暫停狀態下運行
     state = running;
    }
   }
 
   @override
   public void mouseexited(mouseevent e) { // 鼠標退出
    if (state == running) { // 游戲未結束,則設置其為暫停
     state = pause;
    }
   }
 
   @override
   public void mouseclicked(mouseevent e) { // 鼠標點擊
    switch (state) {
    case start:
     state = running; // 啟動狀態下運行
     break;
    case game_over: // 游戲結束,清理現場
     flyings = new flyingobject[0]; // 清空飛行物
     bullets = new bullet[0]; // 清空子彈
     hero = new hero(); // 重新創建英雄機
     score = 0; // 清空成績
     state = start; // 狀態設置為啟動
     break;
    }
   }
  };
  this.addmouselistener(l); // 處理鼠標點擊操作
  this.addmousemotionlistener(l); // 處理鼠標滑動操作
 
  timer = new timer(); // 主流程控制
  timer.schedule(new timertask() {
   @override
   public void run() {
    if (state == running) { // 運行狀態
     enteraction(); // 飛行物入場
     stepaction(); // 走一步
     shootaction(); // 英雄機射擊
     bangaction(); // 子彈打飛行物
     outofboundsaction(); // 刪除越界飛行物及子彈
     checkgameoveraction(); // 檢查游戲結束
    }
    repaint(); // 重繪,調用paint()方法
   }
 
  }, intervel, intervel);
 }
 
 int flyenteredindex = 0; // 飛行物入場計數
 
 /** 飛行物入場 */
 public void enteraction() {
  flyenteredindex++;
  if (flyenteredindex % 40 == 0) { // 400毫秒生成一個飛行物--10*40
   flyingobject obj = nextone(); // 隨機生成一個飛行物
   flyings = arrays.copyof(flyings, flyings.length + 1);
   flyings[flyings.length - 1] = obj;
  }
 }
 
 /** 走一步 */
 public void stepaction() {
  for (int i = 0; i < flyings.length; i++) { // 飛行物走一步
   flyingobject f = flyings[i];
   f.step();
  }
 
  for (int i = 0; i < bullets.length; i++) { // 子彈走一步
   bullet b = bullets[i];
   b.step();
  }
  hero.step(); // 英雄機走一步
 }
 
 /** 飛行物走一步 */
 public void flyingstepaction() {
  for (int i = 0; i < flyings.length; i++) {
   flyingobject f = flyings[i];
   f.step();
  }
 }
 
 int shootindex = 0; // 射擊計數
 
 /** 射擊 */
 public void shootaction() {
  shootindex++;
  if (shootindex % 30 == 0) { // 300毫秒發一顆
   bullet[] bs = hero.shoot(); // 英雄打出子彈
   bullets = arrays.copyof(bullets, bullets.length + bs.length); // 擴容
   system.arraycopy(bs, 0, bullets, bullets.length - bs.length,
     bs.length); // 追加數組
  }
 }
 
 /** 子彈與飛行物碰撞檢測 */
 public void bangaction() {
  for (int i = 0; i < bullets.length; i++) { // 遍歷所有子彈
   bullet b = bullets[i];
   bang(b); // 子彈和飛行物之間的碰撞檢查
  }
 }
 
 /** 刪除越界飛行物及子彈 */
 public void outofboundsaction() {
  int index = 0; // 索引
  flyingobject[] flyinglives = new flyingobject[flyings.length]; // 活著的飛行物
  for (int i = 0; i < flyings.length; i++) {
   flyingobject f = flyings[i];
   if (!f.outofbounds()) {
    flyinglives[index++] = f; // 不越界的留著
   }
  }
  flyings = arrays.copyof(flyinglives, index); // 將不越界的飛行物都留著
 
  index = 0; // 索引重置為0
  bullet[] bulletlives = new bullet[bullets.length];
  for (int i = 0; i < bullets.length; i++) {
   bullet b = bullets[i];
   if (!b.outofbounds()) {
    bulletlives[index++] = b;
   }
  }
  bullets = arrays.copyof(bulletlives, index); // 將不越界的子彈留著
 }
 
 /** 檢查游戲結束 */
 public void checkgameoveraction() {
  if (isgameover()==true) {
   state = game_over; // 改變狀態
  }
 }
 
 /** 檢查游戲是否結束 */
 public boolean isgameover() {
 
  for (int i = 0; i < flyings.length; i++) {
   int index = -1;
   flyingobject obj = flyings[i];
   if (hero.hit(obj)) { // 檢查英雄機與飛行物是否碰撞
    hero.subtractlife(); // 減命
    hero.setdoublefire(0); // 雙倍火力解除
    index = i; // 記錄碰上的飛行物索引
   }
   if (index != -1) {
    flyingobject t = flyings[index];
    flyings[index] = flyings[flyings.length - 1];
    flyings[flyings.length - 1] = t; // 碰上的與最后一個飛行物交換
 
    flyings = arrays.copyof(flyings, flyings.length - 1); // 刪除碰上的飛行物
   }
  }
 
  return hero.getlife() <= 0;
 }
 
 /** 子彈和飛行物之間的碰撞檢查 */
 public void bang(bullet bullet) {
  int index = -1; // 擊中的飛行物索引
  for (int i = 0; i < flyings.length; i++) {
   flyingobject obj = flyings[i];
   if (obj.shootby(bullet)) { // 判斷是否擊中
    index = i; // 記錄被擊中的飛行物的索引
    break;
   }
  }
  if (index != -1) { // 有擊中的飛行物
   flyingobject one = flyings[index]; // 記錄被擊中的飛行物
 
   flyingobject temp = flyings[index]; // 被擊中的飛行物與最后一個飛行物交換
   flyings[index] = flyings[flyings.length - 1];
   flyings[flyings.length - 1] = temp;
 
   flyings = arrays.copyof(flyings, flyings.length - 1); // 刪除最后一個飛行物(即被擊中的)
 
   // 檢查one的類型(敵人加分,獎勵獲取)
   if (one instanceof enemy) { // 檢查類型,是敵人,則加分
    enemy e = (enemy) one; // 強制類型轉換
    score += e.getscore(); // 加分
   } else { // 若為獎勵,設置獎勵
    award a = (award) one;
    int type = a.gettype(); // 獲取獎勵類型
    switch (type) {
    case award.double_fire:
     hero.adddoublefire(); // 設置雙倍火力
     break;
    case award.life:
     hero.addlife(); // 設置加命
     break;
    }
   }
  }
 }
 
 /**
  * 隨機生成飛行物
  *
  * @return 飛行物對象
  */
 public static flyingobject nextone() {
  random random = new random();
  int type = random.nextint(20); // [0,20)
  if (type < 4) {
   return new bee();
  } else {
   return new airplane();
  }
 }
 
}

寫在最后

以上就是這個游戲我整理的完整代碼,最后,我做了一張思維導圖貼出來讓大家更好的理解oop面向對象編程的過程。

Java實現打飛機小游戲(附完整源碼)

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。

原文鏈接:http://geek.csdn.net/news/detail/240582

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 欧美18—19sex性护士中国 | 999久久久久久 | gogo全球大胆高清人露出91 | 国产免费一区二区三区视频 | 欧美成人精品不卡视频在线观看 | 日韩大片在线永久观看视频网站免费 | 欧美高清另类自拍视频在线看 | 国产亚洲精品久久久久久网站 | 黄色网址免费进入 | 泰剧19禁啪啪无遮挡大尺度 | 成人爽a毛片免费啪啪红桃视频 | gogo全球大胆高清人露出91 | 黄色免费播放网站 | 国产精品久久久久久模特 | 国产精品久久久久久久久久大牛 | 国产中出视频 | 成人免费av在线 | 国产一区二区影视 | 强伦女教师视频 | 久久思思爱 | 成人毛片视频在线播放 | 日韩视频在线免费 | 欧美一级黄色片在线观看 | 免费国产之a视频 | 91久久99热青草国产 | 欧美成人午夜精品久久久 | 欧美成年人视频在线观看 | 999久久国精品免费观看网站 | 久久99国产精品视频 | 日本在线看 | 逼特逼视频在线观看 | 亚洲艳情网站 | 久久久久久免费免费 | 999精品国产 | av在线免费在线观看 | 性爱视频在线免费 | 精品一区二区在线观看视频 | 日韩在线播放中文字幕 | 亚洲最大中文字幕 | 精品一区二区免费视频视频 | 久久精品片 |