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

正文內(nèi)容

基于android的五子棋游戲的設(shè)計(jì)本科畢業(yè)論文-資料下載頁

2025-06-28 01:47本頁面
  

【正文】 rvice 是沒有可視化的用戶界面,但是 Service 的特點(diǎn)是能長時(shí)間在后臺運(yùn)行的。所以,也可以這樣去理解,Service 是具有一段較長生命周期而且沒有用戶界面的程序。比如說一個(gè)服務(wù)可能要播放背景音樂但是用戶做可以去做其他一些事情,或者它也可能從網(wǎng)絡(luò)獲取數(shù)據(jù),也或者是計(jì)算一些東西并會提供一個(gè)結(jié)果給需要的活動(activities) 。每一個(gè)服務(wù)都繼承自 Service 基類。每一個(gè)服務(wù)類都惠子在 中有自己相應(yīng)的service聲明。服務(wù)必須可以通過 C()或者 ()啟動因?yàn)?service 是有兩個(gè)不同的生命周期的。一個(gè)非常典型的例子是媒體播放器播放一個(gè)播放列表中的歌曲文件。該播放器應(yīng)用程序?qū)⒖赡苡幸粋€(gè)或者是多個(gè)活動(activities ) ,可以允許用戶選擇要聽的歌曲和開始播放。然而,音樂播放本身就不會被一個(gè)活動處理,因?yàn)橛脩羰窍M3忠魳芬恢辈シ诺?,?dāng)用戶離開播放器的時(shí)候而去做其他事情。為了保持音樂能夠繼續(xù)播放,媒體播放器活動可以啟動一個(gè)服務(wù)運(yùn)行在后臺的運(yùn)行。系統(tǒng)將會保持音樂播放服務(wù)運(yùn)行,甚至媒體播放器離開屏幕的時(shí)候。可以連接到(綁定到)一個(gè)持續(xù)運(yùn)行的服務(wù)(并啟動服務(wù),如果它尚未運(yùn)行) 。連接之后,你可以通過服務(wù)暴露的接口與服務(wù)交流。對于音樂服務(wù),這個(gè)接口可以允許用戶暫停、倒帶、停止和重新播放。像活動(activities)和其他組件一樣,服務(wù)( services)運(yùn)行在應(yīng)用程序進(jìn)程中的主線程中。因此,他們將不會阻止其他組件或用戶界面,他們往往產(chǎn)生其他一些耗時(shí)的任務(wù)(如音樂播放) 。 廣播接收者(Broadcast receivers) 一個(gè)廣播接收者是這樣一個(gè)組件,它不做什么事,僅是接受廣播公告并作出相應(yīng)的反應(yīng)。許多廣播源自于系統(tǒng)代碼,例如公告時(shí)區(qū)的改變、電池電量低、已采取圖片、用戶改變了語言偏好。應(yīng)用程序也可以發(fā)起廣播,例如為了他其他程序知道某些數(shù)據(jù)已經(jīng)下載到設(shè)備且他們可以使用這些數(shù)據(jù)。一個(gè)應(yīng)用程序可以有任意數(shù)量的廣播接收者去反應(yīng)任何它認(rèn)為重要的公告。所有的接受者繼承自BroadcastReceiver 基類。BroadcastReceiver 類:是接受 sendBroadcast()發(fā)送的意圖(intents )的基類。可以用 erReceiver()動態(tài)地注冊這個(gè)類的實(shí)例,或者通過 中receiver標(biāo)簽靜態(tài)發(fā)布。注意:如果你在 () 注冊一個(gè)接受者,你應(yīng)該在 ()注銷它。因?yàn)楫?dāng)暫停時(shí)你不會收到意圖,注銷它將削減不必要的系統(tǒng)開銷。不要在 ()中注銷它,因?yàn)樗鼘⒉粫徽{(diào)用,如果用戶移動到先前的堆棧。有兩種主要的可接受廣播類型: 22 正常廣播(由 發(fā)送)是完全異步的。所有的廣播接收者以無序方式運(yùn)行,往往在同一時(shí)間接收。這樣效率較高,但是意味著接受者不能使用結(jié)果或終止廣播數(shù)據(jù)傳播。 有序廣播(由 發(fā)送)一次傳遞給一個(gè)接收者。由于每個(gè)接收者依次執(zhí)行,因此它可以傳播到下一個(gè)接收器,也可以完全終止傳播以便他不會傳遞給其他接收者。接收者的運(yùn)行順序可由匹配的意圖過濾器(intentfilter)的 android:priority 屬性控制。 廣播接收者不顯示一個(gè)用戶界面。然而,它們啟動一個(gè)活動去響應(yīng)收到的信息,或者他們可能使用 NotificationManager 去通知用戶。通知可以使用多種方式獲得用戶的注意——閃爍的背光、振動設(shè)備、播放聲音等等。典型的是放在一個(gè)持久的圖標(biāo)在狀態(tài)欄,用戶可以打開獲取信息。 內(nèi)容提供者(Content providers)內(nèi)容提供者(content provider)使一個(gè)應(yīng)用程序的指定數(shù)據(jù)集提供給其他應(yīng)用程序。這些數(shù)據(jù)可以存儲在文件系統(tǒng)中、在一個(gè) SQLite 數(shù)據(jù)庫、或以任何其他合理的方式。內(nèi)容提供者繼承自 ContentProvider 基類并實(shí)現(xiàn)了一個(gè)標(biāo)準(zhǔn)的方法集,使得其他應(yīng)用程序可以檢索和存儲數(shù)據(jù)。然而,應(yīng)用程序并不直接調(diào)用這些方法。相反,替代的是它們使用一個(gè) ContentResolver 對象并調(diào)用它的方法。ContentResolver 能與任何內(nèi)容提供者通信,它與提供者合作來管理參與進(jìn)來的進(jìn)程間的通信。內(nèi)容提供者是 Android 應(yīng)用程序的主要組成部分之一,提供內(nèi)容給應(yīng)用程序。他們封裝數(shù)據(jù)且通過單個(gè) ContentResolver 接口提供給應(yīng)用程序。只有需要在多個(gè)應(yīng)用程序間共享數(shù)據(jù)是才需要內(nèi)容提供者。例如,通訊錄數(shù)據(jù)被多個(gè)應(yīng)用程序使用,且必須存儲在一個(gè)內(nèi)容提供者中。如果你不需要在多個(gè)應(yīng)用程序間共享數(shù)據(jù),你可以直接使用 SQLiteDataBase當(dāng) ContentResolver 發(fā)出一個(gè)請求時(shí),系統(tǒng)檢查給定的 URI 的權(quán)限并傳遞請求給內(nèi)容提供者注冊。內(nèi)容提供者能理解 URI 想要的東西。 UriMatcher 類用于幫組解析 URIs。需要實(shí)現(xiàn)的方法主要如下:query(Uri, String[], String, String[], String) 返回?cái)?shù)據(jù)給調(diào)用者 insert(Uri, ContentValues) 插入數(shù)據(jù)到內(nèi)容提供者 update(Uri, ContentValues, String, String[]) 更新內(nèi)容提供者已存在的數(shù)據(jù) delete(Uri, String, String[]) 從內(nèi)容提供者中刪除數(shù)據(jù) getType(Uri) 返回內(nèi)容提供者中的 MIME 類型數(shù)據(jù) 更多的關(guān)于 ContentResolver 信息,請查看相關(guān)文檔。每當(dāng)有一個(gè)應(yīng)該由特定組件處理的請求,Android 可以確保該組件的應(yīng)用程序正在運(yùn)行,如果沒有就啟動它,而且一個(gè)適當(dāng)?shù)慕M件實(shí)例可用,如果沒有就創(chuàng)建。 23 5 程序的設(shè)計(jì)與實(shí)現(xiàn) 本章節(jié)主要介紹一下此論文中用到了的 Android 的布局文件,可視化控件以及它們的具體實(shí)現(xiàn)。 程序的算法研究: 本游戲是以五子棋為背景的游戲,游戲的畫面按照 9*9 的畫面進(jìn)行匯總,內(nèi)容的算法則是根據(jù) JAVA 的基本循環(huán)語句進(jìn)行定義,棋盤的繪制尤為重要,它是整個(gè)游戲的關(guān)鍵,因?yàn)樗钦麄€(gè)游戲的主界面,利用 surface 可得到 9*9 的游戲棋盤坐標(biāo)畫面。 在游戲中,落子定義也十分重要,因?yàn)槲遄悠逵螒蛑?,只要黑白任意一方在任何方向?5 個(gè)連續(xù)落子連成一線,便獲得了勝利。算法便是在坐標(biāo)定義上進(jìn)行++的方式。 棋盤布局的數(shù)據(jù)結(jié)構(gòu) 首先要先獲得整個(gè)棋盤的高度,以及其他一些寬度的參數(shù),因?yàn)槔玫氖?surface 的重繪,所以對此類棋盤高度寬度進(jìn)行定義,部分代碼如下:public void setGameState(int newState) {mGameState = newState。switch (mGameState) {case GS_GAME: mGameMap = new int[CHESS_HEIGHT][CHESS_WIDTH]。 mMapHeightLengh = 。 mMapWidthLengh = mGameMap[0].length。 mCampTurn = CAMP_HERO。 break。 關(guān)于盤面情況的表示,首先得到屏幕的大小,然后根據(jù)所畫棋子的大小來確定下一條棋盤的畫線。 整個(gè)棋盤是利用 superface 進(jìn)行重繪, superface 是安卓系統(tǒng)繪制列陣最普通的一種 在 android 中,對 view 及其子類,都是畫在 surface 上的。每個(gè) window 對應(yīng)一個(gè) surface,各 surface 對象通過 surfaceflinger 合成到 framebuffer,每個(gè) surface 都是雙緩沖,它有一個(gè) back buffer 和一個(gè) front buffer。back buffer 就是畫畫的地方,front buffer 是用來合成。 24 surface 創(chuàng)建 Canvas 對象(用來管理 surface 繪圖操作) , Canvas 對應(yīng) bitmap(存儲 surface 內(nèi)容)。當(dāng)調(diào)用 unlockCanvas()后, back buffer 開始變?yōu)榭捎茫烷_始顯示了。有一套機(jī)制實(shí)現(xiàn) back buffer 和 front buffer 的互換,當(dāng)要更新時(shí),back buffer 與 front buffer 互換,back buffer 變成 front buffer。代碼如下:for (i = 0。 i mMapHeightLengh。 i++) { for (j = 0。 j mMapWidthLengh。 j++) {int CampID = mGameMap[i][j]。float x = (j * mTitleSpace) + mTitleIndex_x。float y = (i * mTitleSpace) + mTitleHeight + mTitleIndex_y。if (CampID == CAMP_HERO) { DrawImage(mBlack, x, y, ALIGN_VCENTER | ALIGN_HCENTER)。} else if (CampID == CAMP_ENEMY) { DrawImage(mWhite, x, y, ALIGN_VCENTER | ALIGN_HCENTER)。} setGameState(GS_GAME)。根據(jù) res 中棋盤圖像的坐標(biāo),進(jìn)行定義。Res 中存放的是調(diào)用定義的圖片,將 main 中繪制好的大類在 res 中進(jìn)行整合。圖 52在 res 中如圖 52,在其中進(jìn)行圖像的定義,之后根據(jù)定義對其經(jīng)行調(diào)用如上述代碼實(shí)現(xiàn)。 行棋坐標(biāo)判定 實(shí)際上,是根據(jù)當(dāng)前最后一個(gè)落子的情況來判斷勝負(fù)的。實(shí)際上需要從四個(gè)位置判斷,以該子為出發(fā)點(diǎn)的水平,分別是豎直和水平以及傾斜型。在獲得橫軸和數(shù)軸坐標(biāo)時(shí),該子落下,即可獲得該子落下的坐標(biāo)。因?yàn)槲遄悠逵袡M豎左右,斜邊等全方位的落子方式,所以在定義的時(shí)候就要進(jìn)行多方位的考慮,以保持五子棋的規(guī)則不被破壞。對于各個(gè)方向的算法都要對整個(gè)棋盤有一個(gè)清晰的定義。部分如下代碼: 25 // 橫向for (int i = 0。 i CALU_ALL_COUNT。 i++) { int index = mMapIndexX CALU_SINGLE_COUNT + i。 if (index 0 || index = mMapWidthLengh) {if (MeetCount == CALU_SINGLE_COUNT) { return true。}MeetCount = 0。continue。 } if (mGameMap[mMapIndexY][index] == Camp) {MeetCount++。if (MeetCount == CALU_SINGLE_COUNT) { return true。} } else {MeetCount = 0。 }}// 縱向MeetCount = 0。for (int i = 0。 i CALU_ALL_COUNT。 i++) { int index = mMapIndexY CALU_SINGLE_COUNT + i。 if (index 0 || index = mMapHeightLengh) {if (MeetCount == CALU_SINGLE_COUNT) { return true。}MeetCount = 0。continue。 } if (mGameMap[index][mMapIndexX] == Camp) {MeetCount++。if (MeetCount == CALU_SINGLE_COUNT) { return true。} } else {MeetCount = 0。 如上述語句為橫向落子的算法。橫向的落子算法,根據(jù)棋盤進(jìn)行坐標(biāo)的定位。游戲的策劃是游戲開發(fā)過和中的最重要的一個(gè)開發(fā)環(huán)節(jié),只有寫好了游戲策劃才能繼續(xù)游戲開發(fā),游戲策劃是游戲開發(fā)的一個(gè)流程,把策劃寫好了就可以近照策劃一步步進(jìn)行開發(fā),可見策劃的重要性。 26 勝負(fù)的判定 游戲中,游戲的結(jié)束意味著勝負(fù)的出現(xiàn),在棋類對戰(zhàn)中最終的勝負(fù)就是黑方或者白方的勝利。所以對于此類定義十分重要。 五子棋的規(guī)則就是任意方向上能夠連續(xù)連成5個(gè),便獲得勝利,以此根據(jù)這個(gè)規(guī)則對勝負(fù)判定進(jìn)行匯總和定義。部分代碼如下:if (x 0 amp。amp。 y mTitleHeight) {mMapIndexX = (int) (x / mTitleSpace)。mMapIndexY = (int) ((y mTitleHeight) / mTitleSpace)。if (mMapIndexX mMapWidthL
點(diǎn)擊復(fù)制文檔內(nèi)容
環(huán)評公示相關(guān)推薦
文庫吧 www.dybbs8.com
備案圖鄂ICP備17016276號-1