日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

计算机软件实习项目三 —— 超级玛丽闯迷宫 (代码实现) 12-21

發(fā)布時(shí)間:2023/12/20 编程问答 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 计算机软件实习项目三 —— 超级玛丽闯迷宫 (代码实现) 12-21 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

代碼實(shí)現(xiàn)(超級(jí)瑪麗闖迷宮)

??上一篇博客對(duì)這個(gè)游戲的整體框架以及算法的流程進(jìn)行了比較詳細(xì)的設(shè)計(jì)及分析;對(duì)必要的類和類的成員變量、類的方法進(jìn)行了聲明以及聲明。這一篇博客主要來呈現(xiàn)相關(guān)代碼。

目錄

    • 代碼實(shí)現(xiàn)(超級(jí)瑪麗闖迷宮)
      • 一、迷宮定義(Map類)
        • 1. 定義枚舉類
        • 2. 成員變量
        • 3. 成員方法
      • 二、隨機(jī)生成迷宮(Prim算法)
        • 1. prim算法生成迷宮流程
      • 三、迷宮自動(dòng)尋路(A*算法)
        • 1. 定義結(jié)點(diǎn)
        • 2. 子方法
        • 3. 算法流程
      • 四、游戲界面(PyQt5)
        • 1. 成員變量
        • 2. 構(gòu)造函數(shù)
        • 3. 子方法

一、迷宮定義(Map類)

??要實(shí)現(xiàn)隨機(jī)生成迷宮第一步當(dāng)然是定義迷宮,定義迷宮的大小以及對(duì)迷宮進(jìn)行獲取、設(shè)置、重置、判斷、打印等操作的方法。

# 定義地圖類 class Map():

1. 定義枚舉類

??用于規(guī)范結(jié)點(diǎn)類型和墻的方位。

(1)NODE_TYPE(Enum): 結(jié)點(diǎn)的類型。

class NODE_TYPE(Enum):NODE_EMPTY = 0,NODE_BLOCK = 1,NODE_START = 2,NODE_END = 3,

(2)WALL_DIRECTION(Enum): 墻壁在當(dāng)前結(jié)點(diǎn)的方位。

class WALL_DIRECTION(Enum):WALL_LEFT = 0,WALL_UP = 1,WALL_RIGHT = 2,WALL_DOWN = 3,

2. 成員變量

(1)width,height:定義迷宮的行數(shù)和列數(shù)。

(2)map:二維列表用來存放迷宮地圖,坐標(biāo)定義與數(shù)組索引相似,x為縱向,y為橫向(與一般坐標(biāo)系不同)。

二維列表中每一個(gè)元素的值代表不同的含義,分別如下:

① map[i][j] == 0:當(dāng)前格為空格。

② map[i][j] == 1:當(dāng)前格為墻壁。

③ map[i][j] == 2:當(dāng)前格為起點(diǎn)。

④ map[i][j] == 3:當(dāng)前格為終點(diǎn)。

⑤ map[i][j] == 4:當(dāng)前格為自動(dòng)尋路路徑上的結(jié)點(diǎn)。

def __init__(self, width, height):self.width = widthself.height = height# 嵌套使用列表解析快速生成地圖self.map = [[0 for x in range(self.width)] for y in range(self.height)]

3. 成員方法

(1)getMap(self):返回當(dāng)前對(duì)象的map[n][m]二位迷宮列表。

def getMap(self):return self.map

(2)resetNode(self, value):設(shè)置map[n][m]二位迷宮列表的每一個(gè)元素為value值。

def resetNode(self, value):for x in range(self.height):for y in range(self.width):self.setNode(x, y, value)

(3)setNode(self, x, y, value):設(shè)置map[x][y] = value。

def setNode(self, x, y, value):if value == NODE_TYPE.NODE_EMPTY:self.map[x][y] = 0elif value == NODE_TYPE.NODE_BLOCK:self.map[x][y] = 1elif value == NODE_TYPE.NODE_START:self.map[x][y] = 2elif value == NODE_TYPE.NODE_END:self.map[x][y] = 3

(4)isWall(self, x, y):判斷map[x][y] = 1 ?也就是判斷是否是墻壁。

def isWall(self, x, y):return self.map[x][y] == 1

(5)showMap(self):打印map[n][m]整個(gè)迷宮。

def showMap(self):for row in self.map:s = ''for col in row:if col == 0:s += ' 'elif col == 1:s += ' #'elif col == 2:s += ' S'elif col == 3:s += ' E'print(s)print(self.map)

二、隨機(jī)生成迷宮(Prim算法)

1. prim算法生成迷宮流程

def randomPrim(map, width, height):

預(yù)處理部分:

(1)定義一個(gè)檢查列表checklist存放為劃分頂點(diǎn)集。

checklist = []

(2)把初始起點(diǎn)加入checklist列表中。

checklist.append((startX, startY)) # 把初始結(jié)點(diǎn)加入隊(duì)列

主循環(huán)部分:

(3)重復(fù)下面幾個(gè)步驟直到檢查列表checklist為空:

# 如果列表不為空while len(checklist):

??① 隨機(jī)取出checklist列表中的一個(gè)結(jié)點(diǎn)node1。

# 每次隨機(jī)選擇一個(gè)空結(jié)點(diǎn)entry = choice(checklist)

??② 檢查這個(gè)結(jié)點(diǎn)node1周圍有沒有墻wall。

if checkAdjacentPos(map, entry[0], entry[1], width, height, checklist):

????③ 有墻:從這個(gè)結(jié)點(diǎn)node1周圍的墻中隨機(jī)選一個(gè),假設(shè)是wall_left,把這個(gè)墻置為空;并且把這個(gè)墻與node1之間的結(jié)點(diǎn)也置為空;最后把這個(gè)墻的位置坐標(biāo)加入checklist中。

directions = []if x > 0:if map.isWall(2 * (x - 1) + 1, 2 * y + 1):directions.append(WALL_DIRECTION.WALL_UP)if y > 0:if map.isWall(2 * x + 1, 2 * (y - 1) + 1):directions.append(WALL_DIRECTION.WALL_LEFT)if x < height - 1:if map.isWall(2 * (x + 1) + 1, 2 * y + 1):directions.append(WALL_DIRECTION.WALL_DOWN)if y < width - 1:if map.isWall(2 * x + 1, 2 * (y + 1) + 1):directions.append(WALL_DIRECTION.WALL_RIGHT)# 如果當(dāng)前結(jié)點(diǎn)四周的相鄰結(jié)點(diǎn)有墻if len(directions):# 隨機(jī)選一個(gè)墻direction = choice(directions)if direction == WALL_DIRECTION.WALL_LEFT:map.setNode(2 * x + 1, 2 * (y - 1) + 1, NODE_TYPE.NODE_EMPTY)map.setNode(2 * x + 1, 2 * y, NODE_TYPE.NODE_EMPTY)checklist.append((x, y - 1))elif direction == WALL_DIRECTION.WALL_UP:map.setNode(2 * (x - 1) + 1, 2 * y + 1, NODE_TYPE.NODE_EMPTY)map.setNode(2 * x, 2 * y + 1, NODE_TYPE.NODE_EMPTY)checklist.append((x - 1, y))elif direction == WALL_DIRECTION.WALL_RIGHT:map.setNode(2 * x + 1, 2 * (y + 1) + 1, NODE_TYPE.NODE_EMPTY)map.setNode(2 * x + 1, 2 * (y + 1), NODE_TYPE.NODE_EMPTY)checklist.append((x, y + 1))elif direction == WALL_DIRECTION.WALL_DOWN:map.setNode(2 * (x + 1) + 1, 2 * y + 1, NODE_TYPE.NODE_EMPTY)map.setNode(2 * (x + 1), 2 * y + 1, NODE_TYPE.NODE_EMPTY)checklist.append((x + 1, y))

????④ 無墻:把node1從checklist中刪除。

checklist.remove(entry)

(4)通過上述步驟后,迷宮即可隨機(jī)生成。

三、迷宮自動(dòng)尋路(A*算法)

1. 定義結(jié)點(diǎn)

??為什么要定義結(jié)點(diǎn):因?yàn)樽詈筝敵雎窂降臅r(shí)候需要從最后一個(gè)目標(biāo)結(jié)點(diǎn)不斷訪問父節(jié)點(diǎn)來進(jìn)行路徑追溯,最后才能輸出從源節(jié)點(diǎn)到目標(biāo)結(jié)點(diǎn)的一條完整路徑。
主要變量有:

  • x、y坐標(biāo)
  • 沿當(dāng)前路徑到map[x][y]的路徑長(zhǎng)度(G值)
  • 當(dāng)前路徑的F值(F = G + H)
  • 父節(jié)點(diǎn)(用于路徑回溯)
# 定義結(jié)點(diǎn) class Node():x = 0y = 0long = 0score = 0parent = []

2. 子方法

(1)pathEvaluate(val, fx, fy, ex, ey) :

??計(jì)算當(dāng)前路徑代價(jià)(F = G + H)。

# 當(dāng)前路徑代價(jià) = 當(dāng)前路徑長(zhǎng)度 + 曼哈頓距離 def pathEvaluate(val, fx, fy, ex, ey):return val + abs(ey - fy) + abs(ex - fx)

(2)findMin(open) :

??返回open表中代價(jià)最小的結(jié)點(diǎn)。

# 返回open表中代價(jià)最小的結(jié)點(diǎn) def findMin(open):min_val = open[0]for temp in open:if temp.score < min_val.score:min_val = tempreturn min_val

(3)find_node(node, list):

??判斷某個(gè)結(jié)點(diǎn)在不在某個(gè)表中。

# 判斷某個(gè)結(jié)點(diǎn)在不在某個(gè)表中 def find_node(node, list):for i in range(0,list.__len__()):if list[i].x == node.x and list[i].y == node.y:return ireturn -1

(4)AStar(map, row, col, sx, sy, ex, ey)方法:

??完成A* 算法的主邏輯,執(zhí)行過程中調(diào)用前面三個(gè)子方法。

# A*算法 def AStar(map, row, col, sx, sy, ex, ey):

3. 算法流程

定義與預(yù)處理部分:

(1)定義一個(gè)open開放列表,這里面的結(jié)點(diǎn)可能更新可能移除。
(2)定義一個(gè)close封閉列表 ,這里面的結(jié)點(diǎn)不需要處理。
(3)往open表中加入起點(diǎn)。

open = []close = []turn = [[0,1],[1,0],[0,-1],[-1,0]]open.append(Node(sx, sy, 0, pathEvaluate(0, sx, sy, ex, ey), -1))

主循環(huán)部分:

(4)重復(fù)下面幾個(gè)步驟直到檢查列表checklist為空:

# 只要open表不為空就繼續(xù)搜索while len(open):

??① 找到open表中代價(jià)最小的結(jié)點(diǎn),把它從open表中取出并放入close表中。

# 找到open表中代價(jià)最小的結(jié)點(diǎn)node = findMin(open)# 刪除open表中剛才找到的最小結(jié)點(diǎn)open.remove(node)# 在close表中加入剛才找到的最小結(jié)點(diǎn)close.append(node)

??② 判斷這個(gè)結(jié)點(diǎn)是否是目標(biāo)結(jié)點(diǎn)

# 如果目標(biāo)結(jié)點(diǎn)是終點(diǎn),返回pathif node.x == ex and node.y == ey:

??????③ 是:通過這個(gè)結(jié)點(diǎn)不斷回溯到源節(jié)點(diǎn)生成一條路徑,返回這個(gè)路徑并退出整個(gè)AStar函數(shù)。

path = []while node.parent != -1:path.append((node.x, node.y))node = node.parent# path.append([node.x, node.y])del(path[0])path.reverse()return path

??????④ 否:往相鄰結(jié)點(diǎn)nx拓展搜索。

# 往相鄰結(jié)點(diǎn)拓展搜索for add in turn:dx = node.x + add[0] # 目的結(jié)點(diǎn)橫坐標(biāo)dy = node.y + add[1] # 目的結(jié)點(diǎn)縱坐標(biāo)dl = node.long + 1 # 目的路徑長(zhǎng)度ds = pathEvaluate(dl, dx, dy, ex, ey) # 計(jì)算目標(biāo)結(jié)點(diǎn)路徑代價(jià)d_node = Node(dx, dy, dl, ds, node)

??????????⑤ 如果相鄰結(jié)點(diǎn)nx:1.在close表里。2.是墻壁。3. 超出地圖邊界。就跳過這個(gè)相鄰結(jié)點(diǎn)nx,直到這個(gè)結(jié)點(diǎn)的4個(gè)相鄰結(jié)(n1、n2、n3、n4)點(diǎn)都判斷過。

# 如果相鄰結(jié)點(diǎn)1.在close表里。2.是墻壁。3. 超出地圖邊界。就不拓展。if find_node(d_node, close) != -1 or map[dx][dy] == 1 or dx < 0 or dy < 0 or dx >= row or dy >= col:continue

??????????⑥ 如果相鄰結(jié)點(diǎn)nx在open表中(注意只要 (x,y) 坐標(biāo)相同就算相同),比較相鄰結(jié)點(diǎn)nx和open表中結(jié)點(diǎn)的G移動(dòng)代價(jià),如果相鄰結(jié)點(diǎn)n的G值比open表中相同結(jié)點(diǎn)的G值小,則更新open表中的相同結(jié)點(diǎn)的G值和F值,并且把open表中的相同結(jié)點(diǎn)的父節(jié)點(diǎn)設(shè)置為當(dāng)前結(jié)點(diǎn)。

# 如果目標(biāo)結(jié)點(diǎn)在open表中pos = find_node(d_node, open)if pos != -1:t_node = open[pos]if d_node.long < t_node.long:open[pos].long = d_nodeopen[pos].score = pathEvaluate(open[pos].long, open[pos].x, open[pos].y, ex, ey)open[pos].parent = node

??????????⑦ 如果相鄰結(jié)點(diǎn)nx不在open表中,直接把相鄰結(jié)點(diǎn)nx加入open表中。

# 如果不在open表中,將當(dāng)前結(jié)點(diǎn)加入open表else:open.append(d_node)

(4)通過上述步驟后,從源結(jié)點(diǎn)到目標(biāo)結(jié)點(diǎn)的路徑就生成了。

四、游戲界面(PyQt5)

1. 成員變量

??① 窗口變量:設(shè)置窗口大小

# 窗口變量width = 900height = 900

??② 地圖變量:設(shè)置地圖行列數(shù)、起點(diǎn)、終點(diǎn)、地圖列表

# 地圖變量row = 7col = 7start_x = 1start_y = 0end_x = row - 2end_y = col - 1map = [] # 隨機(jī)生成的迷宮

??③ 玩家變量:定義玩家坐標(biāo)

# 玩家變量player_x = 1player_y = 0

??④ 游戲標(biāo)志:定義各種游戲標(biāo)志,如到第幾關(guān)、是否通關(guān)、人物左右。

# 游戲標(biāo)志player_direction = 1 # 0代表人朝左,1代表人朝右key_flag = 1 # 標(biāo)志是否可以按鍵level = 1 # 游戲關(guān)卡paint_label = 1 # 畫關(guān)卡win_flag = 0 # 標(biāo)記勝利

??⑤ 音樂播放器:音樂播放器的初始化以及音樂的導(dǎo)入。

# 音樂播放器pygame.mixer.init()pygame.mixer.music.load(r"Music/Level 1.mp3") # 背景音樂sound_grow = pygame.mixer.Sound(r"Music/grow.mp3") # 升級(jí)音效sound_pass = pygame.mixer.Sound(r"Music/Pass.mp3") # 過關(guān)音效sound_gold = pygame.mixer.Sound(r"Music/gold.mp3") # 金幣音效sound_gold.set_volume(0.2)

2. 構(gòu)造函數(shù)

  • 設(shè)置窗口標(biāo)題
  • 設(shè)置圖標(biāo)
  • 設(shè)定游戲背景顏色
  • 游戲窗口大小
  • 讓游戲窗口大小固定
  • 初始化游戲
  • def __init__(self):QWidget.__init__(self) # 調(diào)用父類的構(gòu)造函數(shù)self.setWindowTitle('Super Mario v1.0') # 設(shè)置窗口標(biāo)題self.setWindowIcon(QIcon("Picture/Logo.ico"))self.setStyleSheet('background-color:#622C0D') # 設(shè)定游戲背景顏色self.resize(self.width, self.height) # 游戲窗口大小self.setFixedSize(self.width, self.height) # 讓游戲窗口大小固定# 初始化游戲self.init()

    3. 子方法

  • init(self): 初始化游戲
  • # 初始化游戲def init(self):self.player_x = 1self.player_y = 0self.update_level() # 更新地圖尺寸self.map = Maze.run(self.row, self.col) # 更新地圖self.paint_label = 1self.win_flag = 0self.update()self.key_flag = 1 # 標(biāo)志是否可以按鍵self.update_bgm()
  • update_bgm(self): 更新背景音樂
  • # 更新背景音樂def update_bgm(self):pygame.mixer.music.stop()if self.level == 1:pygame.mixer.music.load(r"Music/Level 1.mp3") # 背景音樂pygame.mixer.music.play(-1)if self.level == 2:pygame.mixer.music.load(r"Music/Level 2.mp3") # 背景音樂pygame.mixer.music.play(-1)if self.level == 3:pygame.mixer.music.load(r"Music/Level 3.mp3") # 背景音樂pygame.mixer.music.play(-1)
  • update_level(self): 更新游戲關(guān)卡
  • # 更新游戲關(guān)卡def update_level(self):if self.level == 1:self.row = 7self.col = 7self.setStyleSheet('background-color:#552408')elif self.level == 2:self.row = 15self.col = 15self.setStyleSheet('background-color:#034B4B')elif self.level == 3:self.row = 31self.col = 31self.setStyleSheet('background-color:#3F2706')self.end_x = self.row - 2self.end_y = self.col - 1
  • showMap(self): 打印地圖
  • # 打印地圖def showMap(self):print("start(%d, %d)" % (self.start_x, self.start_y))print("end(%d, %d)" % (self.end_x, self.end_y))for row in self.map:s = ''for col in row:if col == 0:s += ' 'elif col == 1:s += ' #'elif col == 2:s += ' S'elif col == 3:s += ' E'elif col == 4:s += ' G'print(s)
  • paintEvent(self, event): 繪圖事件
  • # 繪圖事件def paintEvent(self, event):QWidget.paintEvent(self, event)painter = QPainter(self)col_space = self.width / self.colrow_space = self.height / self.rowfor i in range(0, self.col):for j in range(0, self.row):node = self.map[j][i]if node == 1:if self.level == 1:painter.drawImage(QRectF(i * col_space, j * row_space, col_space, row_space),QImage('Picture/wall.png'))if self.level == 2:painter.drawImage(QRectF(i * col_space, j * row_space, col_space, row_space),QImage('Picture/wall_2.png'))if self.level == 3:painter.drawImage(QRectF(i * col_space, j * row_space, col_space, row_space),QImage('Picture/wall_3.png'))if node == 2:pic = ''if self.level == 1:if self.player_direction == 1:pic = 'Picture/player1_right.png'else:pic = 'Picture/player1_left.png'else:if self.player_direction == 1:pic = 'Picture/player2_right.png'else:pic = 'Picture/player2_left.png'painter.drawImage(QRectF(self.player_y * col_space, self.player_x * row_space, col_space, row_space),QImage(pic))if node == 3:pic = ''if self.level == 1:pic = 'Picture/mushroom'elif self.level == 2:pic = 'Picture/star'elif self.level == 3:pic = 'Picture/water_pipe'painter.drawImage(QRectF(self.end_y * col_space, self.end_x * row_space, col_space, row_space),QImage(pic))if node == 4:painter.drawImage(QRectF(i * col_space, j * row_space, col_space, row_space),QImage('Picture/gold.png'))# 畫關(guān)卡if self.paint_label == 1:painter.setPen(QColor(255, 255, 255))painter.setFont(QFont('Apple ][', 40))if self.level == 1:painter.drawText(self.width / 2 - 220, self.height / 2, "Level 1")elif self.level == 2:painter.drawText(self.width / 2 - 220, self.height / 2, "Level 2")elif self.level == 3:painter.drawText(self.width / 2 - 220, self.height / 2, "Level 3")# 畫勝利標(biāo)志if self.win_flag == 1:painter.setPen(QColor(255, 255, 255))painter.setFont(QFont('Apple ][', 60))painter.drawText(self.width / 2 - 180, self.height / 2, "WIN!")painter.setFont(QFont('Apple ][', 12))painter.drawText(self.width / 2 - 350, self.height / 2 + 80, "Please press 'R' to restart the game")
  • sound(self): 播放音效
  • # 播放音效def sound(self):pygame.mixer.music.stop()if self.level == 1 or self.level == 2:self.sound_grow.play()self.key_flag = 0time.sleep(1)elif self.level == 3:self.sound_pass.play()self.key_flag = 0self.map[self.player_x][self.player_y] = 3self.win_flag = 1self.repaint()time.sleep(6)
  • checkPass(self): 判斷通關(guān)
  • # 判斷通關(guān)def checkPass(self):if self.player_x == self.row - 2 and self.player_y == self.col - 1:self.sound()if self.level != 3:self.level += 1self.init()
  • findpath(self): 自動(dòng)尋路
  • # 自動(dòng)尋路def findpath(self):path = AStar(self.map, self.row, self.col, self.player_x, self.player_y, self.end_x, self.end_y)for temp in path:self.map[temp[0]][temp[1]] = 4self.update()
  • keyPressEvent(self, event): 鍵盤事件
  • # 鍵盤事件def keyPressEvent(self, event):QWidget.keyPressEvent(self, event)key = event.key()if key == Qt.Key_F and self.win_flag != 1:self.findpath()# 重新生成地圖if key == Qt.Key_R:self.map = Maze.run(self.row, self.col)self.level = 1self.init()# 退出游戲if key == Qt.Key_Escape:self.close()# 判斷是否能移動(dòng)if self.key_flag == 0:return# 上移if key == Qt.Key_Up or key == Qt.Key_W:dest_up = self.player_x - 1if dest_up >= 0 and self.map[dest_up][self.player_y] != 1:if self.map[dest_up][self.player_y] == 4:self.sound_gold.play()self.map[self.player_x][self.player_y] = 0self.player_x = dest_upself.map[self.player_x][self.player_y] = 2self.update()# 下移if key == Qt.Key_Down or key == Qt.Key_S:dest_down = self.player_x + 1if dest_down < self.row and self.map[dest_down][self.player_y] != 1:if self.map[dest_down][self.player_y] == 4:self.sound_gold.play()self.map[self.player_x][self.player_y] = 0self.player_x = dest_downself.map[self.player_x][self.player_y] = 2self.update()# 左移if key == Qt.Key_Left or key == Qt.Key_A:self.player_direction = 0dest_left = self.player_y - 1if dest_left >= 0 and self.map[self.player_x][dest_left] != 1:if self.map[self.player_x][dest_left] == 4:self.sound_gold.play()self.map[self.player_x][self.player_y] = 0self.player_y = dest_leftself.map[self.player_x][self.player_y] = 2self.update()# 右移if key == Qt.Key_Right or key == Qt.Key_D:self.player_direction = 1self.paint_label = 0dest_right = self.player_y + 1if dest_right < self.col and self.map[self.player_x][dest_right] != 1:if self.map[self.player_x][dest_right] == 4:self.sound_gold.play()self.map[self.player_x][self.player_y] = 0self.player_y = dest_rightself.map[self.player_x][self.player_y] = 2if self.level == 3:self.update()else:self.repaint()self.checkPass()

    ??從理解Prim算法和A* 算法到自己實(shí)現(xiàn)這個(gè)算法需要不斷地嘗試、調(diào)試,在這個(gè)過程中又會(huì)進(jìn)一步加深對(duì)這些算法的理解。想法往往是簡(jiǎn)單的,而實(shí)現(xiàn)是復(fù)雜的,想得到的不一定實(shí)現(xiàn)的了。


    ———2020.12.21(羅涵)

    THE END

    總結(jié)

    以上是生活随笔為你收集整理的计算机软件实习项目三 —— 超级玛丽闯迷宫 (代码实现) 12-21的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。