五子棋安卓開發(fā)文檔及開發(fā)工程見附件
[摘 要] 被業(yè)內(nèi)人士稱為繼短信之后的又一座“金礦”。4G的普及,手機(jī)顯示性能的提高、手機(jī)屏幕的擴(kuò)大和較高的分辨率,解決了傳統(tǒng)手機(jī)行業(yè)的很多弊端,手機(jī)休閑娛樂應(yīng)用將成為PC休閑娛樂之后又一重要業(yè)務(wù)增長(zhǎng)點(diǎn)、同時(shí)Android采用了全面觸摸屏,可以完成更多復(fù)雜的操作。Android雖然基于Java,但是其虛擬機(jī)是基于寄存器的,速度得到很大的提升,這為Android平臺(tái)上開發(fā)游戲提供了堅(jiān)強(qiáng)的后盾。
本文主要闡述以面向?qū)ο蟮某绦蜷_發(fā)語言eclipse為開發(fā)工具, 基于智能手機(jī)Android之上設(shè)計(jì)一個(gè)五子棋游戲。五子棋起源于中國(guó)古代的傳統(tǒng)黑白棋種之一,它不僅能增強(qiáng)思維能力 提高智力,而且富含哲理,有助于修身養(yǎng)性。本系統(tǒng)是本系統(tǒng)中設(shè)定了人機(jī)對(duì)戰(zhàn)和人人對(duì)戰(zhàn)兩種模式。人機(jī)對(duì)戰(zhàn)實(shí)現(xiàn)的是一些簡(jiǎn)單的算法,人人對(duì)戰(zhàn)只是進(jìn)行了輸贏方的判定。它與javame的五子棋設(shè)計(jì)有許多的不一樣,Android本來就是全觸摸的形式,而且操作非常簡(jiǎn)單。
目錄 引言 2 第一章 應(yīng)用背景與功能需求 3 1.1 應(yīng)用背景 3 1.2設(shè)計(jì)意義 3 1.3應(yīng)用需求分析 3 1.3.1 應(yīng)用的實(shí)用性 3 1.3.2 應(yīng)用需求 3 第二章 設(shè)計(jì)思路 4 第三章 布局設(shè)計(jì) 4 3.1 初始界面布局 4 3.2畫盤線 6 3.3按照棋盤模式構(gòu)建棋盤大小 7 3.4判斷該位置是否可下子 7 3.5交換棋手下棋 7 第四章 文件讀寫類的設(shè)計(jì)與實(shí)現(xiàn) 8 4.1獲勝機(jī)制 8 4.1.1 遍歷所有的五連子可能情況的權(quán)值。 8 4.1.2 初始化黑子白子上的每個(gè)權(quán)值上的連子數(shù) 9 4.1.3 檢查是否有人五連珠 10 4.1.4顯示結(jié)束信息 10 4.2人機(jī)對(duì)戰(zhàn) 11 4.3 輸贏判斷 11 第五章 其他相關(guān)工作 15 5.1 游戲主界面 15 5.2 游戲開始界面 15 第六章 系統(tǒng)測(cè)試與部署 16 6.1 硬件環(huán)境 16 6.2 軟件環(huán)境 16 6.3測(cè)試用例 16 第七章 總結(jié) 17 參考文獻(xiàn) 17 
引言 隨著社會(huì)的發(fā)展,目前全國(guó)的手機(jī)用戶數(shù)量已經(jīng)遠(yuǎn)超過了PC機(jī)的數(shù)量,而且手機(jī)的功能正在快速更新,其中智能手機(jī)所占的比例越來越大,特別是隨著5G技術(shù)發(fā)展時(shí)代的到來,移動(dòng)互聯(lián)網(wǎng)已是一個(gè)巨大的市場(chǎng),許多國(guó)際大公司以及國(guó)內(nèi)的大公司斗在搶占智能手機(jī)領(lǐng)域的市場(chǎng)份額。這期間,出現(xiàn)的智能手機(jī)可謂五花八門,種類繁多。 當(dāng)互聯(lián)網(wǎng)巨頭Google宣布依靠android系統(tǒng)進(jìn)軍手機(jī)操作系統(tǒng)領(lǐng)域之后,三年來Android一路高歌,快速的獲得眾多用戶和廠商的認(rèn)同。隨著Android手機(jī)終端的熱銷,Android也引起眾多手機(jī)應(yīng)用程序開發(fā)商的關(guān)注,Android的出現(xiàn),帶給了智能手機(jī)領(lǐng)域更多的機(jī)遇和挑戰(zhàn),由于Android基于Linux內(nèi)核且具有開源、免費(fèi)的特性,他迅速得到廣大愛好者以及許多廠商的支持,基于Android所開發(fā)的手機(jī)游戲擁有巨大潛力已成為行業(yè)共識(shí)。 中華民族是一個(gè)有著幾千年悠久歷史和璀璨文化的國(guó)家,而棋類娛樂卻早已突破了純游戲的范疇而成為中華傳統(tǒng)文化的一個(gè)分支。五子棋的棋文化源遠(yuǎn)流長(zhǎng),具有東方的神秘和西方的直觀,是中西文化的交流點(diǎn),是古今哲理的結(jié)晶。 現(xiàn)在人們壓力日益增大,需要?jiǎng)谝萁Y(jié)合才能獲得更高的工作效率,工作之余的娛樂對(duì)每一個(gè)人來說都是必不可少的。五子棋這種娛樂方式簡(jiǎn)單易學(xué)又具有深?yuàn)W的技巧,非常富有趣味性和消遣性。在經(jīng)過不斷發(fā)展后五子棋已經(jīng)成為棋盤娛樂的一個(gè)重要組成部分,他能夠增強(qiáng)思維能力、開發(fā)智力,是人們休閑娛樂的不錯(cuò)選擇 
第一章 應(yīng)用背景與功能需求 1.1 應(yīng)用背景 在我們的生活中有許多的游戲,但是游戲不同她也會(huì)給玩家?guī)聿煌母惺芎蜕罾砟。游戲是我們(nèi)粘I畹囊粋(gè)必不可少的娛樂項(xiàng)目,也帶動(dòng)了游戲相關(guān)產(chǎn)業(yè)市場(chǎng)的發(fā)展。游戲平臺(tái)是經(jīng)過從游戲機(jī)到電視游戲,然后從PC游戲,到手機(jī)游戲,中間經(jīng)歷了很多的技術(shù)的更新和變革。但隨著新技術(shù)的發(fā)簪和我們生活水平質(zhì)量的提高,手機(jī)開始普及,因?yàn)槭謾C(jī)是非常小巧便捷的,而且方便的特性成為我們?nèi)粘I钪斜貍渫ㄓ嵐ぞ摺6谑謾C(jī)平臺(tái)的游戲也就擁有的市場(chǎng)空間是巨大的的,也因隨著4G的開通和應(yīng)用,手機(jī)游戲必然會(huì)迎來新的一輪游戲熱潮。 1.2設(shè)計(jì)意義 本次設(shè)計(jì)是基于Android平臺(tái)開發(fā)的一個(gè)小型五子棋游戲程序。五子棋游戲的簡(jiǎn)單易學(xué),老少皆宜這些特性與智能手機(jī)的移動(dòng)方便,大范圍普及等特點(diǎn)結(jié)合起來,必定會(huì)大放光芒,廣受歡迎 1.3應(yīng)用需求分析 1.3.1 應(yīng)用的實(shí)用性 現(xiàn)在人們壓力日益增大,需要?jiǎng)谝萁Y(jié)合才能獲得更高的工作效率,工作之余的娛樂對(duì)每一個(gè)人來說都是必不可少的。五子棋這種娛樂方式簡(jiǎn)單易學(xué)又具有深?yuàn)W的技巧,非常富有趣味性和消遣性。在經(jīng)過不斷發(fā)展后五子棋已經(jīng)成為棋盤娛樂的一個(gè)重要組成部分,他能夠增強(qiáng)思維能力、開發(fā)智力,是人們休閑娛樂的不錯(cuò)選擇。 1.3.2 應(yīng)用需求 游戲說明:游戲開始時(shí),由黑子開局,將一枚棋子落在棋盤一坐標(biāo)上,然后由白棋落子,如此輪流下子,直到某一方首先在棋盤的豎、橫或斜三方向上的五子連成線,則該方該局獲勝。功能列表如下: (1)輸出棋盤; (2)提示用戶下子; (3)查看用戶是否出界; (4)系統(tǒng)自動(dòng)下子; (5)判斷游戲是否輸贏; (6)判斷是否進(jìn)入下一局; (7)退出游戲。
第二章 設(shè)計(jì)思路 在軟件設(shè)計(jì)分析的基礎(chǔ)上,為了方便玩家的使用,界面設(shè)計(jì)的簡(jiǎn)潔明了,布局合理。應(yīng)用設(shè)計(jì)內(nèi)容主要為五子棋人機(jī)對(duì)戰(zhàn),由人與計(jì)算機(jī)進(jìn)行相互下子,進(jìn)行合理的布局以及算法使計(jì)算機(jī)可以自動(dòng)判斷勝利條件,并于玩家進(jìn)行博弈。使玩家在閑暇時(shí)可以得到適當(dāng)?shù)姆潘伞?/p> 本應(yīng)用的設(shè)計(jì)目標(biāo)是建立于一個(gè)基于Android手機(jī)游戲軟件,基本可以滿足人們?cè)陂e暇時(shí)間的娛樂以及放松。 打開游戲,進(jìn)入初始主界面可選擇開始或退出,若點(diǎn)擊開始,進(jìn)行判斷電腦還是玩家先下子,判斷后進(jìn)行下子,一方下完進(jìn)行判斷輸贏,若有一方勝利則結(jié)束游戲,若沒有人獲勝,則返回下棋階段,流程圖如圖2-1所示: 
圖2-1 流程圖 第三章 布局設(shè)計(jì) 3.1 初始界面布局 采用線性布局作為初始化界面,插入背景圖片,按照上中下布局分布,插入游戲名稱,新游戲等文本框,編輯按鈕文本,實(shí)現(xiàn)代碼如下: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:background="@drawable/timg" android:orientation="vertical" android:padding="30dip" >
<LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_weight="0.17" android:gravity="center" android:orientation="vertical" >
<TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/main_title" android:textColor="@color/text_title" android:textSize="64sp" /> </LinearLayout>
<Button android:id="@+id/btn_newgame" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/btn_newgame" />
<Button android:id="@+id/btn_exit" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_weight="0.00" android:text="@string/btn_exit" />
</LinearLayout>
3.2畫盤線 本模塊是整個(gè)游戲系統(tǒng)的平臺(tái)性模塊,之后所有的功能都將依附該模塊來體現(xiàn),主要需要實(shí)現(xiàn)棋盤的繪制,本游戲系統(tǒng)選擇的是15*15的棋盤,與左邊和上邊的距離: 3推算其他線條計(jì)算方法。使用程序?qū)崿F(xiàn)以上計(jì)算方法,創(chuàng)建出15根橫線與整線,存進(jìn)集合中。實(shí)現(xiàn)代碼如下: for (int i=0; i <= maxX; i++) {//豎線 lines. add (new Line (xoffset+i*POINT_ SIZE, yoffset,xOffset+i*POINT SIZE, yoffset tmaxY*POINT SIZE)); for (int i=0; i <= maxY; i+) {//橫線 lines. add (new Line (x0ffset, yoffset+i*POINT SIZE,(maxX+1)*P0INT SIZE, yoffset+i*POINT SIZED); //在ondraw方法畫出所有棋盤線 for (Line line : lines){ canvas. drawLine(line. xStart, line. yStart, line. xStop, line. yStop,paint): 盤線圖如圖3-1所示:  圖3-1 盤線圖 3.3按照棋盤模式構(gòu)建棋盤大小 通過輸入相對(duì)棋盤的X和Y設(shè)置rect的值 使之變?yōu)樵揦和Y代表的屏幕區(qū)域值 private void getRect(int x, int y, Rect rect) { rect.set((int) (x * gridSize + getTopX()), (int) (y * gridSize + getTopY()), (int) (x * gridSize + gridSize + getTopX()), (int) (y * gridSize + gridSize + getTopY())); 3.4判斷該位置是否可下子 計(jì)算棋盤上某一方格上八個(gè)方向棋子的最大值,這八個(gè)方向分別是:左、右、上、下、左上、左下、右上、右下,如果可下子,則下子,如果超出棋盤范圍或該點(diǎn)已有棋子則不能下子。 public boolean chessExist(int i,int j){ if(this.arrMapShow[ i][j]==1 || this.arrMapShow[ i][j]==2) return true; return false; }
判斷該坐標(biāo)位置是否可下棋子。 public void readyplay(int x,int y){ if(badxy(x,y)) return; if (chessExist(x,y)) return; this.arrMapShow[x][y]=3; } 3.5交換棋手下棋 設(shè)置交換棋手的標(biāo)識(shí)符 public void setisOdd(boolean isodd){ if(isodd) this.isOdd=true; else this.isOdd=false; }
獲取是否交換棋手的標(biāo)識(shí)符。 public boolean getisOdd(){ return this.isOdd; }
第四章 文件讀寫類的設(shè)計(jì)與實(shí)現(xiàn) 4.1獲勝機(jī)制 4.1.1 遍歷所有的五連子可能情況的權(quán)值。 從橫向、豎向、右斜、左斜,四個(gè)方向判斷獲勝機(jī)制,如果四個(gè)方向其中一個(gè)方向有五子連珠的情況,則獲勝,如果沒有則繼續(xù)下子。i從0到14,循環(huán)15次,j從0到10循環(huán)11次,k從0到4循環(huán)5次,判斷橫縱坐標(biāo)的位置以及連珠數(shù)量。 (1)橫向 for(int i=0;i<15;i++) for(int j=0;j<11;j++){ for(int k=0;k<5;k++){ this.table[1][j+k][ i][icount] = true; this.table[0][j+k][ i][icount] = true; } icount++; } (2)豎向 for(int i=0;i<15;i++) for(int j=0;j<11;j++){ for(int k=0;k<5;k++){ this.table[1][ i][j+k][icount] = true; this.table[0][ i][j+k][icount] = true; } icount++; } (3)右斜 for(int i=0;i<11;i++) for(int j=0;j<11;j++){ for(int k=0;k<5;k++){ this.table[1][j+k][i+k][icount] = true; this.table[0][j+k][i+k][icount] = true; } icount++; } (4)左斜 for(int i=0;i<11;i++) for(int j=14;j>=4;j--){ for(int k=0;k<5;k++){ this.table[1][j-k][i+k][icount] = true; this.table[0][j-k][i+k][icount] = true; } icount++;
4.1.2 初始化黑子白子上的每個(gè)權(quán)值上的連子數(shù) 判斷有無一方勝利,若沒有則初始化棋盤,重新下棋子。 for(int i=0;i<=1;i++) for(int j=0;j<572;j++) this.combo[ i][j] = 0;
if(!IndexActivity.playerFirst){ isUsersTurn = false; Coordinate c = ai.comTurn(null); setPieceIfValid(c.x,c.y,1); } IndexActivity.playerFirst = !IndexActivity.playerFirst; }
public int[][] getGridBoard(){ return gridBoard; } public void setPieceIfValid(int selectX, int selectY,int id) { if(gridBoard[selectX][selectY] != 0 || haveWinner()){ return; } if(isUsersTurn && id==2){ setPiece(selectX,selectY,id); nextTurn(); }else if(!isUsersTurn && id==1){ setPiece(selectX,selectY,id); nextTurn(); } }
4.1.3 檢查是否有人五連珠 通過語句從572種五連珠可能性中,檢查該連珠情況是否符合其中一種,如果有則獲勝,如果沒有,則交換對(duì)手下棋。 private boolean haveWinner(){ for(int i=0;i<2;i++){ for(int j=0;j<572;j++){ if(combo[ i][j] == 5){ showWinner(i); return true;
4.1.4顯示結(jié)束信息 如電腦先連成五連珠,則輸出玩家失敗,如玩家先連成五連珠,則輸出玩家獲勝。
- <font style="font-size: 12pt"> private void showWinner(int id){
- Builder builder = new AlertDialog.Builder(this);
- String title = "";
- String msg = "";
- switch(id){
- case 0://電腦贏了,玩家輸了
- title = this.getResources().getString(R.string.title_lose);
- msg = this.getResources().getString(R.string.text_lose);
- break;
- case 1://玩家贏了
- title = this.getResources().getString(R.string.title_victor);
- msg = this.getResources().getString(R.string.text_victor);
- break;
- }
- builder.setTitle(title);
- builder.setMessage(msg);
- builder.setPositiveButton("back", new DialogInterface.OnClickListener() {
-
- @Override
- public void onClick(DialogInterface dialog, int which) {
- BackgammonActivity.this.finish();//退出此窗口
- }</font>
復(fù)制代碼
4.2人機(jī)對(duì)戰(zhàn) 輪到電腦下棋時(shí),電腦先取出一個(gè)空白棋位(一個(gè)Point對(duì)象),以此棋位為起點(diǎn)計(jì)算四個(gè)方向能形成多少部連續(xù)的棋子,此為第一次計(jì)算。 FirstAnalysisResult{ Point point; //棋位 int count; //連續(xù)數(shù) int aliceState; //狀態(tài) int direction; //方向 因?yàn)榈谝淮斡?jì)算的結(jié)果對(duì)一個(gè)棋位都會(huì)形成四個(gè)結(jié)果(每個(gè)方向一個(gè)結(jié)果),這一步將這些結(jié)果匯總到一個(gè)類對(duì)象中。 SecondAnalysisResult implements Comparable<SecondAnalysisResult>{ Point point; //棋位 int alive4 = 0; //活4 int alive3 = 0; //活3數(shù)量 int halfAlive4 = 0; //半活4,一頭封 int halfAlive3 = 0; //半活3,一頭封 Int alive2 = 0; //活2數(shù)量 對(duì)第二次計(jì)算結(jié)果進(jìn)行排序,將結(jié)果分成三個(gè)等級(jí),每個(gè)等級(jí)有一個(gè)集合裝載,有子類在排序結(jié)果挑選想要下的棋子。為了性能在第一次計(jì)算前,必須確定一個(gè)較小的計(jì)算范圍,不能全部都算。另外,在每次找到必殺棋時(shí),直接返回,不在計(jì)算。 4.3 輸贏判斷 從左、右、上、下、左上、右上、右下、左下,八個(gè)方向判斷是否有五子連珠的情況。i從1到5循環(huán)5次,判斷是否有連珠情況。 (1)判斷右邊是否有五子連珠的情況,如果有,則獲勝。 for(int i=1;i<6;i++){ x_temp1+=1; if(x_temp1>this.width) break; if(this.arrMapShow[x_temp1][y_temp1]==arrvalue) num++; else break; } (2)判斷左邊是否有五子連珠的情況,如果有,則獲勝。 x_temp1=x_temp; for(int i=1;i<6;i++){ x_temp1-=1; if(x_temp1<0) break; if(this.arrMapShow[x_temp1][y_temp1]==arrvalue) num++; else break; } if(num==5) return true; (3)判斷上方是否有五子連珠的情況,如果有,則獲勝。 x_temp1=x_temp; y_temp1=y_temp; num=1; for(int i=1;i<6;i++){ y_temp1-=1; if(y_temp1<0) break; if(this.arrMapShow[x_temp1][y_temp1]==arrvalue) num++; else break; } (4)判斷下方是否有五子連珠的情況,如果有,則獲勝。 y_temp1=y_temp; for(int i=1;i<6;i++){ y_temp1+=1; if(y_temp1>this.height) break; if(this.arrMapShow[x_temp1][y_temp1]==arrvalue) num++; else break; } if(num==5) return true;
(5)判斷左上是否有五子連珠的情況,如果有,則獲勝。 x_temp1=x_temp; y_temp1=y_temp; num=1; for(int i=1;i<6;i++){ x_temp1-=1; y_temp1-=1; if(y_temp1<0 || x_temp1<0) break; if(this.arrMapShow[x_temp1][y_temp1]==arrvalue) num++; else break;
(6)判斷右下是否有五子連珠的情況,如果有,則獲勝。 x_temp1=x_temp; y_temp1=y_temp; for(int i=1;i<6;i++){ x_temp1+=1; y_temp1+=1; if(y_temp1>this.height || x_temp1>this.width) break; if(this.arrMapShow[x_temp1][y_temp1]==arrvalue) num++; else break; } if(num==5) return true;
(7)判斷右上是否有五子連珠的情況,如果有,則獲勝。 x_temp1=x_temp; y_temp1=y_temp; num=1; for(int i=1;i<6;i++){ x_temp1+=1; y_temp1-=1; if(y_temp1<0 || x_temp1>this.width) break; if(this.arrMapShow[x_temp1][y_temp1]==arrvalue) num++; else break; } (8)判斷左下是否有五子連珠的情況,如果有,則獲勝。 x_temp1=x_temp; y_temp1=y_temp; for(int i=1;i<6;i++){ x_temp1-=1; y_temp1+=1; if(y_temp1>this.height || x_temp1<0) break; if(this.arrMapShow[x_temp1][y_temp1]==arrvalue) num++; else break; } if(num==5) return true; return false;
第五章 其他相關(guān)工作 5.1 游戲主界面 游戲主界面如圖5-1所示。 圖5-1 游戲主界面圖 5-2 開局界面 5.2 游戲開始界面 五子棋的開局界面如圖5-2所示: 第六章 系統(tǒng)測(cè)試與部署 6.1 硬件環(huán)境 電腦、Android手機(jī)、數(shù)據(jù)線 6.2 軟件環(huán)境 Windows操作系統(tǒng)、Android手機(jī)系統(tǒng)、Eclepse 6.3測(cè)試用例 系統(tǒng)測(cè)試,即對(duì)軟件進(jìn)行全面統(tǒng)一的測(cè)試,包括對(duì)性能、娛樂性以及對(duì)運(yùn)行環(huán)境的調(diào)試。 測(cè)試游戲進(jìn)行界面(玩家為黑棋),如圖6-1所示: 圖6-1 游戲進(jìn)行界面 測(cè)試輸贏界面,如圖6-2 勝利界面,圖6-3失敗界面: 
圖6-2 勝利界面 圖6-3 失敗界面
第七章 總結(jié) 本文實(shí)現(xiàn)了五子棋游戲中的人機(jī)對(duì)戰(zhàn)模式。在這次的實(shí)驗(yàn)中我遇到了很多困難,在克服這些困難的過程中學(xué)到了很多的知識(shí),讓我對(duì)Android有了更深層次的了解。 五子棋游戲邏輯十分簡(jiǎn)單,可以明顯的分為四個(gè)部分:白棋下、判斷白棋是否獲勝、黑棋下、判斷黑棋是否獲勝;在判斷獲勝的兩個(gè)部分可以使用相同的方法,所以總結(jié)起來我們只需完成白棋下、黑棋下、判斷獲勝三個(gè)部分。所以我在選擇實(shí)現(xiàn)順序的時(shí)候選擇實(shí)現(xiàn)人機(jī)對(duì)戰(zhàn)的模式來進(jìn)行設(shè)計(jì)。 我個(gè)人認(rèn)為人機(jī)對(duì)戰(zhàn)的實(shí)現(xiàn)相對(duì)于人人對(duì)戰(zhàn)模式更加復(fù)雜,人機(jī)對(duì)戰(zhàn)模式的實(shí)現(xiàn)相對(duì)于人人模式增加了游戲AI,而且僅僅是增加了游戲AI,所以在這個(gè)實(shí)現(xiàn)中對(duì)游戲AI的實(shí)現(xiàn)成為了重點(diǎn)。通過在網(wǎng)上的查找和總結(jié),知道最通用的實(shí)現(xiàn)五子棋游戲AI的算法就是:根據(jù)五子棋游戲規(guī)則指定在不同情況下每個(gè)位置的權(quán)值,然后在開始下棋時(shí)在地圖上計(jì)算權(quán)值最大的位置即可。經(jīng)過對(duì)五子棋游戲的簡(jiǎn)單研究,之后又在網(wǎng)上查找了相關(guān)算法的實(shí)現(xiàn)資料,自己實(shí)現(xiàn)了一個(gè)簡(jiǎn)單的五子棋算法。雖然不能有很高的AI不過已經(jīng)可以達(dá)到初級(jí)玩家的水平。
附件介紹
完整的Word格式文檔51黑下載地址:
五子棋.docx
(560.85 KB, 下載次數(shù): 47)
2019-1-11 15:56 上傳
點(diǎn)擊文件名下載附件
文檔
源碼:
FiveChess.7z
(1.14 MB, 下載次數(shù): 67)
2019-1-11 16:44 上傳
點(diǎn)擊文件名下載附件
開發(fā)工程
|