用java編寫的貪吃蛇游戲代碼_第1頁
用java編寫的貪吃蛇游戲代碼_第2頁
用java編寫的貪吃蛇游戲代碼_第3頁
用java編寫的貪吃蛇游戲代碼_第4頁
用java編寫的貪吃蛇游戲代碼_第5頁
已閱讀5頁,還剩10頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、包羅萬象網(wǎng)一用Java編寫的貪吃蛇代碼下面是我用java編寫的一個貪吃蛇游戲源代碼我個人是比較喜歡玩游戲的,所以學習編程二年多了,很想做個游戲程序,由于能力有限,一直沒能做好,后來突然看同學在手機上玩“貪吃蛇”,故想做出來,其一是因為此游戲界面容易設(shè)計,算法也比較簡單,今天我就把我程序的代碼和算法介紹一下,順便把程序界面皮膚設(shè)計說一下程序中一個關(guān)于游戲信息的類如下,由于類的說明在程序中寫的很清楚了,就不再多解釋了: #include "time.h"/方向定義const CPoint UP(CPoint(0,-1);con st CPoi nt DOWN(CPoi nt(0

2、,1);con st CPoi nt LEFT(CPoi nt(-1,0);con st CPoi nt RIGHT(CPoi nt(1,0);/速度快慢定義con st i nt HIGH = 75;con st i nt NORMAL = 180;con st int SLOW = 300;const int MAX = 80; / 表示轉(zhuǎn)向數(shù)con st i nt LENGTH = 10;class GameMsgpublic:GameMsg(void):m_ic on(0)In itGame();void InitGame(int up = VK_UR int down = VK_DO

3、WN, int left = VK_LEFT,int right =VK_RIGHT)sran d( un sig ned)time(NULL);m_gameSpeed = NORMAL;m_speedNum = 2;m_sn akeNum = 4;for(i nt i=0; i<m_s nakeNum; +i)m_sn akePoi nti = CPoi nt(5+LENGTH*2*5+LENGT H, LENGTH*2*(i+5);m_ru n = true;m_direction = RIGHT;turnUP = up;turnDOWN = dow n;turnLEFT = lef

4、t;turnRIGHT = right;public:int m_gameSpeed;/ 游戲速度int m_speedNum;/ 游戲速度數(shù)CPoint m_foodPoint; / 食物定義bool m_run;/游戲狀態(tài),運得態(tài)還是暫停(結(jié)束)態(tài)CPoint m_snakePointMAX; / 蛇身定義CPoint m_direction; 蛇運動方向int m_snakeNum; / 蛇身結(jié)點數(shù)int m_icon;用來設(shè)定食物是那種圖標的int turnUP;/用來表示玩家"上”鍵設(shè)的鍵 int turnDOWN;/用來表示玩家"下”鍵設(shè)的 鍵int turnL

5、EFT;/用來表示玩家“左”鍵設(shè)的鍵 int turnRIGHT;/用來表示玩家“右”鍵設(shè)的鍵int m_num;用來記錄所選水果的編號;再讓讀者看一下程序主干類的設(shè)計,其中以下只列出由我們自己添加的一些變量的說 明,其他的是由程序向?qū)ё詣由傻?,我就不說了:public:afx_msg void On Timer(UINT_PTR nIDEve nt);程序中運行函數(shù),即是一個定時器,時間就 是上面類中的 m_gameSpeed來控制的 CStatic *m_staticArray;這是一個蛇定義,是用來顯示 蛇的,上面只告訴蛇身結(jié)點的中心點位置坐標,然后在此中心畫一個控件就類似于蛇身了af

6、x_msg void OnClose();/結(jié)束,主要是在其中銷毀定時器的void GameOver(void);/ 游戲結(jié)束函數(shù)afx_msg void OnRButtonDown(UINT nFlags, CPoint point); 當點擊鼠標右鍵出現(xiàn)菜單 afx_msg void OnNewGame(); 菜單選項,新游戲 afx_msg void OnPauseOrStart();/ 菜單選項, 暫停/開始 游戲afx_msg void OnUpdateQuick(CCmdUI *pCmdUI);這3個函數(shù)本來是來標記 速度的,和上面類中的m_speedNum對應(yīng),但是沒有標記成功a

7、fx_msg void OnU pdateNormal(CCmdUI *pCmdUI);afx_msg void OnU pdateSlow(CCmdUI *pCmdUI);afx_msg void OnNormal(); 菜單選項,設(shè)定為普通速度 afx_msg void OnSlow();/ 菜單選 項,設(shè)定為慢速度afx_msg void OnQuick();/菜單選項,設(shè)定為快速度afx_msg voidOnlntroduce();/游戲介紹,就是彈出一個對話框而以afx_msg void OnMoreprogram(); 進入我的博客的函數(shù)包羅萬象網(wǎng)一afx_msg void OnA

8、bout();關(guān)于"貪吃蛇”說明的對話框afx_msg void OnExit();/ 退出游戲CFont m_font;/這就是上圖中顯示"空心字體”的字體設(shè)置void ShowHollowFont(int cx,int cy, CString str);/顯示空心字體函數(shù),在( Cx, Cy)處顯示字符串 strafx_msg void OnBn ClickedExit(); 退出游戲private:int mcon1;表明蛇吃第1種水果的個數(shù)int m_icon2;表明蛇吃第2種水果的個數(shù)int m_icon3;表明蛇吃第3種水果的個數(shù)然后給讀者寫的是我程序運行很重要

9、的一個函數(shù),WM_TIMER顯示函數(shù),里面有食物位置隨機出現(xiàn),判斷蛇死,蛇移動等:void CSn akeDlg:O nTimer(UINT_PTR nIDEve nt)if(game.m_s nakePoi ntO.x<0|game.m_s nakePoi ntO.y< LENGTH |game.m_snakePointO.x > 700 | game.m_snakePointO.y > 500)/ 當蛇跑出邊界,游戲結(jié)束GameOver();for(int j=game.m_snakeNum-1; j>0; -j)/蛇移動的量的變化,當重新設(shè)定這些控件的位置

10、時也就是讓蛇移動起來game.m_s nakePo in tj = game.m_s nakePoi ntj-1;game.m_snakePoint0.x += game.m_direction.x* LENGTH * 2;/ 蛇頭移動game.m_s nakePo in t0.y += game.m_directi on.y * LENGTH * 2;for(i nt i=0; i<game.m_s nakeNum; +i)包羅萬象網(wǎng)一m_staticArrayi.SetWi ndowPos( NULL,game.m_s nakePoi nti.x- LENGTH,game.m_s n

11、akePo in ti.y - LENGTH, game.m_s nakePo in ti.x + LENGTH, game.m_s nakePo in ti.y + LENGTH,SW_SHOW);for(int j=1; j<game.m_snakeNum; +j) 當蛇撞到自己也結(jié)束游戲if(game.m_snakePointO=game.m_s nakePoi ntj)GameOver();m_staticArrayMAX.ModifyStyle(OxF,SS_ICON |SS_CENTERIMAGE); 顯示水果m_staticArrayMAX.Setlco n( AfxGet

12、App()->LoadIco n(game.mcon);m_staticArrayMAX.SetWindowPos( NULL, game.m_foodPoint.x, game.m_foodPoint.y, 32, 32,SW_SHOW);/當蛇吃到水果if(game.m_s nakePoi ntO.x<game.m_foodPoi nt.x+20+LENGTH&&game.m_s nakePo in t0.x> game.m_foodPo in t.x-LENGTH && game.m_s nakePo in t0.y<game.m_

13、foodPoi nt.y+20+LENGTH && game.m_s nakePoi ntO.y > game.m_foodPoi nt.y-LENGTH)game.m_foodPoi nt=CPoi nt(LENGTH*game.Ra ndNum(2,37),LENGTH*game.Ra ndNum(2,27);CStri ng str;if(game.m _num = 0)+m_ic on1;包羅萬象網(wǎng)一str.Format("%d",mcon 1);GetDlgltem(IDC_EDIT1)->SetWi ndowTextA(str);el

14、se if(game.m _num = 1)+m_ic on2;str.Format("%d",mcon 2);GetDlgltem(IDC_EDIT2)->SetWi ndowTextA(str);else+m_ic on3;str.Format("%d",mcon 3);GetDlgltem(IDC_EDIT3)->SetWi ndowTextA(str);game.m _num = game.Ra ndNum(0,3);game.mcon = IDI_ICON1 + game.m_num; 重新加 1 個水果 game.m_snakeN

15、um+; 蛇的 長度加 1 str.Format("%d",game.m_s nakeNum);GetDlgltem(IDC_EDIT4)->SetWi ndowTextA(str);CDialog:O nTimer( nIDEve nt);,代碼如下:如下再介紹應(yīng)用在對話框中來響應(yīng)鍵盤消息,我寫的是一個鍵盤“鉤子”包羅萬象網(wǎng)一HH00K g_hKeyboard = NULL;HWND g_hWnd = NULL;LRESULT CALLBACK KeyboardProc(int code,/ hook code WPARAM wParam, / virtual-ke

16、y codeLPARAM lParam / keystroke-message in formatio n)if(wParam = game.tur nUP)if(game.m_directi on.y = 0) game.m_directi on = UP;else if(wParam = game.tur nDOWN)if(game.m_directi on.y = 0) game.m_directi on = DOWN;else if(wParam = game.turn LEFT)if(game.m_directi on.x = 0) game.m_directi on = LEFT;

17、else if(wParam = game.turnRIGHT)if(game.m_directio n.x = 0) game.m_directi on = RIGHT;包羅萬象網(wǎng)一 elsereturn 1;然后介紹一下,點擊鼠標右鍵出現(xiàn)菜單:void CSnakeDlg:OnRButtonDown(UINT nFlags,CPoi nt poi nt)if(game.m_ru n)KillTimer(1);CMe nu oMenu;if (oMe nu.LoadMe nu(IDR_MENU1)CMe nu* pPopup = oMe nu.GetSubMe nu(O);ASSERT(pP

18、opup != NULL);CPoi nt oPoi nt;GetCursorPos(&oPoi nt);SetForegro undWin dow();pPopup->TrackPopupMe nu(TPM_LEFTALIGN,oPoi nt.x,oPoi nt.y,this);if(game.m_run) SetTimer(1,game.m_gameSpeed,NULL);CDialog:O nRButto nDow n(n Flags, poi nt);然后來介紹一下程序中是怎樣來改變按鍵的,首先說一下,我開始用EDIT控件來讓用戶輸入,但是程序中我用的是鍵盤“鉤子”來處理

19、消息的,所以EDIT控件在程序中是不可以輸入信息的,所以我選的是下拉列表,代碼如下,解釋也在程序中相應(yīng)給出:int keyNum40=/定義玩家可以設(shè)的鍵,把所有的鍵信息存在這個數(shù)組中 VK_URVK_DOWN,VK_LEFT,VK_RIGHT, 'A','B',C,'D','E','F','G','H', T,'J','K','L','M','N','0','P', Q,

20、'R','S',T,'U','V','W,X,'Y','Z',VK_NUMPAD0,VK_NUMPAD1,VK_NUMPAD2,VK_NUMPAD3,VK_NUMPAD4,VK_NUMPAD5, VK_NUMPAD6,VK_NUMPAD7,VK_NUMPAD8,VK_NUMPAD9;void CSn akeDlg:O nKeyset()鍵盤設(shè)置響應(yīng)消息函數(shù)/ TODO:在此添加命令處理程序代碼if(game.m_ru n)KillTimer(1);CKeySetDlg dlg;if(dlg.

21、DoModal() = IDOK)if(dlg.m_up = dlg.m_down | dlg.m_up = dlg.m_left | dlg.m_up = dlg.m_right | dlg.m_dow n = dlg.m_left | dlg.m_dow n = dlg.m_right | dlg. meft = dlg.m_right)MessageBox("鍵位不能設(shè)置為重復(fù)的,設(shè)置失??!");if(game.m_run) SetTimer(1,game.m_gameSpeed,NULL);return;game.turnUP = keyNumGetMarkNum(

22、dlg.m_up); 重新設(shè)置鍵 game.turnDOWN = keyNumGetMarkNum(dlg.m_dow n);game.turnLEFT = keyNumGetMarkNum(dlg.m_left);game.turnRIGHT = keyNumGetMarkNum(dlg.m_right);if(game.m_run) SetTimer(1,game.m_gameSpeed,NULL);int CSnakeDlg:GetMarkNum(CString str)/返回重新設(shè)置鍵對應(yīng)數(shù)組的"索引”int backNum = 0;if(str ="上")backNum = 0;else if(str ="下")backNum = 1;else if(str ="左")backNum = 2;else if(str ="右")backNum = 3;elseCStri ng ss;for(char i='A' i<='Z' +i)ss.Format("%c",i);if(ss = str.Right(1)backNum = i

溫馨提示

  • 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)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論