在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

鴻湖萬聯“競”開發板體驗:基于eTSUI框架的2048小游戲

電子發燒友開源社區 ? 來源:未知 ? 2022-12-06 12:10 ? 次閱讀

前言

2048是一款比較流行的數字游戲,本demo基于ets ui框架,在grid組件基礎上實現。

過程

從以下地址下載代碼:https://gitee.com/qinyunti/knowledge_demo_smart_home.git

打開DevEco Studio 3.0.0.993

c541cfc2-751b-11ed-8abf-dac502259ad0.png

打開工程:

c5658dfe-751b-11ed-8abf-dac502259ad0.png

c5815a2a-751b-11ed-8abf-dac502259ad0.png

更新:

c5a7bfe4-751b-11ed-8abf-dac502259ad0.png

點擊Run,有如下提示按圖配置即可:

c5b8877a-751b-11ed-8abf-dac502259ad0.png

c5c81dde-751b-11ed-8abf-dac502259ad0.png

代碼分析

程序入口:src/main/ets/MainAbility/app.ets

import Logger from '../MainAbility/model/Logger'


const TAG: string = `[App]`


export default {
onCreate() {
Logger.info(TAG, `Application onCreate`)
},
onDestroy() {
Logger.info(TAG, `Application onDestroy`)
},
}

(左右移動查看全部內容)

邏輯代碼位于:src/main/ets/MainAbility/model/GameRule.ts

//gameStatus
enum GameStatus {
  BEFORE = -1,
  RUNNING = 1,
  OVER = 0
}


export class GameRule {
  private row: number = 4
  private column: number = 4


  private index(i: number, j: number) {
    return i * this.row + j
  }


  dataNumbers: number[]
  status: number = GameStatus.BEFORE
  score: number = 0


  constructor(dataNumbers: number[]) {
    this.dataNumbers = dataNumbers
  }


  //random
  randomNum() {
    do {
      let a = Math.floor(Math.random() * this.dataNumbers.length)
      if (this.dataNumbers[a] === 0) {
        let num = Math.random() > 0.3 ? 2 : 4
        this.dataNumbers[a] = num
        break
      }
    } while (this.dataNumbers.some((val) => {
      return val === 0
    }))
  }


  //init
  init() {
    this.dataNumbers = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
    this.status = GameStatus.RUNNING
    this.score = 0
    this.randomNum()
    this.randomNum()
  }


  //move
  move(direction: string) {
    let before = String(this.dataNumbers)
    let length = (direction === 'left' || direction === 'right') ? this.row : this.column
    for (let a = 0;a < length; a++) {
      this.moveInRow(direction, a)
    }
    let after = String(this.dataNumbers)
    if (before !== after) {
      this.randomNum()
      if (this.isGameOver()) {
        this.status = GameStatus.OVER
      }
    }
  }


  //prepare to move
  moveInRow(direction: string, a: number) {
    if (direction === 'left') {
      for (let b = 0;b < this.column - 1; b++) {
        let next = this.moveNext(a, b, direction)
        b = this.dataChange(a, b, next, direction).b
        if (next === -1) break
      }
    } else if (direction === 'right') {
      for (let b = this.column - 1;b > 0; b--) {
        let next = this.moveNext(a, b, direction)
        b = this.dataChange(a, b, next, direction).b
        if (next === -1) break
      }
    } else if (direction === 'up') {
      for (let b = 0;b < this.row - 1; b++) {
        let next = this.moveNext(b, a, direction)
        b = this.dataChange(b, a, next, direction).a
        if (next === -1) break
      }
    } else if (direction === 'down') {
      for (let b = this.row - 1;b > 0; b--) {
        let next = this.moveNext(b, a, direction)
        b = this.dataChange(b, a, next, direction).a
        if (next === -1) break
      }
    }
  }


  //new number moveStatus
  moveNext(a: number, b: number, direction: string) {
    if (direction === 'left') {
      for (let i = b + 1;i < this.column; i++) {
        if (this.dataNumbers[this.index(a, i)] !== 0) {
          return i
        }
      }
    } else if (direction === 'right') {
      for (let i = b - 1;i >= 0; i--) {
        if (this.dataNumbers[this.index(a, i)] !== 0) {
          return i
        }
      }
    } else if (direction === 'up') {
      for (let i = a + 1;i < 4; i++) {
        if (this.dataNumbers[this.index(i, b)] !== 0) {
          return i
        }
      }
    } else if (direction === 'down') {
      for (let i = a - 1;i >= 0; i--) {
        if (this.dataNumbers[this.index(i, b)] !== 0) {
          return i
        }
      }
    }
    return -1
  }


  //get gameStatus
  isGameOver() {
    for (let a = 0;a < this.row; a++) {
      for (let b = 0;b < this.column; b++) {
        let tempA = this.index(a, b)
        if (this.dataNumbers[tempA] === 0) {
          return false
        }
        if (a < this.row - 1) {
          if (this.dataNumbers[tempA] === this.dataNumbers[this.index(a + 1, b)]) {
            return false
          }
        }
        if (b < this.column - 1) {
          if (this.dataNumbers[tempA] === this.dataNumbers[tempA+1]) {
            return false
          }
        }
      }
    }
    return true
  }


  //move and merge
  dataChange(a: number, b: number, next: number, direction: string) {
    let tempA = this.index(a, b)
    let tempB = 0
    if (direction === 'left' || direction === 'right') {
      tempB = this.index(a, next)
    } else {
      tempB = this.index(next, b)
    }
    if (next !== -1) {
      if (this.dataNumbers[tempA] === 0) {
        this.dataNumbers[tempA] = this.dataNumbers[tempB]
        this.dataNumbers[tempB] = 0
        direction === 'left' && b--
        direction === 'right' && b++
        direction === 'up' && a--
        direction === 'down' && a++
      } else if (this.dataNumbers[tempA] === this.dataNumbers[tempB]) {
        this.dataNumbers[tempA] *= 2
        this.score += this.dataNumbers[tempA]
        this.dataNumbers[tempB] = 0
      }
    }
    return {
      a, b
    }
  }

(左右移動查看全部內容)

繪圖位于:src/main/ets/MainAbility/pages/Game2048.ets

class BasicDataSource implements IDataSource {
 private listeners: DataChangeListener[] = []


 public totalCount(): number {
  return 0
 }


 public getData(index: number): any {
  return undefined
 }


 registerDataChangeListener(listener: DataChangeListener): void {
  if (this.listeners.indexOf(listener) < 0) {
   this.listeners.push(listener)
  }
 }


 unregisterDataChangeListener(listener: DataChangeListener): void {
  const pos = this.listeners.indexOf(listener);
  if (pos >= 0) {
   this.listeners.splice(pos, 1)
  }
 }


 notifyDataReload(): void {
  this.listeners.forEach(listener => {
   listener.onDataReloaded()
  })
 }


 notifyDataAdd(index: number): void {
  this.listeners.forEach(listener => {
   listener.onDataAdded(index)
  })
 }


 notifyDataChange(index: number): void {
  this.listeners.forEach(listener => {
   listener.onDataChanged(index)
  })
 }
}


class MyDataSource extends BasicDataSource {
 public dataArray: string[] = []


 constructor(ele) {
  super()
  for (var index = 0;index < ele.length; index++) {
   this.dataArray.push(ele[index])
  }
 }


 public totalCount(): number {
  return this.dataArray.length
 }


 public getData(index: number): any {
  return this.dataArray[index]
 }


 public addData(index: number, data: string): void {
  this.dataArray.splice(index, 0)
  this.notifyDataAdd(index)
 }
}


enum GameStatus {
 BEFORE = -1,
 RUNNING = 1,
 OVER = 0
}


import display from '@ohos.display'
import Logger from '../model/Logger'
import dataStorage from '@ohos.data.storage'
import { GameRule } from '../model/GameRule'
import featureAbility from '@ohos.ability.featureAbility'


const TAG = '[Game2048]'


@Entry
@Component
struct Game2048 {
 @State dataNumbers: number[] = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
 private gameRule: GameRule = new GameRule(this.dataNumbers)
 @State maxScore: number = 123456
 @State curScore: number = 0
 @State @Watch("onGameOver") gameStatus: number = GameStatus.BEFORE
 @State textColor: string[] = ['#f0fff0', '#eee3da', '#ede0c8', '#f2b179', '#f59563', '#f67c5f', '#f65e3b', '#edcf72', '#edcc61', '#9c0', '#33b5e5', '#09c', '#a6c', '#93c']
 dialogController: CustomDialogController = new CustomDialogController({
  builder: ScorePannel({
   curScore: this.curScore,
   maxScore: this.maxScore,
   gameStart: this.gameStart.bind(this)
  }),
  autoCancel: false
 })
 @State screenSize: {
  x: number,
  y: number
 } = { x: px2vp(1080), y: px2vp(0) }


 //gameStatus listener
 onGameOver() {
  if (this.gameStatus === GameStatus.OVER) {
   this.curScore = this.gameRule.score
   this.dialogController.open()
  }
 }


 //restart game
 gameStart() {
  this.gameRule.init()
  this.dataNumbers = this.gameRule.dataNumbers
  this.gameStatus = GameStatus.RUNNING
  this.handleLocalData('put')
 }


 //dataView
 dataView() {
  this.dataNumbers = this.gameRule.dataNumbers
  this.gameStatus = this.gameRule.status
  this.curScore = this.gameRule.score
 }


 aboutToAppear() {
  display.getDefaultDisplay((err, data) => {
   if (data.height > data.width) {
    this.screenSize = { x: px2vp(data.width), y: px2vp(data.height) }
   } else {
    this.screenSize = { x: px2vp(750), y: px2vp(data.width) }
   }
   Logger.info(TAG, `寬 ${this.screenSize.x}`)
   Logger.info(TAG, `高 ${this.screenSize.y}`)
  })
  this.handleLocalData('has')
 }


 //handle local data
 handleLocalData(method: string) {
  let context = featureAbility.getContext()
  context.getFilesDir((err, path) => {
   let storage = dataStorage.getStorageSync(path + '/mystore')
   if (method === 'put') {
    storage.putSync('gameData', JSON.stringify(this.dataNumbers))
    let score: string = this.gameRule.score.toString()
    storage.putSync('score', score)
    storage.putSync('gameStatus', this.gameRule.status.toString())
    storage.flushSync()
   } else if (method === 'has') {
    if (storage.hasSync('gameData')) {
     this.gameRule.score = this.curScore = Number(storage.getSync('score', 'string'))
     this.gameStatus = this.gameRule.status = Number(storage.getSync('gameStatus', 'string'))
     this.dataNumbers = this.gameRule.dataNumbers = JSON.parse(storage.getSync('gameData', 'string').toString())
    }
   }
  })
 }


 build() {
  Column() {
   Column() {
    Row() {
     Image($r('app.media.logo2048'))
      .width(this.screenSize.x * 0.25)
      .height(this.screenSize.x * 0.25)


     Column() {
      Text('Score')
       .fontSize('30px')
       .fontColor('#efe1d3')
       .fontWeight(FontWeight.Bolder)


      Text(`${this.gameRule.score}`)
       .fontSize('30px')
       .fontColor('#fcf8f5')
       .fontWeight(FontWeight.Bolder)
     }
     .alignItems(HorizontalAlign.Center)
     .justifyContent(FlexAlign.Center)
     .backgroundColor('#bbada0')
     .width(this.screenSize.x * 0.25)
     .height(this.screenSize.x * 0.25)
     .borderRadius(15)


     Column() {
      Text('Max')
       .fontSize('50px')
       .fontColor('#efe1d3')
       .fontWeight(FontWeight.Bolder)


      Text(`${this.maxScore}`)
       .fontSize('30px')
       .fontColor('#fcf8f5')
       .fontWeight(FontWeight.Bolder)
     }
     .alignItems(HorizontalAlign.Center)
     .justifyContent(FlexAlign.Center)
     .backgroundColor('#bbada0')
     .width(this.screenSize.x * 0.25)
     .height(this.screenSize.x * 0.25)
     .borderRadius(15)
    }
    .alignItems(VerticalAlign.Center)
    .justifyContent(FlexAlign.SpaceAround)
    .margin({ bottom: 20 })
    .width(this.screenSize.x)


    Grid() {
     LazyForEach(new MyDataSource(this.dataNumbers), (item) => {
      GridItem() {
       Text(`${item === 0 ? '' : item}`)
        .fontSize('85px')
        .fontColor(item <= 4 ? '#000' : '#fcf8f5')
        .fontWeight(FontWeight.Bolder)
        .backgroundColor('#f0fff0')
        .width('100%')
        .height('100%')
        .textAlign(TextAlign.Center)
        .borderRadius(10)
        .backgroundColor(this.textColor[(Math.log(item) / Math.log(2))])
      }
     })
    }
    .columnsTemplate('1fr 1fr 1fr 1fr')
    .rowsTemplate('1fr 1fr 1fr 1fr')
    .columnsGap(10)
    .rowsGap(10)
    .width(this.screenSize.x)
    .padding(10)
    .backgroundColor('rgba(80,69,46,0.26)')
    .height(this.screenSize.x)
    .borderRadius(10)
    .gesture(GestureGroup(GestureMode.Exclusive,
    PanGesture({ direction: PanDirection.Left }).onActionEnd(() => {
     this.gameRule.status === 1 && this.gameRule.move('left')
     this.dataView()
     this.handleLocalData('put')
    }),
    PanGesture({ direction: PanDirection.Right }).onActionEnd(() => {
     this.gameRule.status === 1 && this.gameRule.move('right')
     this.dataView()
     this.handleLocalData('put')
    }),
    PanGesture({ direction: PanDirection.Up }).onActionEnd(() => {
     this.gameRule.status === 1 && this.gameRule.move('up')
     this.dataView()
     this.handleLocalData('put')
    }),
    PanGesture({ direction: PanDirection.Down }).onActionEnd(() => {
     this.gameRule.status === 1 && this.gameRule.move('down')
     this.dataView()
     this.handleLocalData('put')
    })
    ))


    if (this.gameStatus === -1) {
     Button('Start', { type: ButtonType.Normal })
      .borderRadius(5)
      .margin({ top: 50 })
      .width(200)
      .key('startGame')
      .onClick(() => {
       this.gameStart()
      })
    }
   }
   .alignItems(HorizontalAlign.Center)
   .justifyContent(FlexAlign.Center)
   .height('100%')
   .width('100%')
  }
  .alignItems(HorizontalAlign.Center)
  .justifyContent(FlexAlign.Start)
  .width('100%')
  .height('100%')
  .backgroundImage($r('app.media.gridBackground'))
  .backgroundImageSize(ImageSize.Cover)
 }
}


@CustomDialog
struct ScorePannel {
 controller: CustomDialogController
 gameStart: () => void
 curScore: number
 maxScore: number


 build() {
  Column() {
   Text('Game Over')
    .fontSize(30)
    .fontWeight(FontWeight.Medium)
    .margin({ top: 10 })


   Text('Score')
    .fontColor('#C8A584')
    .fontSize(20)
    .margin({ top: 10 })


   Text(`${this.curScore}`)
    .fontColor('#5D5D5D')
    .fontSize(40)
    .margin({ top: 10 })


   Text(`maxScore:${this.maxScore}`)
    .fontSize(20)
    .width('90%')
    .borderRadius(20)
    .margin({ top: 10 })
    .height(40)
    .textAlign(TextAlign.Center)


   Row() {
    Button('Reset', { type: ButtonType.Normal })
     .borderRadius(5)
     .margin({ top: 10 })
     .width(200)
     .onClick(() => {
      this.gameStart()
      this.controller.close()
     })
   }.justifyContent(FlexAlign.SpaceAround)
   .margin({ top: 10, bottom: 10 })
  }
  .backgroundColor('#f0f0f0')
  .borderRadius(25)
 }
}

(左右移動查看全部內容)

總結

基于eTS UI框架能夠,基于各種組件進行快速的UI應用開發。

更多熱點文章閱讀

  • LiteOS-A內核中的procfs文件系統分析
  • 移植speexdspOpenHarmony標準系統②
  • 移植speexdsp到OpenHarmony標準系統③
  • 移植speexdsp到OpenHarmony標準系統④
  • 基于OpenHarmony的智能門禁系統,讓出行更便捷

提示:本文電子燒友社區發布,轉載請注明以上來源。如需社區合作及入群交流,請添加微信EEFans0806,或者發郵箱liuyong@huaqiu.com。


原文標題:鴻湖萬聯“競”開發板體驗:基于eTSUI框架的2048小游戲

文章出處:【微信公眾號:電子發燒友開源社區】歡迎添加關注!文章轉載請注明出處。


聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 電子發燒友
    +關注

    關注

    33

    文章

    556

    瀏覽量

    33120
  • 開源社區
    +關注

    關注

    0

    文章

    95

    瀏覽量

    487

原文標題:鴻湖萬聯“競”開發板體驗:基于eTSUI框架的2048小游戲

文章出處:【微信號:HarmonyOS_Community,微信公眾號:電子發燒友開源社區】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    軟通動力和蒞臨開放原子開源基金會參觀交流

    為進一步增進互信,深化開源生態協同建設,2月11日,軟通動力董事、董事長黃穎率團隊赴開放原子開源基金會(以下簡稱“基金會”)進行參觀交流。此次交流中,黃穎與基金會理事長程曉明,
    的頭像 發表于 02-13 17:29 ?362次閱讀

    如何安裝模擬器玩nes小游戲-基于米爾瑞芯微RK3576開發板

    本篇源自:優秀創作者 小手涼涼本文將介紹基于米爾電子MYD-LR3576開發板(米爾基于瑞芯微 RK3576開發板)的安裝模擬器玩nes小游戲方案測試。 核心系統 操作系統鏡像文件說
    發表于 02-08 12:10

    微展世與攜手發布WeOS開源鴻蒙工業操作系統

    近日,微展世(北京)數字科技有限公司(簡稱“微展世”)在北京隆重舉辦了2025年度的產品發布與戰略簽約盛會。此次盛會中,微展世的重要戰略合作伙伴——軟通動力及其子公司受邀出席。
    的頭像 發表于 01-23 15:48 ?315次閱讀

    ?軟通動力子公司攜手南方科技大學 共筑開源鴻蒙人才培養新高地

    1月4日,軟通動力子公司與南方科技大學攜手,開展了一系列旨在推動開源鴻蒙生態發展的活動。在此期間,
    的頭像 發表于 01-20 17:02 ?327次閱讀
    ?軟通動力子公司<b class='flag-5'>鴻</b><b class='flag-5'>湖</b><b class='flag-5'>萬</b><b class='flag-5'>聯</b>攜手南方科技大學 共筑開源鴻蒙人才培養新高地

    軟通動力攜與微展世簽署戰略合作協議

    近日,軟通動力攜子公司,與微展世(北京)數字科技有限公司(簡稱“微展世”)在廣州簽署戰略合作協議,三方將聯合開發基于開源鴻蒙的WeO
    的頭像 發表于 01-10 10:16 ?197次閱讀

    攜手南方科技大學推動開源鴻蒙生態發展

    近日,軟通動力子公司與南方科技大學攜手,開展了一系列旨在推動開源鴻蒙生態發展的活動。在此期間,
    的頭像 發表于 01-06 14:01 ?217次閱讀

    亮相OpenHarmony人才生態大會2024

    近日,由開放原子開源基金會指導,OpenHarmony項目群工作委員會主辦的OpenHarmony人才生態大會2024在武漢隆重舉辦。軟通動力子公司作為OpenHarmony項
    的頭像 發表于 11-30 10:41 ?361次閱讀

    原生鴻蒙發布!軟通動力子公司智能成果獲媒體報道關注

    《新聞1+1》欄目以長達21分鐘的專題報道,在該報道中,多項技術創新成果得以亮相,廣受業界矚目。
    的頭像 發表于 10-29 15:51 ?433次閱讀
    原生鴻蒙發布!軟通動力子公司<b class='flag-5'>鴻</b><b class='flag-5'>湖</b><b class='flag-5'>萬</b><b class='flag-5'>聯</b>智能成果獲媒體報道關注

    軟通動力子公司發布SwanLinkOS 5

    在近日圓滿閉幕的首屆H?I3 AI探索峰會上,軟通動力憑借其深厚的技術實力與創新精神,在鴻蒙生態領域再次邁出堅實步伐。會上,軟通動力攜手子公司,震撼發布了新一代操作系統——Sw
    的頭像 發表于 09-04 16:50 ?905次閱讀

    軟通動力旗下榮獲礦OSV生態合作伙伴授牌

    近日,鄂爾多斯臨港經濟區見證了礦OSV生態合作伙伴授牌儀式的隆重舉行。在這場匯聚行業精英的盛會中,軟通動力旗下的作為首批礦
    的頭像 發表于 08-14 14:50 ?644次閱讀

    軟通動力子公司攜多款重磅創新產品亮相華為開發者大會

    如何引領行業進步,共同探索鴻蒙生態與AI大模型的發展新契機。作為本次大會鉆石級合作伙伴,軟通動力攜子公司深度參與到大會各項活動中。軟通動力董事、
    的頭像 發表于 06-25 11:38 ?422次閱讀
    軟通動力子公司<b class='flag-5'>鴻</b><b class='flag-5'>湖</b><b class='flag-5'>萬</b><b class='flag-5'>聯</b>攜多款重磅創新產品亮相華為<b class='flag-5'>開發</b>者大會

    生態“加速跑” 軟通動力子公司榮膺華為“礦生態使能合作伙伴”

    。在本次展會上,軟通動力子公司受邀參與了華為礦生態論壇并做主題發言,還榮膺了華為“礦
    的頭像 發表于 04-02 15:43 ?621次閱讀
    礦<b class='flag-5'>鴻</b>生態“加速跑” 軟通動力子公司<b class='flag-5'>鴻</b><b class='flag-5'>湖</b><b class='flag-5'>萬</b><b class='flag-5'>聯</b>榮膺華為“礦<b class='flag-5'>鴻</b>生態使能合作伙伴”

    共譜開源新篇章 軟通動力子公司與鴻蒙生態服務公司簽署戰略合作協議

    近日,軟通動力子公司與鴻蒙生態服務(深圳)有限公司(以下簡稱“鴻蒙生態服務公司”)成功簽署戰略合作協議。雙方將攜手合作,加強資源互聯互通,共同開拓開源鴻蒙應用場景和市場空間,推
    的頭像 發表于 04-02 15:23 ?539次閱讀
    共譜開源新篇章 軟通動力子公司<b class='flag-5'>鴻</b><b class='flag-5'>湖</b><b class='flag-5'>萬</b><b class='flag-5'>聯</b>與鴻蒙生態服務公司簽署戰略合作協議

    人才儲備再升級!軟通動力子公司多名講師榮獲首批“鴻蒙原生應用開發培訓講師”認證

    近日,由鴻蒙生態服務公司組織開展的國內首批“鴻蒙原生應用開發培訓講師”認證順利完成。作為此次認證的重要參與者,申報的四位鴻蒙資深專家
    的頭像 發表于 03-25 10:25 ?664次閱讀
    人才儲備再升級!軟通動力子公司<b class='flag-5'>鴻</b><b class='flag-5'>湖</b><b class='flag-5'>萬</b><b class='flag-5'>聯</b>多名講師榮獲首批“鴻蒙原生應用<b class='flag-5'>開發</b>培訓講師”認證

    軟通動力子公司多名講師榮獲首批“鴻蒙原生應用開發培訓講師”認證

    近日,由鴻蒙生態服務公司組織開展的國內首批“鴻蒙原生應用開發培訓講師”認證順利完成。作為此次認證的重要參與者,申報的四位鴻蒙資深專家
    的頭像 發表于 03-25 09:24 ?497次閱讀
    主站蜘蛛池模板: 男女交性视频免费播放 | 成人在色线视频在线观看免费大全 | 婷婷激情电影 | 中国china体内裑精亚洲毛片 | 欧美福利二区 | 97久久精品国产精品青草 | 国产精品嫩草影院人体模特 | 色在线观看视频 | 日韩一级一欧美一级国产 | 天堂网www在线资源网 | 九九99视频在线观看视频观看 | 色色色色色色网 | 午夜湿| 久久久久久久国产精品电影 | 四虎永久网址影院 | 久久国产精品99久久久久久老狼 | 日本成片视频 | 国产手机在线观看视频 | 男男扒开后菊惩罚 | 国内一国产农村妇女一级毛片 | 久久久久国产 | 亚洲色图综合图片 | 男人视频在线观看 | 3p性小说 | 高清人妖shemale japan | 丁香六月色婷婷 | 欧美人与性另类 | 国产色网址 | 特黄免费| 一级毛片黄色片 | 香蕉久久精品 | 午夜看片在线 | 三级网站在线播放 | 天天射天天色天天干 | 深夜视频在线播放视频在线观看免费观看 | brazzers720欧美丰满 | 毛片网站免费在线观看 | 久久综合九色欧美综合狠狠 | 亚洲第一在线播放 | 国内精品免费视频自在线 | 成 人色 网 站 欧美大片在线观看 |