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

下載本文檔

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

文檔簡介

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

2、1);const CPoint LEFT(CPoint(-1,0);const CPoint RIGHT(CPoint(1,0);/速度快慢定義const int HIGH = 75;const int NORMAL = 180;const int SLOW = 300;const int MAX = 80; / 表示轉(zhuǎn)向數(shù)const int LENGTH = 10;class GameMsgpublic:GameMsg(void):m_icon(0)包羅萬象網(wǎng)一(InitGame();void InitGame(int up = VK_UP int down = VK_DOWN, int l

3、eft = VK_LEFT,int right = VK_RIGHT)(srand(unsigned)time(NULL);m_gameSpeed = NORMAL;m_speedNum = 2;m_snakeNum = 4;for(int i=0; i<m_snakeNum; +i)m_snakePointi = CPoint(5+LENGTH*2*5+LENGTH,LENGTH*2*(i+5);m_run = true;m_direction = RIGHT;turnUP = up;turnDOWN = down;turnLEFT = left;turnRIGHT = right;p

4、ublic: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è)定食物是那種圖標(biāo)的int turnUP;/用來表示玩家"上"鍵設(shè)的鍵int turnDOWN;/用來表示玩家"下"鍵設(shè)的鍵int turnLEFT;/用來表示玩家

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

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

7、void OnUpdateNormal(CCmdUI *pCmdUI);afx_msg void OnUpdateSlow(CCmdUI *pCmdUI);afx_msg void OnNormal();/ 菜單選項,設(shè)定為普通速度 afx_msg void OnSlow();/ 菜單選 項,設(shè)定為慢速度afx_msg void OnQuick();/菜單選項,設(shè)定為快速度 afx_msg voidOnIntroduce();/游戲介紹,就是彈出一個對話框而以afx_msg void OnMoreprogram();/ 進(jìn)入我的博客的函數(shù)afx_msg void OnAbout();/關(guān)于&q

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

9、的一個函數(shù),WM_TIMER顯示函數(shù),里面有食物位置隨機出現(xiàn),判斷蛇死,蛇移動等:void CSnakeDlg:OnTimer(UINT_PTR nIDEvent)if(game.m_snakePoint0.x <0| game.m_snakePoint0.y < LENGTH |game.m_snakePoint0.x > 700 | game.m_snakePoint0.y > 500)/ 當(dāng)蛇跑出邊界,游戲結(jié)束GameOver();for(int j=game.m_snakeNum-1; j>0;-j)/蛇移動的量的變化,當(dāng)重新設(shè)定這些控件的位置 時也就是讓

10、蛇移動起來game.m_snakePointj = game.m_snakePointj-1;game.m_snakePoint0.x += game.m_direction.x * LENGTH * 2;/ 蛇頭移動 game.m_snakePoint0.y += game.m_direction.y * LENGTH * 2;for(int i=0; i<game.m_snakeNum; +i)m_staticArrayi.SetWindowPos( NULL, game.m_snakePointi.x - LENGTH, game.m_snakePointi.y - LENGTH,

11、 game.m_snakePointi.x + LENGTH, game.m_snakePointi.y + LENGTH,SW_SHOW);for(int j=1; j<game.m_snakeNum; +j)/ 當(dāng)蛇撞到自己也結(jié)束游戲if(game.m_snakePoint0=game.m_snakePointj)GameOver();m_staticArrayMAX.ModifyStyle(0xF,SS_ICON | SS_CENTERIMAGE);/ 顯示水果 m_staticArrayMAX.SetIcon(AfxGetApp()->LoadIcon(game.m_ico

12、n);m_staticArrayMAX.SetWindowPos( NULL, game.m_foodPoint.x, game.m_foodPoint.y, 32, 32,SW_SHOW);/當(dāng)蛇吃到水果if(game.m_snakePoint0.x< game.m_foodPoint.x+20+LENGTH &&game.m_snakePoint0.x > game.m_foodPoint.x-LENGTH && game.m_snakePoint0.y < game.m_foodPoint.y+20+LENGTH && g

13、ame.m_snakePoint0.y > game.m_foodPoint.y-LENGTH)game.m_foodPoint=CPoint(LENGTH*game.RandNum(2,37),LENGTH*game.RandNum(2,27);CString str;if(game.m_num = 0)+m_icon1;str.Format("%d”,m_icon1);GetDlgItem(IDC_EDIT1)->SetWindowTextA(str);else if(game.m_num = 1)+m_icon2;str.Format("%d”,m_ico

14、n2);GetDlgItem(IDC_EDIT2)->SetWindowTextA(str);else+m_icon3;str.Format("%d”,m_icon3);GetDlgItem(IDC_EDIT3)->SetWindowTextA(str);game.m_num = game.RandNum(0,3);game.m_icon = IDI_ICON1 + game.m_num;/ 重新加 1 個水果 game.m_snakeNum+;/ 蛇的 長度加 1 str.Format("%d",game.m_snakeNum);GetDlgItem

15、(IDC_EDIT4)->SetWindowTextA(str);CDialog:OnTimer(nIDEvent);如下再介紹應(yīng)用在對話框中來響應(yīng)鍵盤消息,我寫的是一個鍵盤“鉤子”,代碼如下:HHOOK g_hKeyboard = NULL;HWND g_hWnd = NULL;LRESULT CALLBACK KeyboardProc(int code, / hook code WPARAM wParam, / virtual-key codeLPARAM lParam / keystroke-message information)if(wParam = game.turnUP)i

16、f(game.m_direction.y = 0) game.m_direction = UP;else if(wParam = game.turnDOWN)if(game.m_direction.y = 0) game.m_direction = DOWN;else if(wParam = game.turnLEFT)if(game.m_direction.x = 0) game.m_direction = LEFT;else if(wParam = game.turnRIGHT)if(game.m_direction.x = 0) game.m_direction = RIGHT;else

17、;return 1;然后介紹一下,點擊鼠標(biāo)右鍵出現(xiàn)菜單:void CSnakeDlg:OnRButtonDown(UINT nFlags,CPoint point)if(game.m_run)KillTimer;CMenu oMenu;if (oMenu.LoadMenu(IDR_MENU1)CMenu* pPopup = oMenu.GetSubMenu(0);ASSERT(pPopup != NULL);CPoint oPoint;GetCursorPos(&oPoint);SetForegroundWindow();pPopup->TrackPopupMenu(TPM_LE

18、FTALIGN,oPoint.x,oPoint.y,this);if(game.m_run) SetTimer(1,game.m_gameSpeed,NULL);CDialog:OnRButtonDown(nFlags, point);然后來介紹一下程序中是怎樣來改變按鍵的,首先說一下,我開始用EDIT控件來讓用戶輸入,但是程序中我用的是鍵盤“鉤子”來處理消息的,所以EDIT控件在程序中是不可以輸入信息的,所以我選的是下拉列表,代碼如下,解釋也在程序中相應(yīng)給出:int keyNum40=/定義玩家可以設(shè)的鍵,把所有的鍵信息存在這個數(shù)組中 VK_UP,VK_DOWN,VK_LEFT,VK_RIG

19、HT, 'A','B','C','D','E','F','G','H', T,'J',K,'L','M','N','O','P', 'Q','R','S','T','U','V','W,X,'Y','Z',VK_NUMPAD0,VK_NUM

20、PAD1,VK_NUMPAD2,VK_NUMPAD3,VK_NUMPAD4,VK_NUMPAD5, VK_NUMPAD6,VK_NUMPAD7,VK_NUMPAD8,VK_NUMPAD9;void CSnakeDlg:OnKeyset()/鍵盤設(shè)置響應(yīng)消息函數(shù)/ TODO:在此添加命令處理程序代碼if(game.m_run)KillTimer;CKeySetDlg dlg;if(dlg.DoModal() = IDOK)if(dlg.m_up = dlg.m_down | dlg.m_up = dlg.m_left | dlg.m_up = dlg.m_right | dlg.m_down =

21、 dlg.m_left | dlg.m_down = dlg.m_right | dlg.m_left = dlg.m_right)MessageBox("鍵位不能設(shè)置為重復(fù)的,設(shè)置失??!”);if(game.m_run) SetTimer(1,game.m_gameSpeed,NULL);return;game.turnUP = keyNumGetMarkNum(dlg.m_up);/ 重新設(shè)置鍵 game.turnDOWN = keyNumGetMarkNum(dlg.m_down);game.turnLEFT = keyNumGetMarkNum(dlg.m_left);gam

22、e.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;elseCString ss;for(char i='A' i<='Z' +i)(ss.Format("%c”,i);if(ss = str.Right(1)(b

溫馨提示

  • 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論