




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、這些游戲以前玩過吧,快下載看它們是怎么編寫的!目錄:·編寫趣味撞球小游戲·用VB6.0設(shè)計(jì)簡易賽車游戲 ·Visual Basic小游戲:猜英雄 ·VB游戲?qū)懽骷记桑?)秀圖篇 ·VB游戲?qū)懽骷记桑?)網(wǎng)絡(luò)篇 ·VB 貪吃蛇 單人版游戲(一) ·VB 貪吃蛇 單人版游戲(二) ·VB 貪吃蛇 單人版游戲(三) ·VB 貪吃蛇 單人版游戲(四) ·用VB開發(fā)即時(shí)戰(zhàn)略游戲 正文:編寫趣味撞球小游戲文章來源: 沐風(fēng)經(jīng)典 文章作者: 佚名 Visual Basic是一個(gè)功能強(qiáng)大的工具,它有一大特點(diǎn)就是易
2、學(xué)易用,下面我們就通過寫一個(gè)“趣味撞球” 的程序來初步體會(huì)一下。首先啟動(dòng)VB5,新建一個(gè)標(biāo)準(zhǔn)的EXE工程。此時(shí)可以看到,工程包括一個(gè)Form1框體。在Form1邊框的右下角按住鼠標(biāo)左鍵不放,拖動(dòng)鼠標(biāo)把Form1的面積改為適當(dāng)大小,比如6930×4320。再在屬性框中把Form1的ScaleMode 屬性改為3Pixel,表明我們將以像素為我們的坐標(biāo)計(jì)算單位,把Form1的StartUpPosition 屬性設(shè)為2CenterScreen,使運(yùn)行時(shí)窗體出現(xiàn)在屏幕正中?,F(xiàn)在,在控件面板上選取CommandButton(命令按鈕)控件,為Form1添加Command1和Command2兩個(gè)
3、按鈕控件,把它們的大小設(shè)為121×25,再在屬性框中把Command1的Caption填為“GO”,把Command2的Caption填為“QUIT”,并把Command1放到框體的右上角,把Command2放到框體的右下角。然后,在控件面板上選取Timer(時(shí)鐘)控件,為Form1添加一個(gè)Timer1時(shí)鐘控件。再在屬性框中把它的Enabled屬性改為False,Interval屬性改為50,前一個(gè)值表示該時(shí)鐘控件是否激活,后一個(gè)值決定該時(shí)鐘控件產(chǎn)生Timer事件的間隔時(shí)間,我們將用它來控制小球的移動(dòng)頻率。到此為止,我們已經(jīng)完成了全部的界面設(shè)計(jì)工作。接下來要做的全部工作就是填入程序代
4、碼了。 Dim BallX As IntegerDim BallY As IntegerDim AddX As IntegerDim AddY As IntegerDim HitX As IntegerDim W As IntegerDim H As IntegerPrivate Sub Command1_Click()BallX=Int(Rnd(1)Form1.ScaleWidth/10)525BallY=Int(Form1.ScaleHeight)/10)5AddX=5AddY=5Form_PaintTimer1.Enabled=TrueEnd SubPrivate Sub Command
5、2_Click()EndEnd SubPrivate Sub Form_MouseMove(Button As Integer,Shift As Integer,X As Single,Y As Single)X=X50If X<15 Then X=15If X>W105 Then X=W105HitX=XIf Timer1.Enabled=True ThenLine(16,H5)(W6,H),HC0C0C0,BFLine(HitX,H)(HitX100,H5),0,BFEnd IfEnd SubPrivate Sub Form_Paint()ClsW=Int(ScaleWidth
6、140)/5)5H=Int(ScaleHeight10)/5)5BackColor=HC0C0C0Line(10,10)(15,H),0,BFLine(W5,10)(W,H),0,BFLine(10,10)(W,15),0,BFEnd SubPrivate Sub Timer1_Timer()Form1.Circle(BallX,BallY),4,HC0C0C0BallX=BallXAddXBallY=BallYAddYForm1.Circle(BallX,BallY),4,0If BallX<=20 Then AddX=AddXIf BallY<=20 Then AddY=Add
7、YIf BallX>=W10 Then AddX=AddXIf BallY>=H10 ThenIf BallXHitX100 ThenTimer1.Enabled=FalseForm_PaintEnd IfAddY=AddYEnd IfEnd Sub 一旦程序代碼輸入完畢,你就可以按F5開始執(zhí)行它,或是在File菜單里選取Make來生成EXE執(zhí)行文件了,瞧,小球已經(jīng)在你的屏幕上蹦來蹦去了。本文來自編程入門網(wǎng)():用VB6.0設(shè)計(jì)簡易賽車游戲文章來源: programfan 文章作者: yaozheng 簡單的游戲往往更耐玩,就比如伴我度過高考的賽車游戲:一切都是方塊,所謂的賽車也只
8、是四個(gè)方塊。第一步,繪制對象:用函數(shù)drawcar()畫賽車,drawway(n)畫跑道的第n層。第二步,接受控制:Form的KeyPreview屬性要設(shè)為true,在Form_KeyPress函數(shù)中通過改變?nèi)肿兞縞x來控制賽車的位置。第三步,游戲循環(huán):作為即時(shí)游戲,必須要有一個(gè)Timer,并在其事件Timer1_Timer()中繪制所有對象和進(jìn)行碰撞檢測。本例中,繪圖部分寫在了Timer1_Timer()中,碰撞測試放在了test()中。這也是所有即時(shí)游戲所共通的框架。當(dāng)然,我們往往還是根據(jù)具體的設(shè)計(jì)作一些變通,發(fā)揮一些技巧比如這里設(shè)計(jì)的跑道是隨機(jī)產(chǎn)生的的,這就要通過一點(diǎn)技巧以便既讓玩家感
9、到挑戰(zhàn),又不至于出現(xiàn)不可逾越的難關(guān)下面是全部源代碼,窗體上只需放個(gè)按鈕Command1就行了!Const D = 100 '方格的寬度Const BT = 3000 '跑道底部的y坐標(biāo)Dim l1(22) As Integer '每層跑道左邊有幾個(gè)方塊Dim l2(22) As Integer '每層跑道右邊有幾個(gè)方塊Dim cx As Single '賽車的在x軸的位置Private Sub Command1_Click()cx = Width / 2 - 3 * D / 2cy = Height - DdrawcarFor i = 1 To 20l1
10、(i) = 0l2(i) = 0drawway (i)Next iTimer1.Enabled = TrueEnd SubPrivate Sub drawcar()Line (cx, BT - 100)-Step(3 * D, D), BackColor, BFLine (cx + D, BT - 200)-Step(D, D), BackColor, BF '先擦Line (cx, BT - 100)-Step(3 * D, D), RGB(225, 0, 0), BFLine (cx + D, BT - 200)-Step(D, D), RGB(225, 0, 0), BFEnd
11、SubPrivate Sub drawway(n)Line (Width/2-3*D/2-2*D,BT-n*D)-Step(7*D,D),BackColor, BF'先擦后畫Line (Width/2-3*D/2-2*D,BT-n*D)-Step(l1(n)*D, D), ,BFLine (Width/2-3*D/2+5*D,BT-n*D)-Step(-l2(n)*D,D), ,BFEnd SubPrivate Sub Form_KeyPress(KeyAscii As Integer)Select Case KeyAsciiCase Asc("a"), Asc(&
12、quot;A")cx = cx - DCase Asc("s"), Asc("S")cx = cx + DEnd SelectEnd SubPrivate Sub Timer1_Timer()RandomizeFor i = 1 To 19l1(i) = l1(i + 1)l2(i) = l2(i + 1)drawway (i)Next iDol1(20) = Int(Rnd * 5)l2(20) = Int(Rnd * 5)Loop Until (l1(20) + l2(20) <= 4) And (l1(20) - l1(19) &l
13、t;= 1) And _(l2(20) - l2(19) <= 1) And (l1(19) + l2(20) <= 4) And _(l1(20) + l2(19) <= 4) '這里生成新一層跑道,'注意要篩去玩家不可能通過的情況!drawway (20)'以上畫出跑道drawcartestEnd SubPrivate Sub test()If 3.5*D-Width/2+cx<l1(1)*D Then Timer1.Enabled=FalseIf 3.5*D-Width/2+cx+D<l1(2)*D Then Timer1.Enabl
14、ed=FalseIf 3.5*D-(cx+3*D-Width/2)<l2(1)*D Then Timer1.Enabled=FalseIf 3.5*D-(cx+2*D-Width/2)<l2(2)*D Then Timer1.Enabled=FalseEnd Sub本文來自編程入門網(wǎng)():相信不少讀者都看過央視的水滸吧,林沖、武松、李逵等英雄好漢的音容笑貌仿佛還浮現(xiàn)在我的眼前,那么108將中你最喜歡誰呢?我做了一個(gè)小程序來讓電腦猜測你的心思,程序界面如圖所示。為了簡化問題,我選擇了其中的27將,將他們分成3組,每組9人。如果你最喜歡其中的一個(gè)(比如史進(jìn)),他在第一組出現(xiàn)了,那么就按
15、下按鈕“第一組”。然后這27將會(huì)重新排列順序,你再找史進(jìn)在哪一組,比如發(fā)現(xiàn)他在第二組,就按下按鈕“第二組”,畫面中的人物次序會(huì)再次打亂,再找史進(jìn)所在組別最多3次,電腦將會(huì)猜出你心中的英雄!知道了玩法,下面我將介紹程序是如何實(shí)現(xiàn)的:一、猜測的奧妙推算原理猜測的原理其實(shí)也不復(fù)雜,我們來模擬一下猜測的過程大家就清楚了。程序初始化時(shí)是把127將隨機(jī)打亂分別放入PageControl控件的三個(gè)選項(xiàng)卡中,每個(gè)選項(xiàng)卡放9張圖片。點(diǎn)擊一次按鈕后其實(shí)不是盲目地將順序打亂,而是進(jìn)行了篩選,把有用的圖片(就是點(diǎn)選的那組的9張圖片)篩選出來平均分配到PageControl控件的三個(gè)選項(xiàng)卡中,再把不需要的圖片集中起來平
16、均分配到PageControl控件的三個(gè)選項(xiàng)卡中,最后在各個(gè)選項(xiàng)卡中把有用的、無用的圖片隨機(jī)打亂再次重新排列顯示出來,從而完成猜測。用表1來說明:點(diǎn)擊按鈕的次數(shù) 選項(xiàng)卡1 選項(xiàng)卡2 選項(xiàng)卡3 1 3 3 3 2 1 1 1 3 0 0 0 具體講,當(dāng)?shù)谝淮伟聪掳粹o時(shí),表示你相中的圖片在其中一個(gè)選項(xiàng)卡的9張圖片內(nèi)。于是把這9張圖片均分成3份,每份3張,分別送入3個(gè)選項(xiàng)卡,其余的圖片就不做考慮了。當(dāng)?shù)诙伟聪掳粹o時(shí),表示你相中的圖片在其中一個(gè)選項(xiàng)卡的3張圖片內(nèi),于是把這3張圖片均分成3份,每份1張,分別送入3個(gè)選項(xiàng)卡,當(dāng)?shù)谌伟聪掳粹o時(shí),表示你相中的圖片在其中一個(gè)選項(xiàng)卡的1張圖片內(nèi),毫無疑問,這張
17、圖片就是你相中的圖片,于是程序把這張圖片顯示出來。打亂重排的算法在程序中的很多地方要涉及打亂順序重排的問題,下面我們就來先簡單介紹一下打亂是如何實(shí)現(xiàn)的。這里要實(shí)現(xiàn)的方法是比較簡單的,也就是多次把數(shù)組的不同位置的值互換,就像讀小學(xué)時(shí)老師讓兩個(gè)同學(xué)互換位置一樣,老師不斷隨機(jī)抽兩個(gè)同學(xué)互換位置,最后同學(xué)們的座位就都重新排了一遍。舉個(gè)例子:int I,temp1,temp2,a2,b27for(i=1;i<=27;i+)/先對數(shù)組賦初值bi=I;randomize();for(i=1;i<=500;i+)/i的大小決定打亂的程度,循環(huán)次數(shù)越多,打亂程度越高temp1=random(27)+
18、1;temp2=random(27)+1;a1=btemp1;btemp1=btemp2;btemp2=a1;/輸出ListBox1->Clear();for(i=1;i<=27;i+)ListBox1->Items->Add(IntToStr(bi); 如上例所示,經(jīng)過打亂,b27數(shù)組將不再是舊時(shí)容顏。二、實(shí)現(xiàn)的關(guān)鍵篩選算法的介紹在整個(gè)實(shí)現(xiàn)的過程中,如何在每一次打亂后對人物進(jìn)行篩選是程序的關(guān)鍵所在,處理不好,程序就不會(huì)有結(jié)果。而且篩選很容易把你攪得頭暈?zāi)X脹,所以涉及的各個(gè)數(shù)組之間的關(guān)系一定要先理順,先用一個(gè)例子來解釋如何進(jìn)行篩選。以點(diǎn)擊按鈕的次數(shù)是第一次并且點(diǎn)擊的按鈕
19、是Button1為例加以介紹,其思路如下:初始:第一次執(zhí)行按鈕事件并且按下的是Button1時(shí)(表a的數(shù)組就是關(guān)鍵數(shù)組):把表a打亂后平均拆分為3組分別送入內(nèi)存緩沖區(qū)把表b和表c打亂后也平均拆分為3組分別送入內(nèi)存緩沖區(qū)(非重要的數(shù)組),然后將它們進(jìn)行組合,分別把有用的和無用的搭配重新組合為三張表并顯示出來:把全部的篩選過程表述出來:1.初始化:把a(bǔ)1-27打亂并將a1-9 賦給first1-9a10-18 賦給second1-9a19-27 賦給third1-92.第一次按鈕事件(假設(shè)選中的是第二個(gè)選項(xiàng)卡)second1-9打亂后賦給temp11-3、temp21-3、temp31-3a1-9
20、+a19-27賦給temp41-18 并打亂temp11-3temp41-6賦給first1-9并打亂temp21-3temp47-12賦給second1-9 并打亂temp31-3temp413-18賦給third1-9 并打亂3.第二次按鈕事件(假設(shè)選中的是第二個(gè)選項(xiàng)卡)temp21-3打亂后賦給temp51、 temp61 、temp71temp11-3+temp31-3+temp41-18賦給temp81-24并打亂temp51temp81-8賦給first1-9 并打亂temp52temp89-16賦給second1-9 并打亂temp53temp817-24賦給third1-9 并
21、打亂4.第三次按鈕事件(如果選中的是第二個(gè)選項(xiàng)卡)把temp52所對應(yīng)的圖片顯示出來即可。最后分別把表a表c打亂后顯示出來即可。 進(jìn)行二次、多次篩選的方法都一樣,只是要注意相中的好漢在哪個(gè)數(shù)組里面,千萬別搞錯(cuò)就行了。三、小結(jié)最后的工作就比較簡單了??梢栽O(shè)計(jì)一個(gè)友好的界面,然后在程序啟動(dòng)的時(shí)候?qū)?shù)組賦初值,并顯示出來;對每個(gè)按鈕分別先進(jìn)行次數(shù)判斷,然后進(jìn)行前面講述的處理,不斷篩選直到剩下惟一的好漢后就可以顯示在界面的正下方了。本文來自編程入門網(wǎng)():VB游戲?qū)懽骷记桑?)秀圖篇文章來源: 互聯(lián)網(wǎng) 文章作者: 未知 一開始,我想先從游戲的圖形先講起好了,畢竟游戲最重要的就是畫面,一個(gè)沒有漂亮圖形的
22、游戲,我連碰都不想去碰。那該怎么處理游戲的圖形呢?VB提供了一個(gè)非常好用的控制項(xiàng)-PictureBox,有了這個(gè)控制項(xiàng)我們才能輕松的在程式中秀出圖形,現(xiàn)在就來看看PictureBox有那些特性可以讓我們在游戲中使用。Picture 屬性:只要將這個(gè)屬性填入正常的圖形檔名,VB就會(huì)自動(dòng)幫我們載入圖形檔。Visible 屬性:這個(gè)屬性可以讓圖形消失或讓圖形出現(xiàn)在畫面上。用法:Form1.Picture1.Visible = False '消失Form1.Picture1.Visible = True '出現(xiàn)Left 屬性:表示圖形的位置的座標(biāo)。Top 屬性:表示圖形的位置的座標(biāo)。用
23、法:改變這兩個(gè)屬性就可以改變圖形的位置。ScaleMode 屬性:設(shè)定PictureBox所使用的座標(biāo)單位,一般都設(shè)為"3-像素"知道了PictureBox的特性後,要怎么樣把它應(yīng)用到游戲中呢?舉個(gè)例子好了,我現(xiàn)在要做一個(gè)打磚塊的游戲,需要用到那些圖片呢?磚塊、球、擊球的板子,一共有三張圖,所以我們就使用三個(gè)PictureBox,將圖片載入到PictureBox里面,如下面所示:Picture1 磚塊的圖片Picture2 球的圖片Picture3 板子的圖片接著我就可以寫,當(dāng)我按下方向鍵的右鍵時(shí),Picture3的left屬性+1,按下左鍵則-1,這樣一來不就可以控制板子
24、的左右移動(dòng)了嗎?球也是一樣,只要每隔一段時(shí)間更改一次Picture2的left和top 屬性,就可以做出球移動(dòng)的效果了?;蛟S有人會(huì)覺得奇怪,一張圖就要用到一個(gè)PictureBox,小游戲的圖不多還沒關(guān)系,如果是的話不就要?jiǎng)佑玫綆浊€(gè)甚至幾萬個(gè)PictureBox?豈不是麻煩死了?所以如果圖片很多的時(shí)候,我通常都是把圖全部都放在同一個(gè)圖形檔里面,這樣就只要用到一個(gè)PictureBox了,要用圖片時(shí)從里面把它抓出來就好了,不過要怎么抓呢?我建議使用函數(shù)BitBlt()來做圖形的搬移。使用BitBlt函數(shù)前要先宣告:Declare Sub BitBlt Lib "gdi32" (
25、ByVal hDestDC As Long, ByVal X As Long, ByVal Y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hSrcDC As Long, ByVal xSrc As Long, ByVal ySrc As Long, ByVal dwRop As Long)hDestDC 目的地的DCx 目的地的座標(biāo)xy 目的地的座標(biāo)ynWidth 來源圖片的寬度nHight 來源圖片的高度hSrcDC 來源圖片的DCxsrc 來源圖片的座標(biāo)xysrc 來源圖片的座標(biāo)ydwrop 運(yùn)算方法:&
26、HCC0020 PUT&H8800C6 AND&HEE0086 OR&H660046 XOR現(xiàn)在有兩個(gè)PictureBoxPicture1 AutoRedRaw 屬性設(shè)為TureScaleMode 屬性設(shè)為"3-像素"Picture2 AutoRedRaw 屬性設(shè)為TureScaleMode 屬性設(shè)為"3-像素"若想將Picture2里(10,10)-(100,100)區(qū)域內(nèi)的圖形拷貝到Picture1的(0,0)可以這樣寫:BitBlt Picture1.hdc,0,0,90,90,Picture2.hdc,10,10,&
27、;HCC0020這樣子平常寫游戲時(shí)就只要設(shè)兩個(gè)PictureBox,一個(gè)專門用來顯示,另一個(gè)則用來放圖形資料,需要時(shí)再用BitBlt函數(shù)覆制過去就好了,不是很方便嗎? 本文來自編程入門網(wǎng)(): VB游戲?qū)懽骷记桑?)網(wǎng)絡(luò)篇文章來源: 互聯(lián)網(wǎng) 文章作者: 未知 這一次寫的是如何用VB來寫網(wǎng)路程式的方法,你可不要以為這是什么深?yuàn)W的程式,其實(shí)只要一個(gè)Winsock 控制項(xiàng)就可以了,現(xiàn)在就來介紹一下Winsock 的用法:步驟一:首先要先把控制項(xiàng)給叫出來,你只要按下Ctrl+T後選取Winsock Control 5.0若是用VB6 的就選Winsock Control 6.0,這樣就可以使用Wins
28、ock元件。步驟二:再來我們必須先確定程式是作Server端還是Client端的,要先設(shè)定一些屬性:Server寫法:winsock1.localPort = 5400 (數(shù)字可以隨便設(shè))winsock1.Listen (等待連線)Client寫法:winsock1.RemoteHost = "對方IP"winsock1.RemoteProt = 5400 (必須要和Server端相同)winsock1.LocalProt = 0winsock1.Connect (連線)連線之前Client端要先知道Server端的IP,接著等到Server端等待連線時(shí),Client端就可
29、以呼叫Connect方法,雙方連線成功後就可以傳輸資料。步驟三:當(dāng)Client連線的時(shí)候Server端會(huì)引發(fā)ConnectionRequest事件,Server的程式要這樣子寫:Private Sub Winsock1_ConnectionRequest(ByVal requestID As long)winsock1.Closewinsock1.Accept requestIDEnd Sub步驟四:這樣一來就可以傳送資料了,傳送和接受資料的方法如下:傳送資料:mydata = "你好嗎?"winsock1.sendData mydata這樣就會(huì)把mydata給傳到對方那里
30、。接受資料:當(dāng)有資料送到的時(shí)候會(huì)引發(fā)DataArrival事件。Privata Sub Winsock1_DtatArrival(ByVal bytesTotal As long)Dim mydata As Stringwinsock1.GetData mydata會(huì)把送到的資料給mydataEnd SubWinsock 控制項(xiàng)就那么簡單,只要會(huì)這些就可以寫網(wǎng)路游戲了,相關(guān)的程式你可以參考網(wǎng)路五子棋(54K) 本文來自編程入門網(wǎng)():本文介紹編制貪吃蛇游戲的一般方法, 其中不含什么高深的算法,只使用了初級(jí)的VB編程方法,通俗易懂。各位如有任何見解,請不吝賜教。本人QQ : 190317890
31、(請?jiān)谏矸蒡?yàn)證里面寫上“CSDN”)郵箱 bugs1984需要本程序VB源碼文件的朋友,請留下你的 E-mail,我會(huì)盡快寄出。設(shè)計(jì)思路:(一)開始新游戲1.1 獲取并應(yīng)用各個(gè)參數(shù)(當(dāng)前級(jí)別,控制鍵等),初始化隨機(jī)數(shù)(Randomize)。1.2 清除地圖上的所有物品,各個(gè)統(tǒng)計(jì)數(shù)值置零。1.3 初始化地圖:布置食物,炸彈,蛇身位置以及蛇頭的移動(dòng)方向在PictureBox上繪畫圖像 并修改對應(yīng)的地圖格屬性值(MapProperty()數(shù)組)。1.4 啟動(dòng)Timer定時(shí)器,游戲開始。(二)游戲操作2.1 暫?;謴?fù)修改表示游戲狀態(tài)的Boolean型變量值;顯示隱藏 表示游戲狀態(tài)的Label;暫?;謴?fù)
32、 Timer定時(shí)器。2.2 控制方向(根據(jù)Nokia貪吃蛇的操作方式)由于蛇頭只能朝上下左右4個(gè)方向移動(dòng),但是方向鍵有8個(gè),所以“斜線方向”的控制鍵和水平,垂直方向的控制鍵編碼上有點(diǎn)不同2.2.1 斜線方向鍵(以“右上”方向鍵為例)如果當(dāng)前蛇頭朝著左邊(水平方向)運(yùn)動(dòng),則將水平方向的分量變?yōu)?,再將垂直方向的分量變?yōu)?1(向上運(yùn)動(dòng));如果當(dāng)前蛇頭朝著上方(垂直方向)運(yùn)動(dòng),則將垂直方向的分量變?yōu)?,再將水平方向的分量變?yōu)?1(向右運(yùn)動(dòng))。其余“左上,左下,右下”的方向鍵編碼與上述雷同。2.2.2“水平,垂直”方向鍵當(dāng)蛇以 水平 方向移動(dòng)時(shí),“左”和“右”的按鍵無效;(即不處理按鍵事件)當(dāng)蛇以 垂
33、直 方向移動(dòng)時(shí),“上”和“下”的按鍵無效。(三)移動(dòng)蛇身3.1 根據(jù)運(yùn)動(dòng)方向,找出蛇頭的新坐標(biāo);3.2 判斷蛇頭新坐標(biāo)下的 地圖屬性(1)如果蛇頭的新坐標(biāo) 和當(dāng)前 蛇尾 的坐標(biāo)重合,那不算GameOver因?yàn)殡S著蛇頭的移動(dòng),蛇身各個(gè)節(jié)點(diǎn)都會(huì)向前跟進(jìn),使得當(dāng)前 蛇尾 坐標(biāo)下的網(wǎng)格在移動(dòng)之后會(huì)變成 空白地。(2)如果當(dāng)前蛇頭位置的地圖屬性是“食物”增加蛇身長度,統(tǒng)計(jì)玩家吃進(jìn)的食物數(shù)量,增加分?jǐn)?shù),補(bǔ)充地圖上的食物,記錄(累加)當(dāng)前吃進(jìn)的物品,如果吃進(jìn)的物品(curEatCount) 達(dá)到一定數(shù)量(EatCountPerShowPrize)就在地圖上顯示獎(jiǎng)品。(3)如果當(dāng)前蛇頭位置的地圖屬性是“炸彈“
34、(陷阱)統(tǒng)計(jì)玩家吃進(jìn)的炸彈數(shù)量,扣分(如果分?jǐn)?shù)小于0,就GameOver),補(bǔ)充地圖上的炸彈,記錄(累加)當(dāng)前吃進(jìn)的物品,如果吃進(jìn)的物品達(dá)到一定數(shù)量就顯示獎(jiǎng)品。(4)如果當(dāng)前蛇頭位置的地圖屬性是“獎(jiǎng)品”加分,重新累計(jì) 吃進(jìn)的物品數(shù)(curEatCount = 0)3.3 刷新蛇身坐標(biāo),更新 地圖網(wǎng)格屬性 以及畫面(1)在更新蛇身坐標(biāo)之前,保存原來的 蛇尾坐標(biāo);(2)先在地圖上 擦除舊的的蛇頭,然后在地圖上 繪畫出新的蛇頭;(3)修改變量值,標(biāo)記蛇頭新坐標(biāo)下的地圖格屬性為:蛇身;(4)要先更新 蛇身除了蛇頭外其余部分的坐標(biāo);(5)之后才更新 蛇頭的坐標(biāo);(6)判斷是否需要 增加蛇身長度如果要增加
35、長度:舊蛇尾的坐標(biāo)不變,蛇身長度 + 1;否則(無需增加蛇身長度):如果蛇頭的新坐標(biāo)與舊蛇尾的坐標(biāo)重合,就不用在舊蛇尾的坐標(biāo)下 繪畫空白地的圖案(因?yàn)樵摼W(wǎng)格屬性已經(jīng)是 蛇頭,而不是空白地)(7)在地圖上擦除舊蛇尾,繪畫空白地;(8)在地圖上把 舊蛇尾坐標(biāo) 下的地圖格的屬性設(shè)置為 空白地;標(biāo)準(zhǔn)模塊 Module1 代碼Option Explicit'全局 常量 Public Enum MAP_PROPERTY '地圖屬性MAP_EMPTY = 0 '空白地MAP_FOOD '食物MAP_BOMB '炸彈,陷阱MAP_PRIZE '加分獎(jiǎng)品MAP_S
36、NAKE '蛇身End EnumPublic Const MAP_SCALE As Integer = 15 '地圖放大倍數(shù)'地圖網(wǎng)格數(shù)(Index值,首值為0)Public Const MAX_COL_INDEX As Integer = 19Public Const MAX_ROW_INDEX As Integer = 10Public Const START_SNAKE_LENGTH As Integer = 8 '蛇身初始長度Public Const SPEED_LV1 As Integer = 200 '第一級(jí)(最慢)的速度(Timer.Int
37、erval,最快第9級(jí)40)Public Const SPEED_CHANGE As Integer = 20 '前后2個(gè)等級(jí)之間的 Interval差值(毫秒)'定義控制鍵Public Const KEY_PAUSE As Integer = vbKeyNumpad5Public Const KEY_UP As Integer = vbKeyNumpad8Public Const KEY_DN As Integer = vbKeyNumpad2Public Const KEY_LF As Integer = vbKeyNumpad4Public Const KEY_RT As
38、 Integer = vbKeyNumpad6Public Const KEY_LFUP As Integer = vbKeyNumpad7Public Const KEY_LFDN As Integer = vbKeyNumpad1Public Const KEY_RTUP As Integer = vbKeyNumpad9Public Const KEY_RTDN As Integer = vbKeyNumpad3'定義填充色Public Const HEAD_COLOR As Long = &H80FF '蛇頭顏色Public Const BODY_COLOR A
39、s Long = vbGreen '蛇身顏色Public Const EMPTY_COLOR As Long = &HE0E0E0 '空白地顏色Public Const FOOD_COLOR As Long = vbBlue '食物顏色Public Const BOMB_COLOR As Long = vbRed '炸彈顏色Public Const FULL_COLOR As Long = 255 3Public Const RECORD_FILE_NAME As String = "record.dat" '記錄得分榜的 文
40、件名Public Const MAX_PRIZE As Integer = 50 '起始 獎(jiǎng)勵(lì)分?jǐn)?shù)的 上限Public Const MIN_PRIZE As Integer = 20 '起始 獎(jiǎng)勵(lì)分?jǐn)?shù)的 下限'全局 變量 '記錄玩家的相關(guān)信息和設(shè)置值:Public Type thePlayerInfoScore As Integer '記錄得分HeadColor As Long '蛇頭填充色BodyColor As Long '蛇身填充色Food As Integer '記錄吃進(jìn)的 食物數(shù)量Bomb As Integer '
41、;記錄吃進(jìn)的 炸彈數(shù)量blnGameOver As Boolean '標(biāo)記該玩家是否已經(jīng)game over' SnakeColor As Long '繪畫蛇身使用的填充色暫時(shí)省略SnakeLength As Integer '蛇身長度'蛇頭移動(dòng)方向(值為 1,0,1)X_Way As IntegerY_Way As Integer'控制鍵(8個(gè))暫時(shí)省略(采用默認(rèn)控制鍵)End Type'記錄 玩家的得分和名字Type theRecordName As String * 15Score As IntegerEnd Type'用于表
42、示二維坐標(biāo)值Public Type thePositionX As IntegerY As IntegerEnd TypePublic FoodCount_AtOneTime As Integer '地圖上同時(shí)出現(xiàn)的 食物數(shù)量Public BombCount_AtOneTime As Integer '地圖上同時(shí)出現(xiàn)的 炸彈數(shù)量Public PrizeRemain As Integer '當(dāng)前剩余的 獎(jiǎng)勵(lì)分?jǐn)?shù)Public EatCountPerShowPrize '記錄 蛇每吃進(jìn)多少物品(包括食物和炸彈,獎(jiǎng)品不計(jì))才顯示一次獎(jiǎng)品Public AddScorePe
43、rFood As Integer '每吃進(jìn)一個(gè) 食物,所增加的分?jǐn)?shù)Public AddScorePerBomb As Integer '每吃進(jìn)一個(gè) 炸彈,所扣掉的分?jǐn)?shù)Sub Main()frmPlay.ShowfrmScoreList.Show '第一次運(yùn)行時(shí)先顯示得分榜End Sub本文來自編程入門網(wǎng)():VB 貪吃蛇 單人版游戲(二)文章來源: CSDN 文章作者: Bugs1984 主窗體 FrmPlay 代碼Private blnStartGame As Boolean '標(biāo)記是否已經(jīng)開始 新游戲(T游戲已經(jīng)開始)Private blnPause As
44、Boolean '標(biāo)記當(dāng)前是否處于暫停狀態(tài)(T暫停)Private blnThroughWall As Boolean '標(biāo)記是否為穿墻模式(T可以穿墻)Private blnOnKeyEvents As Boolean '標(biāo)記是否能夠 接收鍵盤事件(T可以接收),此變量可防止 Form_KeyDown()事件重復(fù)執(zhí)行Private Map_Width As Integer '地圖寬度(象素)Private Map_Height As Integer '地圖高度(象素)Private Map_Empty_Color '地圖空白地顏色Private
45、 Map_Bomb_Color '地圖炸彈顏色Private Map_Food_Color '地圖食物顏色Private MapProperty() As Integer '記錄地圖各個(gè)網(wǎng)格的屬性Private curEatCount As Integer '記錄 每次出現(xiàn)獎(jiǎng)品之前,一共吃進(jìn)多少物品(包括食物和炸彈,獎(jiǎng)品不計(jì)),當(dāng)獎(jiǎng)品出現(xiàn)后,此變量值變?yōu)?零"0",然后進(jìn)入下一次統(tǒng)計(jì)Private curLevel As Integer '當(dāng)前級(jí)別Private P1 As thePlayerInfo '記錄Player1 的
46、信息Private Snake_P1() As thePosition '記錄蛇身坐標(biāo)Private PrizePos As thePosition '記錄獎(jiǎng)品的坐標(biāo)Private Record(9) As theRecord '存放前十名的 得分記錄信息Option ExplicitPrivate Sub cmdHelp_Click() If blnPause = False Then Call Form_KeyDown(KEY_PAUSE, 0) '如果游戲正在進(jìn)行,則發(fā)送“暫?!卑存I事件,暫停游戲 frmHelp.Show End Sub'開始新游
47、戲Private Sub cmdNewGame_Click() Dim i As Integer Randomize '重新生成隨機(jī)數(shù)列 blnStartGame = Not blnStartGame If blnStartGame Then cmdNewGame.Caption = "停止" Else cmdNewGame.Caption = "新游戲" End If '中止游戲 If blnStartGame = False Then '如果上一次的獎(jiǎng)品還沒有消失(以 PrizeRemain > 0 為標(biāo)志),就先清除舊
48、的獎(jiǎng)品,然后才顯示新的獎(jiǎng)品 If PrizeRemain > 0 Then Call ShowPrize(False) picDisplay.Cls P1.Score = 0 '玩家的初始分?jǐn)?shù) P1.Food = 0 P1.Bomb = 0 curEatCount = 0 PrizeRemain = 0 blnPause = False lblPause.Visible = False lblScore.Caption = P1.Score lblFoodCount.Caption = P1.Food lblBombCount.Caption = P1.Bomb P1.blnGa
49、meOver = True HscrLevel.Enabled = True tmrMove.Enabled = False Exit Sub End If blnThroughWall = True '穿墻模式 blnOnKeyEvents = True '暫時(shí)使用默認(rèn)填充色 Map_Bomb_Color = BOMB_COLOR Map_Empty_Color = EMPTY_COLOR Map_Food_Color = FOOD_COLOR P1.BodyColor = BODY_COLOR P1.HeadColor = HEAD_COLOR '地圖初始化 ReD
50、im MapProperty(MAX_COL_INDEX, MAX_ROW_INDEX) Map_Width = (MAX_COL_INDEX + 1) * MAP_SCALE Map_Height = (MAX_ROW_INDEX + 1) * MAP_SCALE picDisplay.Cls picDisplay.Width = Map_Width + 2 picDisplay.Height = Map_Height + 2 picDisplay.Line (0, 0)-Step(Map_Width, Map_Height), Map_Empty_Color, BF FoodCount_A
51、tOneTime = 2 '地圖上同時(shí)存在的 食物數(shù)量 BombCount_AtOneTime = 1 '地圖上同時(shí)存在的 炸彈數(shù)量 EatCountPerShowPrize = 5 '設(shè)置 蛇每吃進(jìn)多少物品(包括食物和炸彈,獎(jiǎng)品不計(jì))才顯示一次獎(jiǎng)品 curLevel = HscrLevel.Value AddScorePerFood = curLevel '每吃進(jìn)一個(gè) 食物,所增加的分?jǐn)?shù)當(dāng)前的級(jí)別值 AddScorePerBomb = -curLevel * 2 '每吃進(jìn)一個(gè) 炸彈,所扣掉的分?jǐn)?shù) P1.Score = Abs(AddScorePerBo
52、mb) + 1 '玩家的初始分?jǐn)?shù)'每吃進(jìn)一個(gè) 炸彈,所扣掉的分?jǐn)?shù)1 P1.Food = 0 P1.Bomb = 0 PrizeRemain = 0 P1.blnGameOver = False lblScore.Caption = P1.Score lblFoodCount.Caption = P1.Food lblBombCount.Caption = P1.Bomb '初始化P1蛇身 ReDim Snake_P1(START_SNAKE_LENGTH) For i = 0 To UBound(Snake_P1) '設(shè)定蛇身各段的起始位置 Snake_P1(i).X = MAX_COL_INDEX - UBound(Snake_P1) + i Snake_P1(i).Y = MAX_ROW_INDEX '初始化移動(dòng)方向 P1.X_Way = -1 P1.Y_Way = 0 MapPrope
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 制造業(yè)項(xiàng)目標(biāo)準(zhǔn)合同模板
- 合同制優(yōu)化保獎(jiǎng)服務(wù)套餐(7型)
- 裝修裝飾工程合同(三)
- 綠色通道綠化合同
- 租賃合同和解協(xié)議書格式示例
- 車輛質(zhì)押借款正式合同
- 公司簽訂安保人員合同范本范例
- 小學(xué)生拓展思維作文課件
- 臨終關(guān)懷服務(wù)的倫理決策案例考核試卷
- 城市配送與物流配送環(huán)節(jié)的風(fēng)險(xiǎn)防范考核試卷
- 部隊(duì)通訊員培訓(xùn)
- 2024-2030年中國企業(yè)在安哥拉投資建設(shè)化肥廠行業(yè)供需狀況及發(fā)展風(fēng)險(xiǎn)研究報(bào)告版
- 物業(yè)公司水浸、水管爆裂事故應(yīng)急處置預(yù)案
- 第四章第三節(jié)幼兒的親子關(guān)系(課件)-《幼兒心理學(xué)》(人教版第二版)
- 國企投資管理制度
- 部編版三年級(jí)下冊語文作業(yè)本參考答案
- SF-T0095-2021人身損害與疾病因果關(guān)系判定指南
- 2024并網(wǎng)光伏逆變器技術(shù)規(guī)范
- 文言文多文本閱讀:叔向見韓宣子(附答案解析與譯文)
- 工程招投標(biāo)模擬實(shí)訓(xùn)報(bào)告范文2024年
- 系統(tǒng)脫敏治療的長期療效跟蹤評估
評論
0/150
提交評論