青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

隨筆 - 41, 文章 - 8, 評(píng)論 - 8, 引用 - 0
數(shù)據(jù)加載中……

[Python][PyQt4]PyQt4 中的俄羅斯方塊

PyQt4 中的俄羅斯方塊

創(chuàng)建一個(gè)電腦游戲是很具挑戰(zhàn)性的。遲早程序員想創(chuàng)建一個(gè)電腦游戲。事實(shí)上,很多人對(duì)編程感興趣,是因?yàn)樗鼈兺媪擞螒?,然后想?chuàng)建自己的游戲。創(chuàng)建一個(gè)游戲會(huì)提升你的編程技能。

俄羅斯方塊

俄羅斯方塊從創(chuàng)建開(kāi)始就成為很流行的游戲之一。游戲最開(kāi)始是由俄羅斯程序員 Alexey Pajitnov 設(shè)計(jì)和編寫(xiě)的。從那時(shí)開(kāi)始幾乎在所有的計(jì)算機(jī)平臺(tái)運(yùn)行。甚至我的手機(jī)就有一個(gè)修改版的俄羅斯方塊。

這個(gè)游戲是落下方塊。我們可以有七種不同的形狀,稱為 tetromino 。S形狀,Z形狀,T形狀,L形狀,行,鏡像L形狀,方塊形狀。而這些形狀又由四個(gè)方塊構(gòu)成。這些形狀會(huì)掉到板上。這個(gè)游戲的目標(biāo)是移動(dòng)和旋轉(zhuǎn)這些形狀,所以可以把他們填滿。如果我們填滿了一行,這行就被銷(xiāo)毀然后我們得分。游戲在方塊填到頂部就結(jié)束了。

_images/tetrominoes.png

PyQt4 是可以用于創(chuàng)建應(yīng)用的。也有很多其它庫(kù)可以用于游戲。盡管如此,PyQt4 仍可以創(chuàng)建游戲。

下面的例子是一個(gè)改版的俄羅斯方塊,在 PyQt4 安裝的目錄下。

開(kāi)發(fā)

我們不準(zhǔn)備使用圖片,而是使用 PyQt4 的 API 。在每個(gè)計(jì)算機(jī)游戲背后,都有一個(gè)數(shù)學(xué)模型。俄羅斯方塊也是。

一些想法。

  • 使用 QtCore.QBasicTimer 創(chuàng)建游戲的一輪
  • 這些方塊是往下掉的
  • 這些形狀一格格移動(dòng)
  • 游戲盤(pán)數(shù)學(xué)上是簡(jiǎn)單的列表
#!/usr/bin/python
# tetris.py
import sys
import random
from PyQt4 import QtCore, QtGui
class Tetris(QtGui.QMainWindow):
    def __init__(self):
        #QtGui.QMainWindow.__init__(self)
        super(Tetris, self).__init__()
        self.setGeometry(300, 300, 180, 380)
        self.setWindowTitle('Tetris')
        self.tetrisboard = Board(self)
        self.setCentralWidget(self.tetrisboard)
        self.statusbar = self.statusBar()
        self.connect(self.tetrisboard, QtCore.SIGNAL("messageToStatusbar(QString)"),
            self.statusbar, QtCore.SLOT("showMessage(QString)"))
        self.tetrisboard.start()
        self.center()
    def center(self):
        screen = QtGui.QDesktopWidget().screenGeometry()
        size =  self.geometry()
        self.move((screen.width()-size.width())/2,
            (screen.height()-size.height())/2)
class Board(QtGui.QFrame):
    BoardWidth = 10
    BoardHeight = 22
    Speed = 300
    def __init__(self, parent):
        #QtGui.QFrame.__init__(self, parent)
        super(Board, self).__init__(parent)
        self.timer = QtCore.QBasicTimer()
        self.isWaitingAfterLine = False
        self.curPiece = Shape()
        self.nextPiece = Shape()
        self.curX = 0
        self.curY = 0
        self.numLinesRemoved = 0
        self.board = []
        self.setFocusPolicy(QtCore.Qt.StrongFocus)
        self.isStarted = False
        self.isPaused = False
        self.clearBoard()
        self.nextPiece.setRandomShape()
    def shapeAt(self, x, y):
        return self.board[(y * Board.BoardWidth) + x]
    def setShapeAt(self, x, y, shape):
        self.board[(y * Board.BoardWidth) + x] = shape
    def squareWidth(self):
        return self.contentsRect().width() / Board.BoardWidth
    def squareHeight(self):
        return self.contentsRect().height() / Board.BoardHeight
    def start(self):
        if self.isPaused:
            return
        self.isStarted = True
        self.isWaitingAfterLine = False
        self.numLinesRemoved = 0
        self.clearBoard()
        self.emit(QtCore.SIGNAL("messageToStatusbar(QString)"),
            str(self.numLinesRemoved))
        self.newPiece()
        self.timer.start(Board.Speed, self)
    def pause(self):
        if not self.isStarted:
            return
        self.isPaused = not self.isPaused
        if self.isPaused:
            self.timer.stop()
            self.emit(QtCore.SIGNAL("messageToStatusbar(QString)"), "paused")
        else:
            self.timer.start(Board.Speed, self)
            self.emit(QtCore.SIGNAL("messageToStatusbar(QString)"),
                str(self.numLinesRemoved))
        self.update()
    def paintEvent(self, event):
        painter = QtGui.QPainter(self)
        rect = self.contentsRect()
        boardTop = rect.bottom() - Board.BoardHeight * self.squareHeight()
        for i in range(Board.BoardHeight):
            for j in range(Board.BoardWidth):
                shape = self.shapeAt(j, Board.BoardHeight - i - 1)
                if shape != Tetrominoes.NoShape:
                    self.drawSquare(painter,
                        rect.left() + j * self.squareWidth(),
                        boardTop + i * self.squareHeight(), shape)
        if self.curPiece.shape() != Tetrominoes.NoShape:
            for i in range(4):
                x = self.curX + self.curPiece.x(i)
                y = self.curY - self.curPiece.y(i)
                self.drawSquare(painter, rect.left() + x * self.squareWidth(),
                    boardTop + (Board.BoardHeight - y - 1) * self.squareHeight(),
                    self.curPiece.shape())
    def keyPressEvent(self, event):
        if not self.isStarted or self.curPiece.shape() == Tetrominoes.NoShape:
            QtGui.QWidget.keyPressEvent(self, event)
            return
        key = event.key()
        if key == QtCore.Qt.Key_P:
            self.pause()
            return
        if self.isPaused:
            return
        elif key == QtCore.Qt.Key_Left:
            self.tryMove(self.curPiece, self.curX - 1, self.curY)
        elif key == QtCore.Qt.Key_Right:
            self.tryMove(self.curPiece, self.curX + 1, self.curY)
        elif key == QtCore.Qt.Key_Down:
            self.tryMove(self.curPiece.rotatedRight(), self.curX, self.curY)
        elif key == QtCore.Qt.Key_Up:
            self.tryMove(self.curPiece.rotatedLeft(), self.curX, self.curY)
        elif key == QtCore.Qt.Key_Space:
            self.dropDown()
        elif key == QtCore.Qt.Key_D:
            self.oneLineDown()
        else:
            QtGui.QWidget.keyPressEvent(self, event)
    def timerEvent(self, event):
        if event.timerId() == self.timer.timerId():
            if self.isWaitingAfterLine:
                self.isWaitingAfterLine = False
                self.newPiece()
            else:
                self.oneLineDown()
        else:
            QtGui.QFrame.timerEvent(self, event)
    def clearBoard(self):
        for i in range(Board.BoardHeight * Board.BoardWidth):
            self.board.append(Tetrominoes.NoShape)
    def dropDown(self):
        newY = self.curY
        while newY > 0:
            if not self.tryMove(self.curPiece, self.curX, newY - 1):
                break
            newY -= 1
        self.pieceDropped()
    def oneLineDown(self):
        if not self.tryMove(self.curPiece, self.curX, self.curY - 1):
            self.pieceDropped()
    def pieceDropped(self):
        for i in range(4):
            x = self.curX + self.curPiece.x(i)
            y = self.curY - self.curPiece.y(i)
            self.setShapeAt(x, y, self.curPiece.shape())
        self.removeFullLines()
        if not self.isWaitingAfterLine:
            self.newPiece()
    def removeFullLines(self):
        numFullLines = 0
        rowsToRemove = []
        for i in range(Board.BoardHeight):
            n = 0
            for j in range(Board.BoardWidth):
                if not self.shapeAt(j, i) == Tetrominoes.NoShape:
                    n = n + 1
            if n == 10:
                rowsToRemove.append(i)
        rowsToRemove.reverse()
        for m in rowsToRemove:
            for k in range(m, Board.BoardHeight):
                for l in range(Board.BoardWidth):
                    self.setShapeAt(l, k, self.shapeAt(l, k + 1))
        numFullLines = numFullLines + len(rowsToRemove)
        if numFullLines > 0:
            self.numLinesRemoved = self.numLinesRemoved + numFullLines
            self.emit(QtCore.SIGNAL("messageToStatusbar(QString)"),
                str(self.numLinesRemoved))
            self.isWaitingAfterLine = True
            self.curPiece.setShape(Tetrominoes.NoShape)
            self.update()
    def newPiece(self):
        self.curPiece = self.nextPiece
        self.nextPiece.setRandomShape()
        self.curX = Board.BoardWidth / 2 + 1
        self.curY = Board.BoardHeight - 1 + self.curPiece.minY()
        if not self.tryMove(self.curPiece, self.curX, self.curY):
            self.curPiece.setShape(Tetrominoes.NoShape)
            self.timer.stop()
            self.isStarted = False
            self.emit(QtCore.SIGNAL("messageToStatusbar(QString)"), "Game over")
    def tryMove(self, newPiece, newX, newY):
        for i in range(4):
            x = newX + newPiece.x(i)
            y = newY - newPiece.y(i)
            if x < 0 or x >= Board.BoardWidth or y < 0 or y >= Board.BoardHeight:
                return False
            if self.shapeAt(x, y) != Tetrominoes.NoShape:
                return False
        self.curPiece = newPiece
        self.curX = newX
        self.curY = newY
        self.update()
        return True
    def drawSquare(self, painter, x, y, shape):
        colorTable = [0x000000, 0xCC6666, 0x66CC66, 0x6666CC,
                      0xCCCC66, 0xCC66CC, 0x66CCCC, 0xDAAA00]
        color = QtGui.QColor(colorTable[shape])
        painter.fillRect(x + 1, y + 1, self.squareWidth() - 2,
            self.squareHeight() - 2, color)
        painter.setPen(color.light())
        painter.drawLine(x, y + self.squareHeight() - 1, x, y)
        painter.drawLine(x, y, x + self.squareWidth() - 1, y)
        painter.setPen(color.dark())
        painter.drawLine(x + 1, y + self.squareHeight() - 1,
            x + self.squareWidth() - 1, y + self.squareHeight() - 1)
        painter.drawLine(x + self.squareWidth() - 1,
            y + self.squareHeight() - 1, x + self.squareWidth() - 1, y + 1)
class Tetrominoes(object):
    NoShape = 0
    ZShape = 1
    SShape = 2
    LineShape = 3
    TShape = 4
    SquareShape = 5
    LShape = 6
    MirroredLShape = 7
class Shape(object):
    coordsTable = (
        ((0, 0),     (0, 0),     (0, 0),     (0, 0)),
        ((0, -1),    (0, 0),     (-1, 0),    (-1, 1)),
        ((0, -1),    (0, 0),     (1, 0),     (1, 1)),
        ((0, -1),    (0, 0),     (0, 1),     (0, 2)),
        ((-1, 0),    (0, 0),     (1, 0),     (0, 1)),
        ((0, 0),     (1, 0),     (0, 1),     (1, 1)),
        ((-1, -1),   (0, -1),    (0, 0),     (0, 1)),
        ((1, -1),    (0, -1),    (0, 0),     (0, 1))
    )
    def __init__(self):
        self.coords = [[0,0] for i in range(4)]
        self.pieceShape = Tetrominoes.NoShape
        self.setShape(Tetrominoes.NoShape)
    def shape(self):
        return self.pieceShape
    def setShape(self, shape):
        table = Shape.coordsTable[shape]
        for i in range(4):
            for j in range(2):
                self.coords[i][j] = table[i][j]
        self.pieceShape = shape
    def setRandomShape(self):
        self.setShape(random.randint(1, 7))
    def x(self, index):
        return self.coords[index][0]
    def y(self, index):
        return self.coords[index][1]
    def setX(self, index, x):
        self.coords[index][0] = x
    def setY(self, index, y):
        self.coords[index][1] = y
    def minX(self):
        m = self.coords[0][0]
        for i in range(4):
            m = min(m, self.coords[i][0])
        return m
    def maxX(self):
        m = self.coords[0][0]
        for i in range(4):
            m = max(m, self.coords[i][0])
        return m
    def minY(self):
        m = self.coords[0][1]
        for i in range(4):
            m = min(m, self.coords[i][1])
        return m
    def maxY(self):
        m = self.coords[0][1]
        for i in range(4):
            m = max(m, self.coords[i][1])
        return m
    def rotatedLeft(self):
        if self.pieceShape == Tetrominoes.SquareShape:
            return self
        result = Shape()
        result.pieceShape = self.pieceShape
        for i in range(4):
            result.setX(i, self.y(i))
            result.setY(i, -self.x(i))
        return result
    def rotatedRight(self):
        if self.pieceShape == Tetrominoes.SquareShape:
            return self
        result = Shape()
        result.pieceShape = self.pieceShape
        for i in range(4):
            result.setX(i, -self.y(i))
            result.setY(i, self.x(i))
        return result
app = QtGui.QApplication(sys.argv)
tetris = Tetris()
tetris.show()
sys.exit(app.exec_())

我稍微簡(jiǎn)化了此游戲,所以理解起來(lái)比較容易。游戲在載入后就立即開(kāi)始了。我們可以按 'p' 來(lái)暫停游戲。而空格可以讓形狀立即掉到底部。游戲以恒速進(jìn)行,并沒(méi)有實(shí)現(xiàn)加速。分?jǐn)?shù)是我們移掉的行數(shù)。

self.statusbar = self.statusBar()
self.connect(self.tetrisboard, QtCore.SIGNAL("messageToStatusbar(QString)"),
    self.statusbar, QtCore.SLOT("showMessage(QString)"))

我們創(chuàng)建了狀態(tài)欄,用于顯示消息。我們將顯示三種可能的消息。移除的行數(shù),暫停消息,結(jié)束消息。

...
self.curX = 0
self.curY = 0
self.numLinesRemoved = 0
self.board = []
...

在游戲開(kāi)始前,我們先初始化一些重要的變量。變量 self.board 是一組 0 到 7 的列表。它代表這些形狀的位置,以及剩余的形狀。

for j in range(Board.BoardWidth):
    shape = self.shapeAt(j, Board.BoardHeight - i - 1)
    if shape != Tetrominoes.NoShape:
        self.drawSquare(painter,
            rect.left() + j * self.squareWidth(),
            boardTop + i * self.squareHeight(), shape)

游戲的繪制被分為兩部分。第一步,我們繪制所有的形狀,或剩余的形狀,這些是已經(jīng)掉落的。所有的都記在 self.board 中。我們使用 shapeAt() 方法訪問(wèn)它。

if self.curPiece.shape() != Tetrominoes.NoShape:
    for i in range(4):
        x = self.curX + self.curPiece.x(i)
        y = self.curY - self.curPiece.y(i)
        self.drawSquare(painter, rect.left() + x * self.squareWidth(),
            boardTop + (Board.BoardHeight - y - 1) * self.squareHeight(),
            self.curPiece.shape())

下一步我們繪制落下的部分。

elif key == QtCore.Qt.Key_Left:
    self.tryMove(self.curPiece, self.curX - 1, self.curY)
elif key == QtCore.Qt.Key_Right:
    self.tryMove(self.curPiece, self.curX + 1, self.curY)

keyPressEvent 中,我們檢查按鍵。如果我們按向右的鍵,那么那塊就會(huì)往右移。我們說(shuō) try,是因?yàn)榭赡懿荒芤啤?/p>

def tryMove(self, newPiece, newX, newY):
    for i in range(4):
        x = newX + newPiece.x(i)
        y = newY - newPiece.y(i)
        if x < 0 or x >= Board.BoardWidth or y < 0 or y >= Board.BoardHeight:
            return False
        if self.shapeAt(x, y) != Tetrominoes.NoShape:
            return False
    self.curPiece = newPiece
    self.curX = newX
    self.curY = newY
    self.update()
    return True

在這個(gè)方法中,我們嘗試移動(dòng)形狀。如果到了畫(huà)板邊緣或是碰到其它,我們就返回 False 。否則,我們就放置到新的位置。

def timerEvent(self, event):
    if event.timerId() == self.timer.timerId():
        if self.isWaitingAfterLine:
            self.isWaitingAfterLine = False
            self.newPiece()
        else:
            self.oneLineDown()
    else:
        QtGui.QFrame.timerEvent(self, event)

在計(jì)時(shí)器事件中,我們或者是創(chuàng)建一個(gè)新的方塊,或是讓方塊下落。

def removeFullLines(self):
    numFullLines = 0
    rowsToRemove = []
    for i in range(Board.BoardHeight):
        n = 0
        for j in range(Board.BoardWidth):
            if not self.shageAt(j, i) == Tetrominoes.NoShape:
                n = n + 1
        if n == 10:
            rowsToRemove.append(i)
    rowsToRemove.reverse()
    for m in rowsToRemove:
        for k in range(m, Board.BoardHeight):
            for l in range(Board.BoardWidth):
                self.setShapeAt(l, k, self.shapeAt(l, k + 1))
...

如果那塊碰到底部,我們就調(diào)用 removeFullLines() 方法。首先,我們找到所有的行數(shù)。然后我們移除他們。我們要把滿了的行數(shù)移除。注意,我們把要移除的列表進(jìn)行反轉(zhuǎn)。否則,它可能不能正確移除。我們沒(méi)有使用重力效應(yīng)。這就意味著某些方塊會(huì)懸浮。

def newPiece(self):
    self.curPiece = self.nextPiece
    self.nextPiece.setRandomShape()
    self.curX = Board.BoardWidth / 2 + 1
    self.curY = Board.BoardHeight - 1 + self.curPiece.minY()
    if not self.tryMove(self.curPiece, self.curX, self.curY):
        self.curPiece.setShape(Tetrominoes.NoShape)
        self.timer.stop()
        self.isStarted = False
        self.emit(QtCore.SIGNAL("messageToStatusbar(QString)"), "Game Over")

newPiece() 方法隨機(jī)創(chuàng)建一個(gè)方塊。如果這個(gè)方塊不能動(dòng)了,游戲就結(jié)束了。

Shape 類(lèi)保存了每個(gè)方塊的形狀。

self.coords = [[0,0] for i in range(4)]

在創(chuàng)建時(shí),我們創(chuàng)建了一個(gè)空的坐標(biāo)列表。這個(gè)列表保存每個(gè)方塊的坐標(biāo)。比如,這些元組 (0,-1),(0,0),(-1,0),(-1,-1) 代表旋轉(zhuǎn)的 S 形狀。下面的圖表指示了這個(gè)形狀。

_images/coordinates.png

當(dāng)我們繪制方塊時(shí),我們就把它畫(huà)在 self.curXself.curY 上。然后我們把四個(gè)方塊畫(huà)起來(lái)。


這是一個(gè)用 PyQt4 寫(xiě)的俄羅斯方塊。

posted on 2012-02-12 10:18 mirguest 閱讀(1781) 評(píng)論(0)  編輯 收藏 引用 所屬分類(lèi): Python

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲第一综合天堂另类专| 亚洲一区视频| 狠狠色噜噜狠狠狠狠色吗综合| 欧美一区二区在线| 日韩亚洲欧美在线观看| 亚洲国产另类精品专区 | 欧美激情一区二区三区在线视频观看 | 激情一区二区三区| 在线观看成人一级片| 亚洲大胆人体在线| 最新69国产成人精品视频免费| 亚洲福利专区| 在线一区二区三区四区五区| 亚洲一区二区在线看| 久久久www成人免费无遮挡大片| 免费在线观看日韩欧美| 日韩午夜av在线| 午夜天堂精品久久久久 | 欧美日韩精品欧美日韩精品| 一区二区黄色| 久久高清国产| 国产欧美精品在线播放| 在线观看91精品国产麻豆| 一区二区三区国产在线| 久久精品99国产精品酒店日本| 久久这里只精品最新地址| 欧美国产大片| 欧美一级电影久久| 欧美精品粉嫩高潮一区二区 | 久久这里只有精品视频首页| 欧美日韩一级片在线观看| 激情欧美一区| 欧美一区二区三区四区视频| 亚洲激情av| 欧美精品v国产精品v日韩精品| 在线观看日韩国产| 免费在线欧美黄色| 欧美国产日韩xxxxx| 亚洲国产高清一区| 欧美韩日一区二区| 美女主播精品视频一二三四| 悠悠资源网亚洲青| 欧美1区3d| 欧美激情在线免费观看| 99国产精品99久久久久久| 亚洲精品日韩在线观看| 欧美日韩专区| 亚洲欧美日韩天堂| 中文亚洲欧美| 亚洲伊人网站| 欧美成人一区二区| 一区二区欧美日韩| 欧美日韩亚洲国产一区| 性18欧美另类| 久久香蕉国产线看观看av| 亚洲人成在线观看| 亚洲伊人观看| 一本色道久久综合亚洲精品不| 亚洲在线观看| 日韩视频一区| 久久精品日韩一区二区三区| 亚洲精品视频在线看| 欧美一区二区精品| 亚洲专区国产精品| 欧美日韩1234| 亚洲国产综合在线| 永久久久久久| 农村妇女精品| 狂野欧美激情性xxxx| 国产一区在线观看视频| 中文一区二区| 亚洲色图制服丝袜| 欧美精品免费在线| 亚洲精品婷婷| 亚洲欧美日本在线| 销魂美女一区二区三区视频在线| 一本一道久久综合狠狠老精东影业| 激情综合激情| 亚洲国产精品一区在线观看不卡 | 一区二区欧美日韩| 亚洲深夜福利网站| 亚洲女人av| 午夜在线视频观看日韩17c| 久久大香伊蕉在人线观看热2| 亚洲精品影院在线观看| 亚洲黄一区二区三区| 欧美日韩在线视频首页| 麻豆乱码国产一区二区三区| 欧美精品一区三区| 欧美ed2k| 国产一区二区欧美| 一区二区三区国产精华| 亚洲大胆女人| 久久久青草青青国产亚洲免观| 亚洲欧美视频一区| 久久乐国产精品| 国产精品毛片高清在线完整版| 亚洲伦理久久| 在线视频日本亚洲性| 欧美美女bb生活片| 亚洲美女淫视频| 中国女人久久久| 欧美色图首页| 亚洲午夜av电影| 午夜精品视频在线观看一区二区 | 韩国v欧美v日本v亚洲v| 亚洲视频在线一区观看| 亚洲一区二区三区乱码aⅴ蜜桃女| 欧美日韩成人在线播放| 9人人澡人人爽人人精品| 亚洲一区免费看| 国产精品第2页| 午夜激情久久久| 巨乳诱惑日韩免费av| 在线看一区二区| 免费美女久久99| 亚洲精品乱码久久久久久久久| 一区二区三区日韩欧美精品| 国产精品mv在线观看| 午夜欧美大尺度福利影院在线看| 性欧美超级视频| 黑人一区二区| 欧美成人免费在线视频| 亚洲伦理在线免费看| 亚洲一区二区三区欧美| 国产欧美日韩综合一区在线观看| 久久国产精品免费一区| 最新国产の精品合集bt伙计| 亚洲视频中文字幕| 国产一区二区你懂的| 欧美极品色图| 欧美一级成年大片在线观看| 亚洲国产视频一区| 久久av资源网| 亚洲毛片av在线| 国产欧美一区二区三区在线看蜜臀| 久久亚洲国产精品日日av夜夜| 亚洲激情网址| 久久久久久穴| 夜色激情一区二区| 国产网站欧美日韩免费精品在线观看| 久热爱精品视频线路一| 99视频一区二区三区| 欧美99久久| 欧美日韩亚洲视频一区| 久久成人这里只有精品| 国产一区二区三区在线观看免费 | 亚洲国产高潮在线观看| 国产一区二区三区在线观看精品 | 久久久久久免费| 国产精品亚洲综合天堂夜夜| 亚洲一区日韩| 久久精品国产久精国产爱| 国产精品自拍在线| 亚洲欧美日韩精品在线| 久久久久久久999精品视频| 国产欧美欧洲在线观看| 欧美一级专区| 另类成人小视频在线| 亚洲国产精品视频| 欧美另类专区| 亚洲午夜激情在线| 久久精品成人欧美大片古装| 伊人成人网在线看| 欧美激情亚洲自拍| 99精品国产在热久久婷婷| 亚洲综合视频一区| 国产日产精品一区二区三区四区的观看方式| 午夜精品久久久久久久| 玖玖国产精品视频| 亚洲精品美女91| 欧美日韩三级一区二区| 午夜精品久久久久| 欧美高清视频在线播放| 99精品99| 国内精品久久久久久久97牛牛| 免费看精品久久片| 亚洲一区二区免费在线| 久久成人人人人精品欧| 亚洲国产视频一区| 国产精品另类一区| 免费美女久久99| 小辣椒精品导航| 欧美国产第二页| 久久精品国产99国产精品澳门| 日韩视频一区二区| 国产综合色在线| 欧美日韩成人在线视频| 久久蜜桃香蕉精品一区二区三区| 日韩一区二区电影网| 免费在线亚洲| 久久经典综合| 亚洲欧美国产高清| 亚洲欧洲一区二区天堂久久| 国产精品夜夜嗨| 欧美日韩三区| 欧美成人蜜桃| 久久嫩草精品久久久精品一| 亚洲欧美国产va在线影院| 亚洲精品资源|