freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

基于java的局域網(wǎng)五子棋和聊天設(shè)計(jì)與實(shí)現(xiàn)(編輯修改稿)

2025-06-12 18:28 本頁面
 

【文章內(nèi)容簡(jiǎn)介】 JAVA程序的美感不足給彌補(bǔ)。但是后面使用的時(shí)候圖片不好定位,對(duì)后面算法實(shí)現(xiàn)很麻煩。 布局,開始考慮的時(shí)候,想著是服務(wù)器,一個(gè)界面,客戶端一個(gè)界面。當(dāng)下棋的實(shí)現(xiàn)先啟動(dòng)服務(wù)器,然后, 2 個(gè)玩家在啟動(dòng) 2 個(gè)客戶端。通過服務(wù)端了進(jìn)行交互。但是后開考慮到,服務(wù)器完全沒必要要界面,在后臺(tái)運(yùn)行就行。把服務(wù)器啟動(dòng)通過界面按鈕控制啟動(dòng)就行。所以就只做一個(gè)界面就可以實(shí)現(xiàn)。 算法的設(shè)計(jì)思路 五子棋游戲的算法主要就是判斷輸贏了。 五子棋,也叫 “五子連珠 ”顧名思義輸贏就是要五子相連。這樣在棋盤上就有很多種情況。如下圖 31: 圖 31 贏棋的四種情況 畢業(yè)設(shè)計(jì)(論文) 10 在這個(gè) 15*15 標(biāo)準(zhǔn)的五子棋盤中五連有四種情況 “橫 ”, “豎 ”, “左斜( /) ”, “右斜( \) ”。只要出現(xiàn)上面四種情況五子或五子以上相連并且顏色一樣就可判斷贏了。 開始設(shè)計(jì)的時(shí)候設(shè)想:每下一個(gè)棋子,則遍歷整個(gè)棋盤的棋子,看是否有符合勝利條件的黑白棋,這樣算法的簡(jiǎn)便了,但是效率確太低了。后面優(yōu)化了:每下一個(gè)棋子只要遍歷這個(gè)棋子的 “上 ” “下 ” “左 ” “右 ” “左上斜 ” “右上斜 ”“左下斜 ” “右下斜 ”這八個(gè)方向的棋子五個(gè)棋子是否有贏的情況即可。這樣可以優(yōu)化算法,提高效率。 程序的設(shè)計(jì)流程 在 JAVA 編程思想中有句很有深度的話 “萬物皆對(duì)象 ”, JAVA 是一門面向?qū)ο蟮恼Z言。所以 JAVA 的程序也是要把現(xiàn)實(shí)的實(shí)物的抽象為對(duì)象。 本程序五子游戲用的基于 JAVA TCP/IP 的 Scoket 機(jī)制。這機(jī)制的客戶端和服務(wù)器有三種狀態(tài):服務(wù)器啟動(dòng)等待連接 (WAITING),服務(wù)器連接 (CONNECT),未連接( UN_START)。后面的操作都是在這三種狀態(tài)下進(jìn)行運(yùn)行的。所以把這三個(gè)狀態(tài)設(shè)置成三種標(biāo)志位,用一個(gè)接口類把這三種狀態(tài)存儲(chǔ)。 五子棋游戲應(yīng)該有 2 個(gè)玩家,棋盤,棋子,還有交流的對(duì)話框。我把 其都抽象為對(duì)象。 在 Scoket 機(jī)制中 2 個(gè)玩家對(duì)應(yīng)的 2 中狀態(tài),一個(gè)玩家是服務(wù)器( ServleScokeet)另一個(gè)玩家肯定是客戶端。通過按鈕控制讓其玩家可以自己選擇為為客戶端還是服務(wù)器端 。 把棋盤封裝成一個(gè)類,棋盤的屬性和方法比如放入其中。棋盤屬性:行數(shù),列數(shù),格子大小,棋子分布等。棋盤的動(dòng)作方法:畫棋盤,加入棋子,清理清盤,判斷輸贏,判斷要下棋位置棋子是否存在,設(shè)置棋盤上鼠標(biāo)樣式等。 把棋子也封裝成類。棋子屬性:顏色,大小,坐標(biāo)。 玩家發(fā)送的消息也封裝成一個(gè)類。消息的屬性:發(fā)消息的用戶名,發(fā)消息時(shí)間,發(fā)消息內(nèi)容。 最后在一個(gè)主類里對(duì)這些對(duì)象進(jìn)行操作。 系統(tǒng)設(shè)計(jì)實(shí)現(xiàn) 程序一共分了五個(gè)類: 類主要是封裝了一些棋子屬性方法。 如圖 32 類是封裝了一些聊天信息的屬性和方法。 類是棋盤主要是一些棋盤的屬性和操作。 畢業(yè)設(shè)計(jì)(論文) 11 類是包含 Main()方法類,是整個(gè)程序主類對(duì)全局進(jìn)行操作。 類是保存了服務(wù)器和客戶端的三種狀態(tài)。 這五個(gè)類圖如下圖 32 至圖 34: 圖 32 Chess 類圖 圖 33 Message 類圖 畢業(yè)設(shè)計(jì)(論文) 12 圖 34 GoBangBoard 類圖 圖 34 GoBangMain 類圖 類實(shí)現(xiàn) 畢業(yè)設(shè)計(jì)(論文) 13 這個(gè)類繼承了 Jpanel容器類,為后面的 GobangMain 類添加提供方便。在這個(gè)類始化的時(shí)候,通過構(gòu)造器傳入 GobangMain 類型的一個(gè)對(duì)象實(shí)現(xiàn) GobangMain 主類與這個(gè)類的連接,在這個(gè)類里面也能獲取 GobangMain 的方法和屬性。 addMouseMotionListener(new MouseMotionAdapter() { public void mouseMoved(MouseEvent e) { if (!() || !()) {......} } })。 addMouseListener(new MouseAdapter() { public void mouseClicked(MouseEvent e) { .......... if (x 0 || x GRID_ROWS || y 0 || y GRID_COLS) return。 if (exists(x, y)) return。 Color c = ()。 Chess chess = new Chess(x, y, , c)。 ...... })。 在鼠標(biāo)移動(dòng)監(jiān)聽器中設(shè)置:當(dāng)游戲 已經(jīng) 連接 并且 到自己下棋的時(shí)候在棋盤界面鼠標(biāo)會(huì)變成 “小手形 ”其他時(shí)候鼠標(biāo)會(huì)是系統(tǒng)默認(rèn)樣式。在鼠標(biāo)點(diǎn)擊監(jiān)聽器中設(shè)置了當(dāng)輪到自己下棋,點(diǎn)擊棋盤內(nèi)不存在棋子的棋點(diǎn)將會(huì)出現(xiàn)一個(gè)棋子。 這個(gè)類包含了棋子判斷輸贏方法。 private boolean isWin(Chess chess) 畢業(yè)設(shè)計(jì)(論文) 14 { int x = ()。 int y = ()。 int low_x = (x 4, 0)。 int low_y = (y 4, 0)。 loop1: for (int i = low_x。 i = x。 i++) { boolean result = true。 for (int j = i。 j i + 5。 j++) { if (j GRID_ROWS) continue loop1。 if (getChess(j, (), ()) == null) { result = false。 } } if (result) return true。 } loop2: for (int i = low_y。 i = y。 i++) { ...... } loop3: for (int i = low_x, j = low_y。 i = x amp。amp。 j = y。 i++, j++) 畢業(yè)設(shè)計(jì)(論文) 15 { ....... } loop4: for (int i = x + 4, j = y 4。 i = x amp。amp。 j = y。 i, j++) { ..... } return false。 } 棋盤每有棋子落下,都會(huì)調(diào)用判斷輸贏方法,傳遞一棋子對(duì)象 chess 下來。通過棋子自定義方法的 (), ()獲取棋子的坐標(biāo)索引 x,y。 在分別取得 x4 與 0 最大值 low_x 和 .y4 與 0 的最大值 low_y。這樣能避免出現(xiàn)負(fù)數(shù)索引。 當(dāng)在 loop1:x坐標(biāo)索引 的循環(huán)的時(shí)候是判斷行是否在橫向判斷新落下棋子的橫向左右各 4 個(gè)棋子是否有橫向 5 連相同顏色的棋子,如 果有則 return true,結(jié)束方法,否則就繼續(xù)程序 。 getChess(j, (), ())傳遞一個(gè)棋子的 X,Y 坐標(biāo)索引和一種棋子顏色查看這個(gè)棋子是否存在,顏色和所落子顏色相同與否,如果這個(gè)棋子存在并且 顏色相同的放回一個(gè)對(duì)象 chess,否則放回 null(空)。 loop2,loop3,loop4 和判斷 loop1 原理相似分別是判斷列,右斜( \) ,和左斜( /)的循環(huán)。 不同的是 loop2 的是 y索引變化; loop3 是 x,y索引都遞增變化; loop4 是 x索引遞 減,y索引遞增 變化。 類的實(shí)現(xiàn) 這是一個(gè)主要的類, main 方法程序入口在這個(gè)類。 Public class GoBanMain extends JFrame 它繼承了 JFrame 這個(gè)頂級(jí)窗口類。 public static void main(String[] args) { GoBangMain frame = new GoBangMain()。 畢業(yè)設(shè)計(jì)(論文) 16 (frame)。 (false)。 (true)。 } public void windowCenter(JFrame f) { Dimension screenSize = ().getScreenSize()。 Dimension frameSize = () } (( ) / 2, ( ) / 2)。 } 在這個(gè) main 方法里,調(diào)用構(gòu)造器新建了一個(gè)對(duì)象 frame,然后調(diào)用自定義方法(frame)設(shè)置窗口居中,最后調(diào)用系統(tǒng)包裝好方法設(shè)置窗口不可以編輯和可見。布局和其他操作都在構(gòu)造器 public GoBangMain()初始化好了。 在 public void windowCenter(JFrame f)中通過 Dimension screenSize = ().getScreenSize()獲取系統(tǒng)屏幕大小 screenSize 然 后在獲取窗口 frame 的大小,假如窗口的高大于屏幕高度則讓窗口高度等于屏幕高度,窗口長度也一樣假如窗口寬度大于屏幕寬度則讓窗口寬度等于屏幕寬度。窗口最后設(shè)置在屏幕位置 setLocation, 窗口位于屏幕寬度減去窗口寬度后的二分之一的 X坐標(biāo),及屏幕高度減去窗口高度后二分之一的 Y 坐標(biāo)。因此這個(gè)方法作用設(shè)置窗口居中。 Contain c = getContentPanel()。 (toolbar, )。 (mainPanel, )。 (statusBar, )。 (chatPanel, )。 窗口 frame 布局 ,在窗口里首先獲取的 frame 的容器 c = getContentPanel()在容器中設(shè)置布局為 BorderLayout 方向布局。在北方放置工具容器 Toolbar,在南方放置顯一些提示狀態(tài)容器 StatusBar,在右邊放置聊天容器 CharPanel,在中間放置棋盤容器。 界面布局圖如圖 32: 畢業(yè)設(shè)計(jì)(論文) 17 圖 32 界面布局 在 Toolbar 中采用的是流水式布局,這容器放置了 serverButton(建立服務(wù)器 ),connbutton(連接服務(wù)器) ,breakButton(結(jié)束 游戲 ), exitButton(退出游戲 )和 author(關(guān)于作者)按鈕。 在 CharPanel中采用了還是 Borderlayout 布局,在其中放置一個(gè)文本域 textShow 在Center 和另外個(gè)面板容器 sendPanel在 South 實(shí)現(xiàn)上下樣式 ,在 sendPanel中也同樣類似于CharPanel布局,放置了一個(gè)文本域 textSend 在 Center,一個(gè)面板 userPanel 在 South。在userPanel中采取的是 Flowlayout流水式布局,加入了 “用戶名: ”標(biāo)簽,和一個(gè)單行文本及發(fā)送按鈕。 ButtonActionListener l = new ButtonActionListener()。 SendAction sendAct = new SendAction()。 (l)。 (l)。 (l)。 (l)。 (l)。 (sendAct)。 上面是個(gè)個(gè)按鈕添加的監(jiān)聽事件。在最上面的一排按鈕添加的是同一個(gè)自定義監(jiān)聽器 ButtonActionListener 對(duì)象 l。 class ButtonActionListener implements ActionListener {public void actionPerformed(ActionEvent e) {Object src = ()。 if (src == serverButton) {Thread t = new Thread(new Runnable() {private void runAsServer() throws IOException { (服務(wù)器玩家 )。 ss = new ServerSocket(12345)。 setServer(true)。 畢業(yè)設(shè)計(jì)(論文) 18 setCurrentStatus()。 socket = ()。 getStream()。 setTitle( 五子棋 您正在跟來自 + ().toString()+ 的玩家下棋! )。 setCurrentStatus()。 setReady(true)。 processConnection()。 } 在 ButtonActionListener 中通過事件 src = ()獲取事件源,然后比較事件源比較按鈕對(duì)象知道是那個(gè)按鈕按下。在按鈕按下做出相應(yīng)處理。 按鈕圖如下圖: 圖 33 按鈕圖 當(dāng) “建立服務(wù)器 ”按鈕按下的時(shí)候,則新建一個(gè)匿
點(diǎn)擊復(fù)制文檔內(nèi)容
高考資料相關(guān)推薦
文庫吧 www.dybbs8.com
備案圖片鄂ICP備17016276號(hào)-1