狠狠综合久久久久综合网址-a毛片网站-欧美啊v在线观看-中文字幕久久熟女人妻av免费-无码av一区二区三区不卡-亚洲综合av色婷婷五月蜜臀-夜夜操天天摸-a级在线免费观看-三上悠亚91-国产丰满乱子伦无码专区-视频一区中文字幕-黑人大战欲求不满人妻-精品亚洲国产成人蜜臀av-男人你懂得-97超碰人人爽-五月丁香六月综合缴情在线

AIST1110代做、Python編程設計代寫

時間:2024-03-21  來源:  作者: 我要糾錯



AIST1110 Introduction to Computing Using Python 2023-24 Term 2
Department of Computer Science and Engineering, The Chinese University of Hong Kong
1
Assignment 2
Instructions
• Unless specified otherwise,
o you can use anything in the Python Standard Library;
o don’t use any third-party library including NumPy in your code for this assignment except for the
requests package;
o you can assume all user inputs are always valid and require no validation.
• The blue texts, if any, in the Sample Runs section of each question refers to the user inputs.
• Please follow closely the format of the sample output for each question. Your program should produce
exactly the same output as the sample (same text, symbols, letter case, spacing, etc.). The output for
each question should end with a single newline character, which has been provided by the print()
function by default.
• Please follow exactly the specified name, parameter list and return value(s) for the functions to be
written if a question has stated (for easier grading). You may define additional (inner) functions for
specific tasks or further task decomposition in any question if you see fit.
• For questions that require you to define specific functions, your main client code (for calling and
testing the functions) must be put under an if __name__ == '__main__': check because we
may import your script into our test scripts calling your functions in our own ways for grading.
• Your client code will not be graded unless specified otherwise in the question.
• Name your script files as q1.py for Question 1, q2.py for Question 2, … (case-sensitive). Using other
names may affect our marking and may result in deduction.
• Your source files will be tested in script mode rather than interactive mode.
• You are highly encouraged to annotate your functions to provide type information for parameters and
return values, and to include suitable comments in your code to improve the readability.
Question 1 (20%)
In this question, you are going to write a couple of functions related to the classical games Tic-Tac-Toe and
Minesweeper in the same script (q1.py).
(a) Write a function tic_tac_toe(board: list[list[str]]) -> str, which takes a nested list of
strings which represents the 3x3 matrix of a completed tic-tac-toe game and returns a string that tells
which of the players is the game winner. Suppose that letters ‘X’ and ‘O’ are used as the marks in the
game (i.e., elements in the matrix) and they represent the two players. The function returns ‘X’ if
player X wins, ‘O’ if player O wins, and ‘Draw’ if it is a draw game.
Notes:
• An empty spot is denoted by a single space in the matrix.
• All the letters ‘X’ and ‘O’ and the letter ‘D’ of ‘Draw’ must be upper case.
(b) Write a function minesweeper(board: list[list[int]]) -> list[list[int]], which takes a
nested list representation of a Minesweeper board and returns another board of the same dimension
where the value of each cell is the number of its neighboring mines.
The input board matrix contains either 0 or 1, where 0 represents an empty space and 1 represents
a mine. To produce the output, you will have to replace each mine with the number 9 and each empty
space with the number of adjacent mines.
AIST1110 Introduction to Computing Using Python 2023-24 Term 2
Department of Computer Science and Engineering, The Chinese University of Hong Kong
2
Notes:
• The board can be in any rectangular shape of reasonable size to be fully viewed on the screen.
• Assume that board is always a valid nested list (e.g., it won’t be empty).
• Since the number of adjacent mines around a cell is at most 8, the number 9 will be used to denote
the mines for convenience.
• An online version of the game is available in case you have no ideas how the game is like.
Sample Runs
tic_tac_toe([
 ["X", "O", "X"],
 ["O", "X", "O"],
 ["O", "X", "X"]
]) -> "X"
tic_tac_toe([
 ["O", "O", "O"],
 ["O", "X", "X"],
 [" ", "X", "X"]
]) -> "O"
tic_tac_toe([
 ["X", "X", "O"],
 ["O", "O", "X"],
 ["X", "X", "O"]
]) -> "Draw"
minesweeper([[1]]) -> [[9]]
minesweeper([[0, 1]]) -> [[1, 9]]
minesweeper([
 [0, 1, 0, 0],
 [0, 0, 1, 0],
 [0, 1, 0, 1],
 [1, 1, 0, 0]
]) -> [
 [1, 9, 2, 1],
 [2, 3, 9, 2],
 [3, 9, 4, 9],
 [9, 9, 3, 1]
]
minesweeper([
 [1, 0, 0, 0, 0, 0, 1, 0],
 [1, 0, 1, 0, 1, 0, 0, 0],
 [0, 0, 0, 0, 0, 0, 0, 0],
 [0, 1, 0, 1, 0, 0, 0, 1]
]) -> [
 [9, 3, 1, 2, 1, 2, 9, 1],
 [9, 3, 9, 2, 9, 2, 1, 1],
 [2, 3, 3, 3, 2, 1, 1, 1],
 [1, 9, 2, 9, 1, 0, 1, 9]
]
AIST1110 Introduction to Computing Using Python 2023-24 Term 2
Department of Computer Science and Engineering, The Chinese University of Hong Kong
3
Question 2 (20%)
In this question, we are going to download and analyze a data set about schools in Hong Kong, namely
School Location and Information. The URL for downloading the data set is as follows:
https://www.edb.gov.hk/attachment/en/student-parents/sch-info/sch-search/sch-locationinfo/SCH_LOC_EDB.json
Below is an example JSON object in this data set:

To understand this JSON file, you may read its associated data specification for its field names, their
meanings, and the valid values for some of the fields. You may ignore the Chinese characters in the file
and the specification as we will retrieve those English fields only in this question. Instead of manually
downloading the data set using a web browser, you are required to download the data in JSON format by
coding in a Python script (q2.py).
To facilitate the data download and analysis tasks, you are required to write several (general-purpose)
functions specified as follows:
(a) Write a function get_data(url: str, filename: str) -> list[dict], which takes a string
url that specifies the website (URL) to download a JSON file and a string filename specifying the
name of a local JSON file (assumed in the current directory) which stores the downloaded JSON data.
This function will perform the following tasks:
• If the JSON file with name filename already exists in the current directory, load the data from the
file into a list of Python dictionaries (one dictionary corresponds to one JSON object).
• If the file does not exist, download the JSON data from the specified url into a list of Python
dictionaries, and dump it into a local JSON file with name filename in the current directory. Set
the indentation in the JSON file to 4 spaces and make sure that non-ASCII characters in the file will
be output as-is instead of escaped (so Chinese characters instead of Unicode escape sequences in
the form "uXXXX" can be seen in the output). Hints:
o Explore the use of the ensure_ascii argument in the dump() or dumps() function.
o You may use the 3rd-party package Requests for easing this task.
o The download is triggered only if the specified JSON file cannot be found locally. This makes
sure subsequent data retrieval is fast (done locally rather than remotely).
• Return the list of dictionaries loaded from filename or from the URL.
AIST1110 Introduction to Computing Using Python 2023-24 Term 2
Department of Computer Science and Engineering, The Chinese University of Hong Kong
4
To download the data set about schools, the client for using this function is like:
URL = 'https://www.edb.gov.hk/.../sch-location-info/SCH_LOC_EDB.json'
schools = get_data(URL, 'SCH_LOC_EDB.json')
After execution, besides getting the list of dictionaries of school information as schools, the file
SCH_LOC_EDB.json will be saved in the current directory containing the running script. A sample of
the expected output SCH_LOC_EDB.json is provided on Blackboard.
(b) Write a function filter_data(data: list[dict], criteria: dict[str, list[str]]) ->
list[dict], which takes a list of dictionary objects called data and a dictionary called criteria,
and returns a subset of data that contains dictionary objects that match all the criteria specified (in
the form of key-value pairs) through the criteria dictionary.
For example, suppose that
data = [
{'a': 'x', 'b': 'y', 'c': 'z'},
{'a': 'p', 'b': 'q', 'c': 'r'},
{'a': 'u', 'b': 'v', 'c': 'w'}
]
criteria1 = {'a': ['x', 'p']}
criteria2 = {'a': ['x', 'p'], 'b': ['q']}
Then note the expected results returned by the function calls below:
filter_data(data, criteria1) -> [
 {'a': 'x', 'b': 'y', 'c': 'z'},
 {'a': 'p', 'b': 'q', 'c': 'r'}
]
filter_data(data, criteria2) -> [
 {'a': 'p', 'b': 'q', 'c': 'r'}
]
By criteria1, we want to get all dictionaries whose key 'a' equals the value 'x' or 'p'. Therefore,
two dictionaries in the list get selected.
By criteria2, we want to get all dictionaries whose key 'a' equals the value 'x' or 'p' and key
'b' equals the value 'q'. Only one dictionary in the list fulfils the compound criteria.
(c) Write a function print_school_list(schools: list[dict], fields: list[str],
sorted_by: list[str] = None) -> None, which prints a list of schools in tabular format. The
school data are provided in the form of a list of dictionaries. The fields being printed in the table are
listed in the fields list. The printed rows are sorted by the fields specified in the sorted_by list
which allows at most three fields to be included as the sort fields.
The required output format is demonstrated by the sample output file (q2-output.txt) that was
generated by the provided sample client code (q2-starter.py).
AIST1110 Introduction to Computing Using Python 2023-24 Term 2
Department of Computer Science and Engineering, The Chinese University of Hong Kong
5
For example, the following client code:
EN = "ENGLISH NAME"
RE = "RELIGION"
SG = "STUDENTS GENDER"
western_kgs_in_christ = filter_data(
 schools,
 criteria={
 "SCHOOL LEVEL": ["KINDERGARTEN"],
 "DISTRICT": ["CENTRAL AND WESTERN"],
 "RELIGION": ["PROTESTANTISM / CHRISTIANITY", "CATHOLICISM"],
 },
)
print_school_list(western_kgs_in_christ, [EN, SG, RE], [EN])
prints all the kindergartens with Christianity or Catholicism as religion in the Central and Western
district (sorted by the schools’ English names) in the tabular format below:
ENGLISH NAME | STUDENTS GENDER | RELIGION
---------------------------------------------- | --------------- | ----------------------------
CANNAN KINDERGARTEN (CENTRAL CAINE ROAD) | CO-ED | PROTESTANTISM / CHRISTIANITY
CARITAS LING YUET SIN KINDERGARTEN | CO-ED | CATHOLICISM
CARITAS ST. FRANCIS KINDERGARTEN | CO-ED | CATHOLICISM
HONG KONG TRUE LIGHT KINDERGARTEN (CAINE ROAD) | CO-ED | PROTESTANTISM / CHRISTIANITY
KAU YAN SCHOOL | CO-ED | PROTESTANTISM / CHRISTIANITY
RHENISH MISSION SCHOOL | CO-ED | PROTESTANTISM / CHRISTIANITY
SACRED HEART CANOSSIAN KINDERGARTEN | CO-ED | CATHOLICISM
SMALL WORLD CHRISTIAN KINDERGARTEN | CO-ED | PROTESTANTISM / CHRISTIANITY
ST. CLARE'S PRIMARY SCHOOL | GIRLS | CATHOLICISM
ST. MATTHEW'S CHURCH KINDERGARTEN | CO-ED | PROTESTANTISM / CHRISTIANITY
ST. PAUL'S CHURCH KINDERGARTEN | CO-ED | PROTESTANTISM / CHRISTIANITY
ST. STEPHEN'S GIRLS' COLLEGE KINDERGARTEN | CO-ED | PROTESTANTISM / CHRISTIANITY
WISELY KINDERGARTEN | CO-ED | PROTESTANTISM / CHRISTIANITY
Notes:
• The column headers are the same as the field names included in the fields list.
• The width (w) of each field is set to be the width of the longest string value being printed. That
includes the field value and the column header.
• There is a line of w hyphens separating the column header row and the first data row.
• There is a single space before and after the | separator between every two columns.
• Without extra handling, there can be duplicate rows in the table because the data set may contain
multiple objects having the same English Name, e.g., one school name may correspond to several
campus addresses or several sessions (am, pm, whole day), which span multiple objects. Your
implementation must get rid of the printing of duplicate schools.
(d) Write a function print_count_by_district(schools: list[dict]) -> None, which prints a
table showing the count of schools grouped by the District field. The results are sorted and
grouped by District. Again, refer to the sample output file for the expected output for a particular
input of schools.
For example, the following client code:
primary = filter_data(schools, criteria={"SCHOOL LEVEL": ["PRIMARY"]})
print_count_by_district(primary)
prints the counts of all primary schools in Hong Kong by district in the tabular format below:
AIST1110 Introduction to Computing Using Python 2023-24 Term 2
Department of Computer Science and Engineering, The Chinese University of Hong Kong
6
District #Schools
CENTRAL AND WESTERN 28
EASTERN 39
ISLANDS 23
KOWLOON CITY 62
KWAI TSING 38
KWUN TONG 45
NORTH 33
SAI KUNG 38
SHA TIN 51
SHAM SHUI PO 42
SOUTHERN 32
TAI PO 31
TSUEN WAN 23
TUEN MUN 43
WAN CHAI 26
WONG TAI SIN 32
YAU TSIM MONG 29
YUEN LONG 57
 Total: 672
Notes:
• The above result may differ from some other information sources like this webpage of EDB. Ignore
the discrepancies.
• You may hardcode the width for the District column as 20.
• There is a single space separating the District and #Schools columns.
• There may be objects of the same school name in different districts or school levels. For example,
some schools may use the same school name to offer both primary and kindergarten education in
different sectors of the same campus. Therefore, we need to use the combination of fields
DISTRICT + SCHOOL LEVEL + ENGLISH NAME to distinguish the objects as unique schools.
• There is a total number of schools printed on the last line of the table. The word “Total:” is right
adjusted in the first column.
Question (40%)
Write a Python script (q3.py) to implement a two-player board game called Gekitai (a Japanese word
which means “repel” or “push away”). Here is the game description from the designer (we rephrased a
little bit): Gekitai is a 3-in-a-row game played on a 6x6 grid. Each player has eight colored pieces and takes
turns placing them anywhere on any open space on the board. When placed, a piece pushes all adjacent
pieces outwards one space if there is an open space for it to move to (or off the board). Pieces shoved off
the board are returned to the player. If there is not an open space on the opposite side of the pushed piece,
it does not push (a newly played piece cannot push two or more other lined-up pieces). The first player who
either (1) lines up three of their color in a row (horizontal or vertical or diagonal) at the end of their turn
(after pushing), or (2) has all eight of their pieces on the board (also after pushing) wins. To quickly
understand how to play this game, you may also watch this game review video or play this online game
implementing Gekitai.
The key idea of this game is the “repel” effect when placing a piece onto the board. For example, refer to
Figure 1 below. Suppose that the player (Red) of the current turn is to put a piece at location B2. Then all
the three pieces (both the player’s and opponent’s) adjacent to B2 will be pushed away by one square
outward. So, the black piece originally at A1 is shoved off the board and recycled to the player (Black) for
making future turns whereas the pieces at C2 and B3 will be repelled to new positions D2 and B4
respectively.
AIST1110 Introduction to Computing Using Python 2023-24 Term 2
Department of Computer Science and Engineering, The Chinese University of Hong Kong
7
A B C D E F
1
2
3
4
5
6
A B C D E F
1
2
3
4
5
6
Figure 1: An example move on the game board and its effect on the adjacent pieces
However, remember (from the above description) that a move cannot push away a piece which has
another adjacent piece (both the player’s and opponent’s) occupying the square it is being pushed onto.
For example, look at Figure 2 below. If the player (Black) puts a piece at B3, it won’t repel the piece at B4
downward because there is no open space (B5 is already occupied), and only the piece at B2 will be pushed
upward to position B1.
A B C D E F
1
2
3
4
5
6
A B C D E F
1
2
3
4
5
6
Figure 2: Another example move on the game board and its effect on the adjacent pieces
The last move made by Black was indeed a bad one – if Red puts a piece at B6 now, Red will win the game
because three red pieces have formed a vertical line (see Figure 3).
A B C D E F
1
2
3
4
5
6
A B C D E F
1
2
3
4
5
6
Figure 3: A move that lets Red win the game
To achieve the repelling effect, your program may need to scan all the eight directions (N, NE, E, SE, S, SW, W,
NW) around the target position for a piece placement. For example, to put a piece at D3 in Figure 4, it should
board
transition
Shoved off the board and came
back to the Black player
board
transition
board
transition
Red wins!
AIST1110 Introduction to Computing Using Python 2023-24 Term 2
Department of Computer Science and Engineering, The Chinese University of Hong Kong
8
check if there exist any piece(s) at all the blue cells, and if any, it should check if the corresponding purple cell(s)
are empty before moving the pieces outward into the purple cells.

Figure 4: Positions to check to repel pieces adjacent to a target cell
Figure 5 below shows other possible winning conditions. Recall that a line can be formed horizontally, vertically,
and diagonally, and that there is another winning condition: if all the eight pieces of the same color are placed
on the board, the player of that color will win.

Black first formed a diagonal line and wins.

Red first formed a diagonal line and wins.

Red first has 8 pieces on board and wins.
Figure 5: Other winning conditions
Game Board Representation
We are going to implement this game as a console-based program and the game board will be represented
by characters arranged in Figure 6 below:
 A B C D E F
 +---+---+---+---+---+---+
1 | X | | | | | |
 +---+---+---+---+---+---+
2 | | | | | | |
 +---+---+---+---+---+---+
3 | | O | X | | X | |
 +---+---+---+---+---+---+
4 | | | | | | |
 +---+---+---+---+---+---+
5 | | O | | | | |
 +---+---+---+---+---+---+
6 | | | | | | |
 +---+---+---+---+---+---+
A B C D E F
1
2
3
4
5
6
Figure 6: An example game board in the console
ç
equivalent
AIST1110 Introduction to Computing Using Python 2023-24 Term 2
Department of Computer Science and Engineering, The Chinese University of Hong Kong
9
In the beginning, all cells on the board are empty. Pieces of player 1 (Black) and player 2 (Red) are denoted
by 'X' and 'O' symbols, respectively.
Program Flow
1. The program starts the game with an empty board. Player 1 (X) takes the first turn.
2. Then, prompt the current player to enter a cell address to put a piece onto the board.
3. A piece cannot be placed onto the board if the target cell is not empty or if the position is outside the
board’s boundaries. In case it is not placeable, display an error message “Invalid move!” and go back
to Step 2.
4. Update the board by putting the input piece to the target position and repelling existing adjacent
pieces away if there exists open space. Recycle any off-the-board pieces to their own players.
5. Switch to the other player to take the next turn.
6. Repeat steps 2–5 until a player wins (forming a line of L pieces or having all P pieces put on the board).
If both players satisfy either of the winning conditions concurrently, the moving player (i.e., the one
taking the current turn) is regarded the winner.
7. When a game finishes, display the message “Player X wins!” or “Player O wins!” accordingly.
Assumptions
• There are three basic configuration parameters for this game:
o size = (6, 6) is the board size (size[0] * size[1] = number of cells);
o P = 8 is the number of pieces per player;
o L = 3 is the (least) number of pieces of a line to form.
• In most cases, the board is a square, but your program should NOT assume that (it may be a rectangle).
• To check if your program is scalable on these parameters instead of hardcoding, we may have a few
test cases that vary their values although this may affect the original game rules. To support our testing,
the constructor of your Gekitai class must follow this method signature:
__init__(self, size: tuple[int, int] = (6, 6), P: int = 8, L: int = 3)
Then we can create game objects for different test cases such as:
g1 = Gekitai() # 6x6 board, 8 pieces, 3-in-a-lins
g2 = Gekitai((7, 8), 9, 4) # 7x8 board, 9 pieces, 4-in-a-line
g3 = Gekitai(P=6) # 6x6 board, 6 pieces, 3-in-a-line
• You may assume the range for size’s values is between 6 and 8, P between 6 and 12, and L between
3 and the minimum of size’s values and P. Your program should add the following assertion in the
constructor of Gekitai to avoid creating a game with out-of-range parameters:
assert (
 all(6 <= s <= 8 for s in size)
 and 6 <= P <= 12
 and 3 <= L <= min(size[0], size[1], P)
)
• We assume that cell address inputs always follow the Excel-like format of one letter (A-Z or a-z) plus
one integer (1-26). Uppercase or lowercase inputs like "A1", "c6", or even having some spaces in the
string like " b 5 " will be accepted as normal. Use exception handling techniques in the get_input()
method of Player to avoid program crash due to weird inputs like "AA1", "A01", "abc", "A3.14",
"#a2", … for cell addresses, which may raise ValueError when getting the user input.
AIST1110 Introduction to Computing Using Python 2023-24 Term 2
Department of Computer Science and Engineering, The Chinese University of Hong Kong
10
• There is no draw game based on the official game rules. Due to the repelling effect, it is possible that
a move may cause both players to form a line of L pieces at the same time. In this case, the official
game rules regard the moving player as the winner. The same applies to the case that the moving
player putting his/her last piece on the board but causing the opponent to form a line.
OO Design for this Game
You must use OOP to develop this program. Refer to the UML class diagram below for the OO design for
this program.
Figure 7: UML class diagram for the game program design
Note: For the operations or methods in the UML diagram, we omit the self parameter which is Pythonspecific and not meaningful in UML which is independent of the OOP language being used.
This question aims at testing your implementation skills rather than your OO design skills. Therefore,
whenever possible, just follow our given design in your submitted code (while you are encouraged to try
other designs in your own separate code versions that need not be submitted). But you are allowed to add
extra (private) attributes or methods to facilitate some tasks when you see it fit. If you would do so, it is
better to name them with an underscore, e.g., you may write a private method _game_winner() in the
Gekitai class to determine which player has won the game.
Some points to assist your understanding of the UML diagram and coding:
• A player holds P pieces. In OO terms, one Player object aggregates P Piece objects.
• Gekitai is a two-player board game. So, one Gekitai object aggregates 2 Player objects.
• In coding, we usually use an array or list to realize an aggregation relationship, e.g., for the Player
class, define an instance variable which is a list of P Piece objects.
Specification of Each Required Class
To allow our grading by unit testing your functions, you are required to follow the following specification
when implementing each class.
AIST1110 Introduction to Computing Using Python 2023-24 Term 2
Department of Computer Science and Engineering, The Chinese University of Hong Kong
11
Color Enum Class
Pieces and players should have a color attribute for identification purpose. Regarding this, a simple way
can be adding an integer 0 or 1 to the objects to distinguish black from red. But we recommend using an
enumeration class to define a new type for color. Check out the enum module in Python. For example, you
can define the following Color class by extending Enum:
from enum import Enum
class Color(Enum):
 BLACK = 'X'
 RED = 'O'
c = Color.RED
Then you can get the name string 'RED' via c.name and the value string 'O' via c.value.
Piece Class
Attributes:
• color: the color identifying which player this piece belongs to
Methods:
__str__(self) -> str
Override the __str__() special method to print the Piece object as a string showing the 'X' or 'O' symbol
instead of the object’s type and memory address.
Player Class
Attributes:
• color: the color identifying the player
• pieces: a list of Piece objects which represent game pieces that are with the player, i.e., pending to
be put onto the game board.
Methods:
get_input(self) -> tuple[int, int]
Prompt the user (current player) for a cell address input (Excel-format) by showing the prompt message:
"Player X's turn: " or "Player O's turn: ". Convert the string into a tuple (y, x) and return
it, where y and x (zero-based indexes) refer to the target cell at row y and column x. The conversion must
handle possible ValueError exceptions due to wild user inputs. In this case, the handler simply returns
the tuple (-1, -1) that represents an invalid move, which will be detected by the is_move_valid()
method of the Gekitai class (to be discussed later).
__str__(self) -> str
Override the __str__() special method to print the Player object as a string showing the 'X' or 'O'
symbol instead of the object’s type and memory address.
Gekitai Class
Attributes:
• cells: a nested list (2D array) implementing the game board. Each element (representing a cell) is
storing either a Piece object or something such as None that represents an empty cell.
• rows: the number of rows for the cells array
• cols: the number of columns for the cells array
• players: a list of the two Player objects
• P: the total number of pieces given to each player
AIST1110 Introduction to Computing Using Python 2023-24 Term 2
Department of Computer Science and Engineering, The Chinese University of Hong Kong
12
• L: the (least) number of pieces required to form a line
Methods:
is_move_valid(self, y: int, int x: int) -> bool
Return True if it is valid to move a piece onto the board at row y and column x (zero-based indexes), i.e.,
if the element cells[y][x] is an empty cell. Otherwise, it returns False. If x and y are beyond the
board’s boundaries, it also returns False.
This method must be called inside the move() method to confirm that the move is valid before it updates
the cells array. This method will also be called by the start() method, which will keep prompting the
current player to enter the cell address again until it is a valid move.
move(self, piece: Piece, y: int, x: int)
Provided that (y, x) is a valid position, this function carries out updates of the cells array to actualize
the effects of moving a piece of the current player into the cell at row y and column x (zero-based indexes).
This includes setting the element cells[y][x] to piece and moving its adjacent pieces (the 8 possible
cells surrounding cells[y][x]) outward by one square if there is open space for them to move into. And
if there are any pieces being shoved off the board by this move action, they are recycled to the
corresponding player’s pieces list.
line_formed(self, player: Player) -> bool
Return True if it can find L consecutive pieces in a line on the board that belong to the specified player,
and False otherwise. Calling this method will be useful to assist determining whether the game is over.
When it returns True, that means the specified player has won.
print_board(self)
Print the game board in the format as shown in Figure 6. Besides printing the game board, it also prints
the list of pieces that are still with each player, i.e., those that are not yet on the board. See our provided
Sample Runs to know more.
start(self)
This method implements the main loop of the game. It keeps printing the game board, prompting players
to make moves in turns, and detecting who has won the game and printing the game-over message.
This method will call the following methods (directly or indirectly via your extra methods, if any):
• print_board() to print the game board;
• get_input() of each Player object to get the cell address input from the current player;
• is_move_valid() to check if the input (y, x) is a valid move;
• move() to actualize a move, repelling adjacent pieces if any;
• line_formed() to see if the game should end.
If the move entered by the player is not a valid one, print the error message "Invalid move!" and
prompt the player for a new input again. Repeat this until the input is valid.
This method also prints the game-over messages like "Game over:", "Player X wins!" and the final
game board when the game ends. See Sample Runs for the expected output.
Notes:
• You should avoid using global variables whenever possible (except for those that are read-only). If some
constant is needed and relevant to a certain class, you may define it as a class variable in that class.
AIST1110 Introduction to Computing Using Python 2023-24 Term 2
Department of Computer Science and Engineering, The Chinese University of Hong Kong
13
• Defining some class or static methods is also allowed if it can help. But better name them with a leading
underscore (meaning private) if they are not meant to be used by the outside world.
• Don’t perform something more than required in each specified method, i.e., keep the implementation
of each function minimal (or “do one thing and do it well”). For example, in the move() method, its
only duty is to actualize the move by updating the cells array. Checking whether the move is valid or
whether a line has been formed is the duty of the other methods. The is_move_valid() method, on
the other hand, should not perform any board updates but checking the move’s validity alone. Violating
this rule will hamper our unit testing of your program and you may lose marks.
• Your program should include suitable, concise comments as documentation. Each class must have a
“doc string” to describe what it is (our sample program has purposely omitted all docstringsso that you
cannot copy them by doing help() on the class). You are also highly encouraged to do the same at
method level. Missing class-level doc strings may invite some mark deduction.
Sample Runs

AIST1110 Introduction to Computing Using Python 2023-24 Term 2
Department of Computer Science and Engineering, The Chinese University of Hong Kong

AIST1110 Introduction to Computing Using Python 2023-24 Term 2
Department of Computer Science and Engineering, The Chinese University of Hong Kong
Player O wins!
Sample Executable
For more sample runs, you can execute our provided modules in binary format:
• q3sample.so (for macOS)
• q3sample.pyd (for Windows)
Put the corresponding binary file in your current directory. Start a Python shell and type the following to
start a game using the default configuration for size, P and L.
from q3sample import Gekitai
game = Gekitai()
game.start()
If you want to customize any of size, P and L, it is just a matter of passing valid arguments when
constructing the game object. For example,
from q3sample import Gekitai
Gekitai((7, 7), 9, 4).start()
AIST1110 Introduction to Computing Using Python 2023-24 Term 2
Department of Computer Science and Engineering, The Chinese University of Hong Kong
18
Important Note: The sample executable was built in the latest Python 3.12.2 environment. This requires
a Python runtime of 3.12.x to execute it. Using an older Python runtime like 3.9 may run into subtle import
errors such as not able to find or load the module. You may create a virtual environment using conda and
install Python 3.12 to run the executable.
Question 4 (20%)
Write a Python script (q4.py) to implement the following UML diagram:
Figure 8: UML class diagram for a “polymorphic” file explorer
The File classis an abstract base class. It can be made abstract by deriving it from the metaclass ABCMeta
or from the helper class ABC from the abc module and declaring an abstract instance method in the class.
The abstract method is called explore().
This File class resembles but simplifies the os.DirEntry class and has only three attributes below
whose semantics are the same as those defined under os.DirEntry (check their documentation):
• path – the full path of the file object on the file system
• size – size of the file in bytes
• mtime – last modified time expressed in seconds
This abstract class is realized into two concrete subclasses Directory and RegularFile, where the
RegularFile classis further extended into three subclasses HiddenFile, TextFile and ScriptFile,
which exhibit different behaviors when running their own versions of the explore() method. Refer to
Table 1 for how to implement all these classes.
To ease your testing, a zip of a sample directory has been provided. Unzip the file q4-sample-dir.zip and
put the directory q4-sample-dir in the same directory containing q4.py. Run the following client code and
refer to Sample Run or our given q4-output.txt for the expected output:
sample_dir = Directory('q4-sample-dir')
sample_dir.explore()
Reminder:
Italic means “abstract”.
That is, File is an abstract
base class with an abstract
method called explore().
AIST1110 Introduction to Computing Using Python 2023-24 Term 2
Department of Computer Science and Engineering, The Chinese University of Hong Kong
19
Table 1. Description of the Subclasses Involved
Subclass Superclass Methods (and Behaviors to perform)
Directory File list() Returns a list of file objects sorted by their path
values under the directory specified by the path
attribute of this Directory object.
Hint: use the scandir() function in the os module
which returns a list of DirEntry objects. For each
entry in the list returned, create an object with a
correct type based on to the rules below:
• Directory: entries that return True when
is_dir() is called upon
• RegularFile: entries that return True when
is_file() is called upon
• HiddenFile: regular files of names starting with a
dot '.'
• TextFile: regular files of names ending with
'.txt'
• ScriptFile: regular files of names ending with
'.py'
Create each object with its path, size and mtime
attributes populated with their values retrieved from
the corresponding DirEntry object.
explore() Calls the list() method to get a list of all file objects
under the directory specified by the path attribute.
For each entry, print its path and call its explore()
method.
For consistent output, when printing file paths, make
sure that the file path separators follow the POSIX
convention (/) instead of the NT convention () even if
the program is running on Windows.
RegularFile File explore() Prints a string
"last modified: <lm> size: <size> bytes"
<lm> is a date time string of the following format:
YYYY-MM-DD HH:MM:SS
e.g. 2024-03-09 00:18:39
HiddenFile RegularFile explore() Does nothing
TextFile RegularFile explore() Opens the text file and prints its content.
ScriptFile RegularFile explore() Executes the Python script file.
Notes:
• For simplicity, assume that there are no symbolic links and hidden directories (i.e., directory namesthat
start with a dot) involved but hidden files may exist. And script files are always in Python only.
AIST1110 Introduction to Computing Using Python 2023-24 Term 2
Department of Computer Science and Engineering, The Chinese University of Hong Kong
20
More Hints:
• Populate the size and mtime attributes of File with the st_size and st_mtime attributes of the
os.stat_result object returned by the stat() method of os.DirEntry.
• The datetime class in the datetime module provides a class method fromtimestamp() that can
help produce the required last modified time string.
• To execute a Python script file, you may use the run() function in the subprocess module or the
system() function in the os module to call "python <script_file_path>".
Sample Run
Below is the expected output for the given client (no matter whether Windows or POSIX platforms).
q4-sample-dir/.DS_Store
q4-sample-dir/.hidden_file.txt
q4-sample-dir/assignment1.pdf
last modified: 2024-02-06 23:13:55 size: 289813 bytes
q4-sample-dir/assignment2.pdf
last modified: 2024-03-09 04:14:48 size: 737982 bytes
q4-sample-dir/hello_world.py
Hello, World!
q4-sample-dir/inner_dir
q4-sample-dir/inner_dir/.DS_Store
q4-sample-dir/inner_dir/dump.py
Love For All
0 1 2 3 4
q4-sample-dir/inner_dir/innermost
q4-sample-dir/inner_dir/innermost/.DS_Store
q4-sample-dir/inner_dir/innermost/dumper.py
Aspire to inspire before we expire!
0 1 2 3 4 5 6 7 8 9
q4-sample-dir/inner_dir/innermost/quotes3.txt
Abraham Lincoln - "Nearly all men can stand adversity,
 but if you want to test a man's character, give him power."
Benjamin Harrison - "Great lives never go out; they go on."
q4-sample-dir/inner_dir/quotes2.txt
William Henry Harrison - "Times change, and we change with them."
John Quincy Adams - "Try and fail, but don't fail to try."
q4-sample-dir/quotes1.txt
John Adams - "To be good, and to do good, is all we have to do."
Abraham Lincoln - "God must love common-looking people.
 That's why he made so many of them."
請加QQ:99515681  郵箱:99515681@qq.com   WX:codehelp 

標簽:

掃一掃在手機打開當前頁
  • 上一篇:代做Lab 2: Time Series Prediction with GP
  • 下一篇:代做COMP226、代寫solution.R設計編程
  • 無相關信息
    昆明生活資訊

    昆明圖文信息
    蝴蝶泉(4A)-大理旅游
    蝴蝶泉(4A)-大理旅游
    油炸竹蟲
    油炸竹蟲
    酸筍煮魚(雞)
    酸筍煮魚(雞)
    竹筒飯
    竹筒飯
    香茅草烤魚
    香茅草烤魚
    檸檬烤魚
    檸檬烤魚
    昆明西山國家級風景名勝區
    昆明西山國家級風景名勝區
    昆明旅游索道攻略
    昆明旅游索道攻略
  • NBA直播 短信驗證碼平臺 幣安官網下載 歐冠直播 WPS下載

    關于我們 | 打賞支持 | 廣告服務 | 聯系我們 | 網站地圖 | 免責聲明 | 幫助中心 | 友情鏈接 |

    Copyright © 2025 kmw.cc Inc. All Rights Reserved. 昆明網 版權所有
    ICP備06013414號-3 公安備 42010502001045

    主站蜘蛛池模板: bb日韩美女预防毛片视频 | 91视频色 | 天天干天天摸天天操 | 日韩黄色小视频 | 日日日视频 | 国产精品密蕾丝袜 | 2018天天干天天操 | 国产性自拍 | 欧美一级大片在线观看 | 在线观看中文字幕一区 | 巨乳在线播放 | 黄色av网址在线观看 | 日韩美女一区二区三区 | 国产对白视频 | 殴美一级视频 | 哪里可以免费看毛片 | 91精品婷婷国产综合久久蝌蚪 | 国产91在线看 | 锦绣未央在线观看 | 日韩成人精品在线 | 亚洲综合国产 | 亚洲一级特黄毛片 | 亚洲狼人在线 | 偷拍亚洲欧美 | 少妇av网 | 亚洲精品乱码久久久久久蜜桃欧美 | 91免费视频大全 | 182av| 欧美日韩中文在线 | 免费精品| 91久久国产综合久久91精品网站 | 成年人福利视频 | 特一级黄色 | 国产精品视频一二三区 | 日韩精品免费一区二区在线观看 | 亚洲精品乱码久久久久久金桔影视 | 懂色av蜜臀av粉嫩av分享 | 国产一区二区三区中文字幕 | 日韩三级在线免费观看 | 日日夜夜噜 | 欧美日韩免费在线视频 | 国产青青草视频 | 亚洲视频在线观看一区 | 日韩欧美在线观看免费 | 亚洲视频黄色 | 中国黄色一级大片 | 欧美日韩国产第一页 | chinese少妇啪啪高潮 | 欧美久草 | 在线播放日韩av | 青青青视频在线 | 日韩精品91| 69日影院 | 日本色视频 | 99国产精品一区二区三区 | 孕妇一级片| 伊是香蕉大人久久 | 91污片| 久久人成 | 欧美成人免费看 | 天天干夜夜操视频 | 色永久| 一区二区三区免费看 | www五月婷婷 | 一本一道波多野结衣一区二区 | 日韩欧美三级视频 | 国产成人一区二区三区免费看 | 婷婷99 | 亚洲精品国产精品国自产观看 | 日韩有色 | 真实乱视频国产免费观看 | 亚洲精品国精品久久99热 | 毛片h| 亚洲一区二区在线 | 99热97| 欧美精品久久久久久久多人混战 | 免费视频一二三区 | 9191av| 在线看免费视频 | 午夜久久久久久久久久 | 亚洲精品永久www嫩草 | 欧美精品一区二区在线播放 | 久久99久久98精品免观看软件 | 日韩黄色网页 | 在线看免费av | 日本美女三级 | 国产毛片精品 | 嫩草视频在线 | 韩日少妇 | 三上悠亚激情av一区二区三区 | 日本黄色特级片 | a黄色片 | 精品www久久久久久奶水 | 国产成人亚洲精品 | 亚洲免费观看高清完整 | a v视频在线观看 | 狠狠久久亚洲欧美专区 | 男人的网站在线观看 | 国产91在线高潮白浆在线观看 | 横恋母在线观看 | 一本色道久久综合精品竹菊 | 国产美女又黄又爽又色视频免费 | 亚洲精品国产精品国自产观看浪潮 | 嫩草视频在线观看免费 | 欧美成人乱码一区二区三区 | 黑人一级大毛片 | 毛片天堂| 亚洲视频在线一区 | 99资源网| 日本一区视频在线观看 | 一区二区三区视频免费 | 影音先锋亚洲资源 | 日本天堂网在线观看 | 一级在线观看 | 青青草在线观看视频 | 成人av教育| 成人动漫一区二区 | 成人免费黄色片 | 8x8ⅹ8成人免费视频观看 | 精品国产一区在线 | 天天综合天天做天天综合 | 奇米影视一区二区 | 国产成人亚洲欧洲在线 | 欧美aa大片 | 99视频一区二区 | 午夜视频在线免费观看 | 久久综合99 | 一级黄色大片视频 | 成人91视频 | 欧美午夜精品久久久久久浪潮 | 欧美一级日韩 | 毛片视 | 婷婷综合亚洲 | 伊人黄色网| 国产精品伦子伦免费视频 | 亚洲jlzzjizz少妇 | 国产在线成人 | 综合狠狠开心 | 鸥美一级片 | 青青操在线观看 | 成人在线一区二区 | 国产综合影院 | 亚洲一区二区日韩 | 九九av在线| 日本狠狠干 | 亚洲一区高清 | 98在线视频 | 欧美性xxxx| 性猛交╳xxx乱大交 日韩精品视频观看 | 男人天堂a | 精品视频一区二区 | 成人免费毛片日本片视频 | 久久精品99国产国产精 | 日本亚洲欧美 | 星空大象在线观看免费高清 | 国产欧美日韩在线视频 | 超碰免费在线97 | 91麻豆精品国产91久久久久久久久 | 91成人天堂久久成人 | 黄色免费小视频 | 51成人做爰www免费看网站 | 4438x在线观看 | 国产精品一区二区三区在线 | 色男人的天堂 | av成人在线免费观看 | 亚洲成人福利视频 | 一区二区免费在线视频 | 中文字幕第页 | 国内av自拍| 波多野结衣在线观看一区二区 | 免费观看毛片 | 狠狠干2017 | 香蕉视频链接 | 在线观看91av | 午夜精品三级久久久有码 | 国产视频第二页 | 日韩操操 | 人人插人人搞 | 精品日韩一区二区 | 日本一级淫片色费放 | 中韩毛片 | 午夜av一区二区三区 | 久久久国产亚洲精品 | 欧美日韩国产高清 | 国产高清视频在线观看 | 免费中文字幕 | 奴色虐av一区二区三区 | 日韩一区二区免费在线观看 | 小柔的淫辱日记(1~7) | 中文精品在线 | 亚洲精品v日韩精品 | 国产成人综合久久 | 亚洲人体在线 | 日韩一级黄色 | 伊人22222 | 日韩天堂 | 国产色综合天天综合网 | 色片网站在线观看 | 亚洲精品专区 | 久草免费在线播放 | www.天天操.com | 成人毛片av | 国产91对白在线观看九色 | 日韩精品中文字幕一区二区 | 尤物视频免费在线观看 | 国产精品久久国产精品 | 国产毛片av | 国产欧美在线视频 | 超碰在线人人干 | 黄色特一级 | 国产精品久久久久久久久久久不卡 | 白丝av | 在线免费观看的av | 欧美日韩国产专区 | 国产在线视频你懂的 | www.xxxxx日本| 午夜影院免费在线观看 | 深夜福利视频在线观看 | 在线观看的av网址 | 久久草av| 欧美大白bbbb与bbbb | 伊人久操视频 | 美脚丝袜一区二区三区在线观看 | 开心激情亚洲 | 精品3p| 中文字幕av一区二区三区 | 日韩欧美啪啪 | www性欧美| 国产日产亚洲精品 | 午夜痒痒网 | 天天视频入口 | 日韩字幕在线 | 精品国产乱码久久久久夜 | 四虎8848精品成人免费网站 | 91视频中文字幕 | av777777| a国产一区二区免费入口 | 91在现看| 97色在线观看 | 国产情趣视频 | 欧美,日韩,国产精品免费观看 | 国产女人爽到高潮久久久4444 | 上原亚衣在线观看 | 久久久久亚洲av毛片大全 | h视频在线观看网站 | 激情久久五月 | 亚洲福利小视频 | 久久国产香蕉视频 | 亚洲黄a | 亚洲成人免费在线视频 | 国产8区 | av成人毛片| 正在播放91 | 在线波多野结衣 | 污黄网站在线观看 | 91视频成人 | 日本高清中文字幕 | 中文字幕欧美在线观看 | 伊人蕉久 | 中文字幕 成人 | 四虎影视在线播放 | 午夜av一区| 国产老女人乱淫免费 | 少妇导航av | 日韩午夜激情视频 | 色爱综合区 | 亚州激情| 人人做人人爽 | av在线第一页 | 在线看一区二区 | 2020国产精品视频 | 亚洲拍拍视频 | 全黄一级裸体片 | 美国av大片 | 亚洲国产一二三 | 欧美一极片 | 国产精选第一页 | 人人澡人人添 | 青青草公开视频 | 深夜久久久 | 中文字幕视频观看 | 亚洲综合日韩在线 | 久久精彩免费视频 | 日本涩涩视频 | 国产毛片毛片毛片毛片 | 99久久99| av基地| 成人午夜精品福利 | 中文字幕+乱码+中文乱 | 高清不卡一区二区 | 精品日韩一区 | 精品国产乱码久久久久久婷婷 | 4438x亚洲最大 | 国产第九页 | 久久伊人一区二区 | 最新成人| 亚洲成人资源 | 国内偷拍第一页 | 亚洲一区视频在线 | 中文字幕永久在线 | 看黄色一级片 | 国产夜夜操 | 天天做天天爱夜夜爽 | 国产精品青青草 | 青娱乐极品在线 | 亚洲揄拍窥拍久久国产自揄拍 | 正在播放精品 | 美女一级黄 | 69av视频在线观看 | 天堂国产在线 | 盗摄一区二区 | 狠狠躁日日躁夜夜躁 | 国产精品一区二区三区在线免费观看 | 免费涩涩| 久热最新 | 毛片久久久 | 国产日产久久高清欧美一区 | 久久婷婷国产综合尤物精品 | 国产精品乱码 | 久久色播 | 日本少妇三级 | 九九自拍视频 | 亚洲天堂资源在线 | 91看片黄| 国产3p精品一区 | 亚洲成人婷婷 | 少妇高潮久久久久久潘金莲 | 国产视频a区 | www.国产成人 | 日韩欧美国产一区二区 | 永久免费看片在线播放 | 波多野结衣在线视频免费观看 | 六月激情婷婷 | 最近中文字幕在线中文高清版 | 亚洲欧美自拍偷拍 | 91麻豆精品国产91久久 | 在线观看一二区 | 性视频一级 | 咪咪色图| 国语对白永久免费 | 中文字幕精品无 | av男人天堂网 | 成人久久久久 | 欧美a∨亚洲欧美亚洲 | 欧美激情片在线观看 | 好吊妞视频一区二区三区 | 免费日b视频 | 特黄视频在线观看 | 狠狠的干狠狠的操 | 好男人www在线视频 亚洲视频一二 | 高清毛片aaaaaaaaa郊外 | 精品九九九九 | 午夜在线国产 | 欧美精品一卡二卡 | 精品99久久久 | 日韩免费在线观看视频 | 日本欧美在线视频 | 日韩免费一区二区 | 性生活三级视频 | 三级免费网站 | 激情小说综合 | 欧美69式性猛交 | 国产婷婷色综合av蜜臀av | 亚洲精品a | 成人性生交大片 | 成人天堂av | 黄色片一区二区三区 | 久久另类ts人妖一区二区 | 国产成人三级在线观看 | 五月婷婷网站 | 奇米狠狠干 | 男女免费网站 | 久久视频免费在线观看 | 九九热这里只有 | 天堂中文在线免费观看 | 中文字幕在线免费视频 | 91丨porny丨| 樱花草av| 色中色综合网 | 91桃色免费观看 | 国产精品久久久久久亚洲影视 | 成在线免费观看av | 成人性生交大片免费看中文 | 自拍偷拍校园春色 | 欧美日韩中文字幕在线视频 | 在线看黄色的网站 | 国产福利在线观看 | 国产天天射 | 97国产精品视频人人做人人爱 | 国产日韩免费 | 黄色片网站免费看 | 一区二区三区视频观看 | 天堂视频免费 | 波多野结衣在线一区二区 | 欧美成人免费看 | 人人干天天操 | 国产一级片免费 | 超碰超碰超碰超碰 | 欧美va天堂 | 久久咪咪 | 午夜视频在线免费 | 日韩天堂 | 久久天天躁狠狠躁夜夜躁2014 | 日本少妇中文字幕 | 白丝av | 激情国产精品 | 日韩午夜免费视频 | 婷综合| 99re在线精品 | 一区二区三区日韩精品 | 视频一区二区三区在线 | 日本三级一区 | 综综综综合网 | 欧美精品一区二区久久婷婷 | 蜜乳av懂色av粉嫩av | 亚洲欧美在线观看视频 | www.日本com | 91免费视频播放 | 偷拍精品一区二区三区 | 性猛交富婆╳xxx乱大交天津 | 国产黄色在线免费看 | 羞羞动态图 | 日韩欧美视频在线播放 | 中文字幕亚洲综合 | 免费吸乳羞羞网站视频 | 夜夜爽日日澡人人添 | 91九色蝌蚪视频 | 国产高清免费观看 | 韩日一区 | 免费看日韩毛片 | 亚洲香蕉av在线一区二区三区 | 精品国产一区在线 | 91污片| 奇米影视999 | 日b免费视频 | 久久久久久久久久久久久久久久久久 | 看av网站| 日本一二三区视频 | 国产九九九 | 色很久 | 久久精品夜色噜噜亚洲a∨ 在线中文字幕播放 | 波多野结衣精品 | 偷拍一区二区三区 | 国产污片在线观看 | 欧美日韩一二区 | 欧美天堂在线 | 快射视频在线观看 | 成年在线视频 | 亚洲黄色一区二区 | 亚洲精品短视频 | 91涩 | 久久久三区 | 精品少妇一区二区三区免费观 | 日本不卡高清视频 | 午夜在线视频观看 | 国产综合欧美 | 中文字幕乱码在线 | 免费黄色网址视频 | 日韩在线免费观看av | 免费精品在线 | 天天操妹子| 国产999精品久久久久久 | 一级成人免费视频 | 国产美女精品视频 | 精品美女一区二区三区 | 欧美大片免费高清观看 | www.天天综合 | 精品一区二三区 | 视频一区在线观看 | 永久在线观看 | 色激情网 | 久久精品大片 | 国产精品入口66mio | 国产福利在线 | 欧美一区二区视频在线观看 | 男女av在线 | 日日噜噜噜噜人人爽亚洲精品 | 天天操夜夜拍 | 午夜av免费| 少妇超碰 | 激情综合激情 | 青青草网址 | 日本中文字幕在线播放 | 久久精品国产精品亚洲毛片 | 亚洲一级av毛片 | 四虎福利视频 | 成人黄色在线播放 | 午夜激情视频在线 | 日韩黄色免费视频 | 国产免费一区二区三区在线观看 | 国产精品美女久久久久av超清 | 91手机在线观看 | 欧美做受69 | 亚洲日本香蕉视频 | 婷婷激情五月综合 | 亚洲视频 欧美视频 | 国产偷久久一级精品 | 亚洲一区在线看 | 久久久人人人 | 天天操妹子 | 免费精品视频 | 国产999精品视频 | 激情网网站 | 69亚洲乱人伦 | 欧美天天爽 | 蜜桃精品视频在线 | 污视频在线免费 | 9p69.com| 国产69精品久久久久久 | 在线国产视频 | aa级黄色片| 国产性久久 | 大片av | 懂色av | 九九碰| 在线观看日韩免费视频 | 五月天中文字幕mv在线 | 五月婷婷六月丁香 | 日韩精品在线观看网站 | 欧美日韩偷拍视频 | 免费av看 | 93久久精品日日躁夜夜躁欧美 | 国产午夜精品在线观看 | 黄色特级一级片 | 99在线观看视频 | 色玖玖综合 | 欧美成人专区 | 亚洲精品一二区 | 九九热在线视频播放 | 日韩精品久久久久久久酒店 | 日韩精品久久久 | av免费网| 亚洲男人皇宫 | 国产91精品久久久 | 亚洲一a | 69成人网 | 超碰97久久 | 色婷婷av一区二区三区软件 | 亚洲国产精品一 | 亚洲一级在线播放 | 欧美国产日韩在线观看 | 黄色一级免费片 | 欧美在线播放一区二区 | 亚洲高清久久 | 农村偷人一级超爽毛片 | 久久噜噜噜精品国产亚洲综合 | 亚欧色视频 | 欧美三级a做爰在线观看 | 国产精品久久久久久欧美2021 | 亚洲精品久久久久58 | 一级久久久久久 | 污片网站在线观看 | 国产探花一区二区 | 日批视频免费观看 | 婷婷开心激情网 | 性高潮在线观看 | 亚洲激情五月婷婷 | 久草色视频 | 伊人一二三 | 爽爽窝窝午夜精品一区二区 | 精品视频免费久久久看 | 色图社区 | 国产一区二区精品 | 日韩中文字幕在线观看 | 不卡视频在线观看 | 婷婷色亚洲 | 五月婷婷激情视频 | 狠狠干导航 | 公车痴汉媚药强抹在线观看 | 色妻av| 狠狠干夜夜| 香蕉狠狠爱视频 | 欧美在线性视频 | 午夜精品少妇 | 丁香婷婷久久久综合精品国产 | 97福利网 | 亚洲愉拍自拍 | 国产精选第一页 | 欧美精品一区二区三区视频 | 自拍偷拍亚洲欧美 | 91在线一区二区三区 | 国产欧美一区二区精品老汉影院 | 午夜在线观看免费视频 | 一区二区三区精品在线观看 | 黄色小说视频网站 | 国产亚洲精品久久久久5区 中国女人啪啪69xxⅹ偷拍 | 亚洲区小说区图片区 | 自拍偷拍精品 | 在线视频中文字幕一区 | 在线视频 中文字幕 | 久久综合影视 | 超碰91在线| 伦理亚洲 | 亚洲高清视频在线播放 | 免费黄色在线播放 | 日产精品久久久久久久 | 国产精品视频第一页 | 国内黄色片 | 大桥未久av在线播放 | 人人干人人艹 | 久久五月亭| 蜜桃av一区二区三区 | 成人国产黄色 | 艳母动漫在线播放 | av在线天堂| 欧美成在线| 永久免费看片在线 | 亚洲成人一区二区 | 伊人黄色 | 伊人伦理| 热热色国产 | 久久久国产免费 | 99久久免费精品国产免费高清 | 亚洲欧美综合在线观看 | 亚洲免费网址 | 久久久久久国产精品日本 | 日日爽夜夜操 | 91嫩草入口 | 中国特黄毛片 | 男女搞黄网站 | 视频一区二区国产 | 公与妇乱理三级xxx 中文字幕一区二区三区四区欧美 | 一a一片一级一片啪啪 | 国产三区在线成人av | 亚洲欧美日韩精品久久久 | 国产一区二区三区影视 | 91porny九色| 国产激情在线播放 | 神马久久久久久 | 嫩草影院一区二区三区 | 69视频在线免费观看 | 麻豆亚洲一区 | 国产黄色小视频在线观看 | 合集lunjian挨cao双性 | 激情五月激情综合网 | 69av在线| 国产精品久久久久久69 | 亚洲看黄| 国产精品区一区二区三 | 国产色站| 日韩欧美在线中文字幕 | 国产aaa级片 | 日韩欧美一区二区在线观看 | 日韩三级视频在线播放 | 国产精品成人免费一区久久羞羞 | 国产在线网站 | 日本人体视频 | 妻色成人网| 中文av免费 | 少妇高潮一区二区三区99小说 | 香蕉狠狠爱视频 | 欧美日韩免费视频 | 天天操好逼 | 久久久综 | 超碰在线观看99 | 91福利片| 国产精品久久久久久三级 | √8天堂资源地址中文在线 国产在线视频你懂的 | 国产免费一区二区三区最新不卡 | 亚洲一级中文字幕 | 亚洲免费观看高清 | 偷偷操网站 | 国产精品久久久久久久一区二区 | 亚洲国产91 | 日韩欧美中文字幕在线播放 | 亚洲高清色图 | 欧美国产免费 | 黄色一区二区三区四区 | 一级黄色av | 新宿事件粤语在线观看完整免费观看 | 亚洲午夜精品在线观看 | 亚洲精品乱码久久久久久蜜桃91 | 国产老头和老头xxxx× | 久久综合久色欧美综合狠狠 | 国产专区第一页 | 欧美国产片 | 很黄很污的视频网站 | 亚洲视频国产一区 | 国产一区二区三区欧美 | 操亚洲女人 | 看全色黄大色黄大片大学生 | 亚洲无吗在线 | 久久久精品一区二区三区 | 桃色在线视频 | 尤物一区二区 | 亚洲免费看片 | 草草草av | 香蕉网在线观看 | 久久久久久片 | 国产精品呻吟 | 中文字幕一区二区三区视频 | 国产精品第8页 | 欧美日韩国产在线 | aaaaa毛片| 人人插人人插 | 成人av中文字幕 | 粉嫩av在线 | 亚洲国产aⅴ| 欧美伊人久久 | 伊人网站在线观看 | 一级国产精品一级国产精品片 | 国产精品老牛视频 | 亚洲男人天堂2020 | 天天干天天操 | 香蕉视频国产 | 成 人 黄 色 片 在线播放 | 国产成人+综合亚洲+天堂 | 天堂视频免费在线观看 | 国产精品黄色 | 精品产国自在拍 | 精品一区二区av | 曰韩av| 不卡的av在线播放 | 亚洲精品乱码久久久久久久 | 香蕉网在线 | 国产精品尤物视频 | 爽妇综合网 | 天天综合网天天综合 | 国产超碰av | 99久久免费毛片基地 | 黄色av中文字幕 | 真实亲伦对白清晰在线播放 | 手机在线看片国产 | 精品久久久久久亚洲 | 国产日韩免费 | 国产尤物在线 | 久久青青草视频 | 亚洲成人99 | 黄色网av| 久久久看片 | 成人免费一区 | 欧美三级三级三级爽爽爽 | 99久久精品免费看国产一区二区三区 | 最色毛片 | 91人人爱| 久久精品伊人 | 红桃视频国产精品 | 国产精品成av人在线视午夜片 | 高跟肉丝丝袜呻吟啪啪网站av | 成人欧美一区二区三区黑人冫 | 亚州综合一区 | 有码在线| 夜夜夜爽| 国产第一毛片 | 久久综合久久鬼 | 国产偷亚洲偷欧美偷精品 | 国产精品第二十页 | 婷婷二区 | 日韩一区二区三区av | 国产精品123 | 国产又猛又粗 | 亚洲女人天堂网 | 成人国产免费 | 成人免费一区二区三区 | 天堂va蜜桃 | 3p视频在线| 日韩免费专区 | 午夜男人网 | 久久亚州| 欧美特级毛片 | 91麻豆免费视频 | 日韩在线播放一区二区 | 午夜性刺激免费视频 | 97超碰人人模人人人爽人人爱 | 国产一区二区三区视频网站 | 成人av专区 | 欧美一区二区三区四区在线观看 | 久久人人爽人人爽人人片亚洲 | 久久毛片网站 | 丁香婷婷久久久综合精品国产 | 日日夜夜操视频 | 日韩一区二区在线观看 | 国产福利免费观看 | 欧美资源在线观看 | 亚洲乱码视频 | www.日本黄色| 高清视频一区 | 一级黄色激情片 | 毛片毛多水多 | 黄视频免费看在线 | 日日操影院 | 亚洲激情在线播放 | 欧美精品色| 夜夜操操操操 | 男女性生活视频网站 | 尤物精品在线 | 开心激情综合 | 九一爱爱| 国产又大又黄视频 | 男人操女人的网站 | 久久99九九| 国产精品av一区二区 | 色图av| 国产伦精品一区二区三区在线观看 | 99久久国产免费 | 人人入人人 | www.色在线 | 蜜臀麻豆| 免费人成 | 亚欧视频在线播放 | www日本在线观看 | 亚洲男人在线天堂 | 国产精品区二区三区日本 | 午夜欧美视频 | 午夜一本| 亚洲最大中文字幕 | 在线观看视频中文字幕 | 亚洲成人a v| 一本久久综合亚洲鲁鲁五月天 | 亚洲特级毛片 | 久久久久亚洲av毛片大全 | 骚虎视频最新网址 | 一级三级黄色片 | 一区二区久久精品66国产精品 | 亚洲网友自拍 | 播放黄色一级片 | 黄色一及大片 | 超碰在线91| 亚洲一视频 | 美女插插 | 欧美黄色一级 | 91未成人在线观看喷潮 | 日本特黄特色aaa大片免费 | 亚洲不卡视频 | 成人91在线观看 | 日日撸夜夜操 | 不卡二区| 自拍偷拍 校园春色 | 午夜视频在线免费看 | 久久艹艹| 中文字幕不卡在线 | 精品免费 | 男女av免费 | 亚洲精品视频二区 | 国产精品尤物 | 青青青草视频在线 | 黄色一区二区三区四区 | 欧美精品自拍 | 日韩精品久久久久久 | 亚洲国产成人精品久久 | 中文字幕一区二区三区有限公司 | 国产女人视频 | 亚洲a区在线观看 | 精东影业一区二区三区 | 四虎精品影视 | 在线色亚洲 | 黄色成年视频 | 国产女无套免费视频 | 成人精品 | 在线观看欧美视频 | 香蕉久久一区二区三区 | 国产三级在线免费 | 九九热在线视频观看 | 国产午夜片 | 日韩毛片一区 | 婷婷俺来也 | 日韩欧美一区在线 | 久久国产中文 | 日本久久伊人 | 热热热热色| 亚洲va天堂va欧美ⅴa在线 | 亚洲三级av | 亚洲一区 中文字幕 | 国产精品原创巨作av | 精品国产18久久久久久 | 欧美日韩在线一区 | 男女视频在线免费观看 | av直接看 | 国产又粗又黄又爽 | 操操网址 | 亚洲午夜天堂 | 天海翼视频在线观看 | 亚洲国产精品99久久久久久久久 | 午夜在线国产 | 动漫av在线播放 | 寡妇激情做爰呻吟 | 日韩精品久久久久久免费 | 亚洲乱码国产乱码精品天美传媒 | 男女久久久 | 一区二区三区四区视频在线观看 | 国产欧美视频一区二区三区 | 丁香激情网 | 黄色片网站大全 | 人人爽人人射 | 欧美成人国产精品高潮 | 国产精品另类 | 亚洲第一区在线 | 精品国产乱码久久久久久蜜臀网站 | 毛片网站免费在线观看 | 色激情五月 | 成人免费在线视频网站 | 久久视频免费在线观看 | 精品国产99 | 亚洲最新在线观看 | 欧美激情一二三区 | 亚洲精品久久久久久久久久 | 91精品国产综合久久精品图片 | 国产婷婷色综合av蜜臀av | 日韩特级毛片 | 久久久久亚洲天堂 | 在线观看欧美日韩视频 | 亚洲一区二区精品视频在线观看 | 国产a级黄色| 黄色www视频 | 色婷婷综合成人av | 国产黄色免费网站 | 国产精品国产三级国产aⅴ无密码 | 精品亚洲天堂 | 少妇高潮久久久久久潘金莲 | 国产成人精品一区二区色戒 | 久久国产免费看 | 成人自拍av | 男女午夜网站 | 九九免费精品视频 | 国产日韩欧美一区 | 成人免费视频国产在线观看 | 性视频日韩 | 葵司在线视频 | 中文字幕在线播放av | 亚洲高清影院 | 女人高潮特级毛片 | 日韩精品成人av | 99久久精品日本一区二区免费 | 在线色网| 高清一级片 | 97人人模人人爽人人喊网 | 性午夜| 国产精品日韩欧美大师 | 91在线观看 | 欧美第一页草草影院 | 视频一区二区中文字幕 | 91们嫩草伦理 | 朝桐光在线播放 | 网站毛片 | 9191av| 黄色在线播放视频 | 日韩视频一区 | 国产字幕侵犯亲女 | 色老头一区二区三区在线观看 | 日韩免费av | 一本免费视频 | 自拍偷拍视频网站 | 亚洲日本国产精品 | 好吊日在线观看 | 色女仆影院 | 国产精品美女久久久久久久久 | 亚洲一区二区三区加勒比 | 日韩中文在线观看 | 久久久久久91香蕉国产 | 精品国产黄色片 | 性毛片| 成人性生交大全免 | 成人三级做爰av | 成年人高清视频 | 奇米成人影视 | 亚洲欧美bt| 九九一级片| 亚洲天堂男人的天堂 | 欧美小视频在线观看 | 中文字幕在线免费观看 | 久草一区| 亚洲欧美日韩成人 | 91精品国产一区 | 九九九在线视频 | 91亚洲国产成人精品一区 | 日韩免费a| 精品美女www爽爽爽视频 | 天天玩天天干 | 樱桃视频污污 | 欧美一级片免费观看 | 精品久久久久久久久久久久久久久久久 | av黄在线| 黄色一区二区三区视频 | 国产精品suv一区二区三区 | 久久精品成人 | 日韩中文字幕在线 | 懂色av懂色av粉嫩av分享吧 | bbbbbxxxxx性欧美 | 国产又粗又黄的视频 | 在线观看视频色 | 激情综合站| 日本毛茸茸bbbbb潮喷 | 日韩激情中文字幕 | 国产xxx在线观看 | 国产毛片毛片毛片 | 日日夜夜免费精品 | 裸体喂奶一级裸片 | 在线看国产视频 | 亚洲国产精品久久人人爱潘金莲 | 在线视频资源 | 欧美在线国产 | 欧美不卡视频 | 国产欧美高清视频 | 一区二区视频在线观看 | 三级免费毛片 | 国产一级片在线播放 | 18精品爽视频在线观看 | а√在线中文网新版地址在线 | 亚洲亚裔videos黑人hd |