五子棋游戲?qū)嶒瀳蟾鎋第1頁
五子棋游戲?qū)嶒瀳蟾鎋第2頁
五子棋游戲?qū)嶒瀳蟾鎋第3頁
五子棋游戲?qū)嶒瀳蟾鎋第4頁
五子棋游戲?qū)嶒瀳蟾鎋第5頁
已閱讀5頁,還剩15頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、五子棋游戲?qū)嶒瀳蟾嬲n程名稱 計算機程序設(shè)計(VB)學(xué) 號 姓 名 班 級 提交時間 五子棋軟件設(shè)計一、實驗?zāi)康?通過五子棋軟件設(shè)計或者自擬題目設(shè)計,鞏固本課程所學(xué)的各個章節(jié)重點知識,自擬題目的同學(xué)需盡早向教師提出自己的想法及設(shè)計方案。2通過開發(fā)一個較大的系統(tǒng),增強軟件開發(fā)能力。3通過調(diào)試系統(tǒng),增強邏輯思維能力。二、實驗內(nèi)容1基本要求:(1)輸入兩個對手名字,然后進入游戲界面。(2)用鼠標(biāo)點擊的方式在棋盤上擺放棋子,黑白交替。(棋盤15*15)(3)可以悔棋。(4)五子連在一起的時候能判斷勝利,并且顯示出勝利者的名字。(5)能夠?qū)⑵寰值慕Y(jié)果保存,保存該棋局結(jié)束的狀態(tài)、對手名字、 棋局名字(棋局名

2、字在保存時由用戶在相應(yīng)的界面下添入)(此功能要求用數(shù)據(jù)庫和文件兩種技術(shù)實現(xiàn))。(6)棋局能夠恢復(fù),即重新打開,打開后出現(xiàn)棋局結(jié)束的狀態(tài)、對手名字(此功能要求用數(shù)據(jù)庫和文件兩種技術(shù)實現(xiàn))。2其它要求:(1)界面友好、漂亮。(2)程序盡可能無bug。(3)程序健壯性強,基本上達到無論用戶如何操作,軟件都不出錯,都有相應(yīng)的處理方法。3設(shè)計步驟(1)首先做界面界面包括幾個窗體,窗體上有相應(yīng)的控件。因為需要畫棋盤,所以必須有圖形容器,這里用picturebox框第一個窗體是登陸界面,因為玩家姓名需要在程序中不斷變換,因此需要將玩家名定義成兩個變量,又因為這兩個變量在幾個窗體中都用到,所以在模塊中定義為全

3、局變量當(dāng)五子棋主界面啟動之后,首先系統(tǒng)要自動繪制棋盤。思路:用直線繪制棋盤-直線是由點繪制的-每個點都有坐標(biāo)-改變坐標(biāo)系為用戶坐標(biāo)系用戶坐標(biāo)系的定義要在窗體啟動時實現(xiàn)。(2)坐標(biāo)系的兩個頂點坐標(biāo)的確定?考慮到五子棋15*15,確定棋盤坐標(biāo)系頂點為(-8, 8),(8, -8)(3)棋子的繪制與存儲棋子的繪制用實心圓模式,顏色為黑色及白色兩種。棋子在內(nèi)存中的存儲方式:因為表示各個棋子的數(shù)據(jù)類型都相同,所以考慮用數(shù)組存儲,因為棋盤是二維的,因此棋子用二維數(shù)組a存儲。a(i,j)表示用戶坐標(biāo)(i,j)的棋子狀態(tài),0表示此處無棋子,1表示此處為黑子,2表示此處為白子,下棋初始時,棋盤所有位置的初始狀態(tài)

4、都為0(4)下棋子的步驟鼠標(biāo)點擊棋盤交叉點附近的位置,系統(tǒng)應(yīng)實現(xiàn)自動識別鼠標(biāo)點擊位置附近的交叉點解決方法:坐標(biāo)系的變換已經(jīng)將棋盤交叉點坐標(biāo)整數(shù)化,因此系統(tǒng)所需要實現(xiàn)的功能即是將鼠標(biāo)所點擊的位置坐標(biāo)化為整數(shù)即可,例如將(6.2, -5.3)變成(6, -5)。在交叉點上交替下黑白棋子。解決方法:定義一個邏輯數(shù)據(jù)類型變量blackwhite,該變量的值為真時下黑子,為假時下白子,每下一個棋子,該變量的值都要取反(NOT)。判斷贏棋每次下子時都必須進行贏棋判斷,判斷的依據(jù)是5個子按照橫線、豎線或斜線連成一行。解決方法:2層循環(huán)。當(dāng)有一方勝利時,棋局結(jié)束,此時在棋盤上繼續(xù)點擊,將不再下棋。解決方法:設(shè)

5、置一個邏輯變量wuziqi,其值為真時說明棋局沒有結(jié)束,可以在棋盤上放棋子,該值為假時,說明該棋局結(jié)束,不能放棋子。(6)五子棋保存棋局思路:保存棋局的功能即把內(nèi)存中與棋局相關(guān)的數(shù)據(jù)(棋局名稱、棋子位置、棋子顏色、棋局狀態(tài)(即棋局是否結(jié)束)存入外存中,以便以后能夠恢復(fù)棋局。保存的實現(xiàn)用兩種技術(shù)實現(xiàn):文件和數(shù)據(jù)庫。采用數(shù)據(jù)庫技術(shù)實現(xiàn)棋局保存:數(shù)據(jù)庫設(shè)計:數(shù)據(jù)表字段:棋局名、x坐標(biāo)、y坐標(biāo)、該點狀態(tài)值、下棋狀態(tài)。每條記錄表示棋盤上一個存儲的點的信息。 要實現(xiàn)用數(shù)據(jù)庫保存數(shù)據(jù),就必須使程序連接到數(shù)據(jù)庫上,這里用的是data控件,通過在程序中對data控件屬性的設(shè)置來連接數(shù)據(jù)庫、數(shù)據(jù)表。首先判斷如果輸

6、入的棋局名和當(dāng)前記錄的棋局名相等,說明表中有輸入棋局名對應(yīng)的棋局信息,將其刪除,判斷過程是將用戶輸入的棋局名(字符串)從記錄集(即表)的棋局字段頂端至下逐一比較在表的最后,也就是最后一條記錄后加上新保存棋局的各條記錄因為棋盤上空點居多,大部分點的信息為0,因此只需保存有棋子的點的信息用文件技術(shù)進行棋局保存,思路相同。(7)五子棋恢復(fù)棋局思路:首先從數(shù)據(jù)庫文件中找到要恢復(fù)棋局的數(shù)據(jù)(即曾經(jīng)保存的數(shù)據(jù)),然后把這些數(shù)據(jù)賦值給內(nèi)存中相應(yīng)的數(shù)組或者變量中,按照這些數(shù)據(jù)重新繪制棋盤和棋子,即完成了對棋局的恢復(fù)。窗體啟動事件應(yīng)該完成的事情:組合框中應(yīng)該顯示曾經(jīng)保存的棋局名。因為每次保存棋局時,都是將棋局所

7、有棋子的記錄添加在表的最后,因此表中關(guān)于棋局名的記錄只能是類似于aaabbbbccccc的形式,而不可能是abbcacc的形式,根據(jù)這個特點編程序取出表中不同的棋局名。具體算法:用一個字符串變量strfile初始值為空,從表的頂端向下依次移動記錄指針,如果當(dāng)前記錄的棋局名字段和strfile不相等,說明進入另一個棋局的記錄中,將該棋局記錄的棋局名賦值給strfile,并加入到組合框中,一直到表中最后一個記錄因為要從數(shù)據(jù)庫中取出相關(guān)數(shù)據(jù)到a數(shù)組中,因此要將a數(shù)組所有數(shù)據(jù)清零。要建立一個data控件,與數(shù)據(jù)庫連接起來,而后識別棋局(即表中的棋局名字段與在列表框中選擇的棋局名比較),將數(shù)據(jù)庫該棋局中

8、所有信息都賦值給a數(shù)組及相關(guān)變量。剛才僅僅是數(shù)據(jù)的恢復(fù),即將數(shù)據(jù)庫中已經(jīng)保存過的數(shù)據(jù)恢復(fù)到內(nèi)存中,下一步應(yīng)該根據(jù)內(nèi)存中的數(shù)據(jù)重新繪制棋盤以及棋子。重新繪制棋盤是獨立的一塊功能,因此考慮用全局子過程來實現(xiàn),該子過程定義在模塊中。思路如下:清屏繪制棋盤根據(jù)a數(shù)組中的每一項的兩個下標(biāo)來決定繪制棋子的位置,根據(jù)每一項的值是1還是2來決定在該位置繪制何顏色的棋子。決定該黑白方走的blackwhite變量當(dāng)時沒有保存,可以采用在數(shù)據(jù)庫中保存的方式來解決,本例中解決方法是通過數(shù)黑白棋子個數(shù)來決定恢復(fù)棋局后該誰走的。因此設(shè)置了一個變量做計數(shù)器,每走一步棋計數(shù)器的值加一。用文件技術(shù)實現(xiàn)棋局恢復(fù),思路相同。(8)

9、悔棋悔一步棋:用幾個變量來表示關(guān)于一步棋的幾個信息,每次下子都將該子的信息賦值給那幾個變量,悔一步棋即將那幾個變量所表示的點的a數(shù)組信息清零。而后調(diào)用paint()過程重畫。以上是教師帶著學(xué)生完成的軟件功能。遺留問題:保存棋手姓名和棋局名并在恢復(fù)棋局的時候顯示。(需要同學(xué)們自己完成)思路:在數(shù)據(jù)表中多建立兩個字段,分別表示兩個棋手姓名,同其它數(shù)據(jù)的保存類似。三、設(shè)計日期十二月四、完成日期十二月五、實驗體會其實,一開始學(xué)習(xí)vb我就對它不抱有一定的熱情,可能是因為要用到計算機以及編程問題,當(dāng)時一想到有代碼,就會無比的苦惱,但是為了讓這門課順利通過,我還是懷著一顆必須要學(xué)的心情。起初,我對待這門新課

10、程和其他課程一樣,保持著必須認真聽講的決心。但是由于理論課太過枯燥,沒學(xué)幾次,我就敗下陣來,開始有一節(jié)沒一節(jié)的聽,但是心里還是存有愧疚,就得自己不該這樣懶惰,所以總是坐在前邊幾排座位上,逼著自己一定要學(xué)些什么,這總歸要比坐在后邊效果要好一些。在學(xué)了這半學(xué)期vb之后,我同樣有了一些體會,雖然不會比創(chuàng)新程序的同學(xué)深刻,但是也讓我相信了,起碼在老師他自己的課堂上,他講的要點都是對的。1、一定要認真聽講做筆記,這是提高效率最快的方法,就像老師說的。有了上機課,我才能真正懂得聽課的重要性,其實有些課件雖然老師為了學(xué)生能夠及時的進行自我復(fù)習(xí)傳上去一些,但有些東西終歸是老師上課講的,而并沒有寫入課件的。所以

11、,當(dāng)真正自己寫的時候,一遍一遍的被程序提示出錯,內(nèi)心其實很著急,因為老師只有一個,而且也不會圍著你團團轉(zhuǎn),所以這時候,請教同學(xué)是唯一的方法,但是這唯一的方法也不是時時都能發(fā)揮作用,同學(xué)也有不會,還是需要老師。其實我知道,大部分的問題都是上課老師已經(jīng)講過的,只是自己沒聽?;蛘呤且恢虢猓?jīng)常寫丟一些重要程序,導(dǎo)致程序一直無法運行。比如我經(jīng)常把退出子過程exit sub弄丟,自己當(dāng)時沒覺得它很重要,雖然老師講過如果沒有這個,后邊的程序會很麻煩。當(dāng)時,我也只是那么一聽,沒在意,后來編程黑白子豎方向贏棋時沒把它加上,之后麻煩就出現(xiàn)了,我的黑白子一直都沒法完成豎方向贏棋總是有一個方向沒法判斷,起初老師告

12、訴我看看是否有算法上的錯誤,但是,我找了一節(jié)多課(我承認我這個人太固執(zhí),必須要知道為什么錯了,才會做下一步),我覺得我的算法一定沒問題,但是不明白為什么錯,后來在讀別人的程序時,才發(fā)現(xiàn)是我的exit sub沒寫,造成的,只有退出我上一個的子過程,這個過程才能正常運行。所以可見沒聽老師的話,是多么可怕,尤其還是在我也沒聽他講課的前提下根本不懂代碼意思,亂刪改造成的后果。所以,不管是在哪里,學(xué)知識是對任何事情在打基礎(chǔ)。做每一步都要問一句問什么,凡是都有原因。2、學(xué)會獨立思考,多問自己為什么,求幫助是下策在最初的的上機試驗里,我總會問老師一些我自己可以解決的問題,自己不愿動腦想,希望以最快捷的方式,

13、獲得最佳的結(jié)果。但是,往往會被老師教育一下,因為在其中,有一半是拼寫錯誤,而自己沒注意,另一半是寫程序時不夠完整(認真說起來是根本沒怎么想,只是將課上抄錄下來的不完整筆記,憑借自己的主觀意愿,編寫的程序,不問為什么)。其實后來想一想,確實是自己的問題,既耽誤自己時間,也耽誤老師時間。這些程序老師只是給一個思路,教你如何編寫程序,但是完整的需要自己來做,這些都需要弄清思路,才會懂得我需要什么,從而編寫出什么,這樣犯錯幾率才會大大減少。這也是鍛煉自己思路邏輯性的時候,也是老師讓我們學(xué)的地方。只是當(dāng)時沒有聽進去。就像老師說的,只有這樣才能將程序融為自己的,真正有能力去編自己想要邊的程序。3、任何新鮮

14、的事物都需要一個熟悉的過程,凡是要趁熱打鐵,效率才會高。其實,這也是老師經(jīng)常說的,可我們總是在做錯事之后,才會想起來,原來某某某說的話是多么的對,但是總是忽略它事前的作用。我確實每次上完課,筆記連翻都不翻,到真正上機的時候才會開始琢磨這個程序的意思,所以每一次的上機,我的速度都是比別人慢好多,而且尤其是筆記也沒有記得很全的時候(也沒有及時的補),上機時間都不夠我完成上次所講的程序的。所以會很后悔,沒有好好聽講,沒有好好記筆記、補筆記,造成了效率低下的局面。所以,凡事都要趁熱打鐵,才會盡快吸收。4、任何事情都不是一氣呵成,事先的計劃會是你事半功倍,而實踐是檢驗真理的唯一標(biāo)準(zhǔn),程序亦是如此。 這是

15、我這兩天在研究程序為什么這么寫的原因時,才開始領(lǐng)悟到的。這一點老師也有可能說過。我在拋開老師所編寫的五子棋的程序下,想通過自己的思考,把五子棋的思路捋順,所以開始自己畫結(jié)構(gòu)圖(真正開始有這種想法的是在我看到老師給我們展示的他的往屆同學(xué)做貪吃蛇的心得中,才發(fā)覺重要性)。一開始我花了一個很短的一段時間,畫出一個我自認為很滿意思路圖,但是當(dāng)我在重新用一些數(shù)去實驗,當(dāng)我再對比我寫的圖與老師編寫的程序有何不同的時候,就會發(fā)現(xiàn),有很多漏洞。比如,我想到了有下棋,但沒有想到下棋前要清屏,防止程序之前有任何痕跡,防止出錯;還有我想到了下棋之后要判斷贏棋,但是當(dāng)我到贏棋的那一步思路,我才想到,要判斷贏棋,就必須

16、有五個相同顏色的子連一起,那么在這之前我就要加上關(guān)于數(shù)組的賦值,來代表每一種顏色的棋子,從而構(gòu)造if條件語句,完成應(yīng)其目的等等。其實這些都不是我一開始做程序就想到的,只有當(dāng)按照計劃實施的過程中,才能驗證思路的正確性,才能知道自己的思路與邏輯缺陷在哪里,從而彌補不足。這也是將自己的邏輯思維進一步完善的過程,也是老師想讓我們得到的東西。 所以,通過這次的課程,我能體會到老師的良苦用心,也感謝老師一直不厭倦的一遍遍教我們,一遍遍告訴我們不愿意聽的忠言。我會將我從這里學(xué)到的態(tài)度,以及做事的思維方式,運用到其他事情上,哪怕是一點點,也會讓我的效率比以往更有提高。六、全部界面和代碼Form 1Privat

17、e Sub Command1_Click()If Trim(Text1.Text) = Or Trim(Text2.Text) = ThenMsgBox 請輸入玩家姓名!End IfIf Trim(Text1.Text) = Trim(Text2.Text) ThenMsgBox 不能輸入相同姓名!Exit SubEnd Ifb = Text1.Textw = Text2.TextForm2.ShowUnload MeEnd SubForm 2Dim m As IntegerDim n As IntegerDim i As IntegerDim j As IntegerPrivate Sub

18、Form_Load()Form2.Picture1.Scale (-8, 8)-(8, -8)End SubPrivate Sub 開始游戲_Click()Picture1.ClsFor i = -7 To 7Picture1.Line (-7, i)-(7, i), QBColor(0)Picture1.Line (i, -7)-(i, 7), QBColor(0)NextFor i = -11 To 11For j = -11 To 11a(i, j) = 0NextNextLabel1.Caption = 該黑方 + b + 走blackwhite = Truewuziqi = True

19、End SubPrivate Sub Picture1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)m = CInt(X)n = CInt(Y)If CInt(X) = -7 And CInt(X) = 7 And CInt(Y) = -7 And wuziqi = True ThenPicture1.FillStyle = 0If blackwhite = True And a(m, n) = 0 ThenPicture1.FillColor = QBColor(0)Picture1.Circ

20、le (m, n), 0.3, QBColor(0)a(m, n) = 1Label1.Caption = 該白方 + w + 走blackwhite = FalseEnd IfIf blackwhite = False And a(m, n) = 0 ThenPicture1.FillColor = QBColor(15)Picture1.Circle (m, n), 0.3, QBColor(15)a(m, n) = 2Label1.Caption = 該黑方 + b + 走blackwhite = TrueEnd IfFor i = m - 4 To mIf a(i, n) = 1 An

21、d a(i + 1, n) = 1 And a(i + 2, n) = 1 And a(i + 3, n) = 1 And a(i + 4, n) = 1 Then MsgBox 黑方勝利! wuziqi = False Exit Sub End IfIf a(i, n) = 2 And a(i + 1, n) = 2 And a(i + 2, n) = 2 And a(i + 3, n) = 2 And a(i + 4, n) = 2 Then MsgBox 白方勝利! wuziqi = False Exit Sub End If NextFor j = n - 4 To nIf a(m,

22、j) = 1 And a(m, j + 1) = 1 And a(m, j + 2) = 1 And a(m, j + 3) = 1 And a(m, j + 4) = 1 Then MsgBox 黑方勝利! wuziqi = False Exit Sub End IfIf a(m, j) = 2 And a(m, j + 1) = 2 And a(m, j + 2) = 2 And a(m, j + 3) = 2 And a(m, j + 4) = 2 Then MsgBox 白方勝利! wuziqi = False Exit Sub End If NextFor i = 4 To 0 St

23、ep -1If a(m - i, n + i) = 1 And a(m - i + 1, n + i - 1) = 1 And a(m - i + 2, n + i - 2) = 1 And a(m - i + 3, n + i - 3) = 1 And a(m - i + 4, n + i - 4) = 1 ThenMsgBox 黑方勝利!wuziqi = FalseExit SubEnd IfIf a(m - i, n + i) = 2 And a(m - i + 1, n + i - 1) = 2 And a(m - i + 2, n + i - 2) = 2 And a(m - i +

24、 3, n + i - 3) = 2 And a(m - i + 4, n + i - 4) = 2 ThenMsgBox 白方勝利!wuziqi = FalseExit SubEnd IfNextFor i = 4 To 0 Step -1If a(m + i, n + i) = 1 And a(m + i - 1, n + i - 1) = 1 And a(m + i - 2, n + i - 2) = 1 And a(m + i - 3, n + i - 3) = 1 And a(m + i - 4, n + i - 4) = 1 ThenMsgBox 黑方勝利!wuziqi = Fal

25、seExit SubEnd IfIf a(m + i, n + i) = 2 And a(m + i - 1, n + i - 1) = 2 And a(m + i - 2, n + i - 2) = 2 And a(m + i - 3, n + i - 3) = 2 And a(m + i - 4, n + i - 4) = 2 ThenMsgBox 白方勝利!wuziqi = FalseExit SubEnd IfNextEnd IfEnd SubPrivate Sub 保存棋局_Click()Form3.ShowEnd SubPrivate Sub 打開已保存棋局_Click()Form

26、4.ShowEnd SubPrivate Sub 悔棋_Click()If wuziqi = True Thena(m, n) = 0Call paintEnd IfEnd SubPrivate Sub 保存棋局文件_Click()CommonDialog1.Filter = *.wzq/*.wzqCommonDialog1.Action = 2Open CommonDialog1.FileName For Output As #1Print #1, wuziqiFor i = -7 To 7For j = -7 To 7If a(i, j) 0 ThenPrint #1, iPrint #1

27、, jPrint #1, a(i, j)Print #1, bPrint #1, wEnd IfNextNextClose #1End SubPrivate Sub 打開棋局文件_Click()For i = -7 To 7For j = -7 To 7a(i, j) = 0NextNextCommonDialog1.Filter = *.wzq/*.wzqCommonDialog1.Action = 1Open CommonDialog1.FileName For Input As #1Line Input #1, strwzqwuziqi = CBool(strwzq)Do While N

28、ot EOF(1)Line Input #1, striLine Input #1, strjLine Input #1, straLine Input #1, strbLine Input #1, strwa(Val(stri), Val(strj) = Val(stra)LoopClose #1Call paintEnd SubForm 3Dim recount As IntegerPrivate Sub Command1_Click()With Data1.DatabaseName = App.Path + 五子棋棋庫.mdb.RecordSource = 五子棋棋庫.RefreshIf

29、 Trim(Text1.Text) = ThenMsgBox 棋局名不能為空Exit SubEnd IfIf .Recordset.RecordCount 0 Then.Recordset.MoveLastrecount = .Recordset.RecordCount.Recordset.MoveFirstFor i = 1 To recountIf .Recordset.Fields(棋局名) = Text1.Text Then.Recordset.DeleteEnd IfIf Not .Recordset.EOF Then.Recordset.MoveNextEnd IfNextEnd

30、IfFor i = -7 To 7For j = -7 To 7If a(i, j) 0 Then.Recordset.AddNew.Recordset.Fields(棋局名) = Text1.Text.Recordset.Fields(執(zhí)黑棋者) = b.Recordset.Fields(執(zhí)白棋者) = w.Recordset.Fields(X坐標(biāo)) = i.Recordset.Fields(Y坐標(biāo)) = j.Recordset.Fields(該點狀態(tài)值) = a(i, j).Recordset.Fields(下棋狀態(tài)) = wuziqi.Recordset.UpdateEnd IfNextNextUnload MeEnd WithEnd SubForm 4Dim recount As IntegerPrivate Sub Form_Load()Combo1.Text = 請選擇所要打開的棋局strfile = With Data1.DatabaseName = App.Path +

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論