『壹』 一個簡單的c語言寫的俄羅斯方塊程序
1、考慮怎麼存儲俄羅斯方塊
俄羅斯方塊的形狀一共有19種類型,如果拿數組來表示的話,可能會比較會浪費空間(網上有很多實現代碼)
考慮到每種方塊形狀的范圍是4 *4的小方塊,用 字模點陣的方式來存儲,即設置一個4行4列的數組,元素置1即代表這個位置有小
方塊,元素置0即代表這個位置無小方塊,這個整個的4*4的數組組成俄羅斯方塊的形狀。
1000
1000
1100
0000
上述4*4來表示L形狀的方塊。
4*4 =16 bit 正好為short類型,所以每一個方塊可以用一個short類型的數據來表示。
我們把俄羅斯方塊點陣的數位存在rockArray中,我們可以事先把這19種方塊的字模點陣自己轉化成十六進制,然後在rockArray數組的初始化時賦值進去。
但是這種方式擴展性不好,每當有一種新方塊時需要改動,
所以可以寫一個配置文件來表示19種方塊。(RockShape.ini)
@###@###@@######1234
從配置文件中讀取方塊的類型的代碼在(Init.h的ReadRock函數中)在下面3中解釋下代碼如何實現
2如何畫出方塊
可以使用EasyX庫來畫出簡單的圖形,
EasyX庫是在VC下實現TC的簡單繪圖功能的一個庫,這個庫很容易學會(直接 網路EasyX庫,裡面有詳細的教程)
那麼如何畫出方塊,方塊已經存儲到一個short類型中了
從short中讀取出,可以用一個掩碼mask = 1來與short的每個bit位相與,結果為1,則畫出一個小方塊;
函數聲明:
void DisplayRock(int rockIdx, RockLocation_t* LocatePtr, bool displayed)1
參數1:表示在數組中的下標,取出short類型的方塊表示數據
參數2:表示當前坐標,即畫出方塊的左上角的坐標x,y
參數3:true表示畫出該方塊,false 表示擦除該方塊。
//方塊在圖形窗口中的位置(即定位4*4大塊的左上角坐標) typedef struct LOCATE
{ int left; int top;
} RockLocation_t;123456
3如何實現同一種類型方塊的翻轉,
在按『↑』時應該翻轉同一種類型的方塊,
比如下面的橫桿和豎桿
@###@###@###@###@@@@############****1234567891011
可以假想成靜態循環鏈表來實現這種方式
使同一種類型的方塊循環起來,
用一個struct結構來表示一種方塊
typedef struct ROCK
{ //用來表示方塊的形狀(每一個位元組是8位,用每4位表示方塊中的一行)
unsigned short rockShapeBits; int nextRockIndex; //下一個方塊,在數組中的下標 } RockType;123456
定義一個RockType類型的數組來存儲19種方塊
RockType RockArray[19] = { (0, 0) };
當我們按「↑」時,把傳入畫方塊函數DrawRock中的rockIndex變為當前方塊結構體中的nextRockIndex即可。
簡單解釋下ReadRock函數的實現:當讀取到空行的時候表示 一種方塊已經讀取完畢,當讀取到****行時 表示同一種類型的方塊讀取完畢,具體看代碼實現,代碼中具體的注釋
4、主要游戲實現的邏輯
貼一個預覽圖吧
註:上述預覽圖的游戲控制區和游戲顯示區在Draw.h的DrawGameWindow()函數實現的
(1)在初始位置畫出方塊,在預覽區畫出下一次的方塊
(2)方塊有兩種行為:響應鍵盤命令UserHitKeyBoard(),自由下落
如果敲擊鍵盤了(w ,a ,s ,d, )空格表示暫停,如果在規定時間內沒有敲擊鍵盤的話,方塊自由下落一個單位
if (kbhit()) //如果敲擊鍵盤了 就處理按鍵
{
userHit = getch();
UserHitKeyBoard(userHit, &curRockIndex, &curRockLocation);
} //沒有 就自動下移一個單位 :不能用else,因為可能按鍵不是上下左右
DWORD newtime = GetTickCount(); if (newtime - oldtime >= (unsigned int)(300) && moveAbled == TRUE)
{
oldtime = newtime;
DisplayRock(curRockIndex, &curRockLocation, false);
curRockLocation.top += ROCK_SQUARE_WIDTH; //下落一格
}1234567891011121314
(3)當方塊落地(即不能下移了)時,判斷是否滿行,如果滿行則消除,然後再判斷游戲是否結束,游戲結束的話,直接退出遊戲
判斷滿行:FullLine()函數,從最底下的一行開始判斷,直到遇到一行空行,
while (count != xROCK_SQUARE_NUM ) //遇到空行 14
{
linefull = true; count = 0; for (int i = 1; i <= xROCK_SQUARE_NUM; ++i)
{ if (game_board[idx][i] == 0)
{
linefull = false; count++;
}
} if (linefull) //滿行,消除當前行,更新分數
{
DelCurLine(idx);//消除滿行
game_socres += 3;
UpdateSocres(game_socres);
idx++;//因為下面要減1
}
idx--;
}
(4)消除滿行
將要刪除的滿行擦除:即將方塊化成與背景色相同的,該代碼為黑色
然後將上面的一行向下移,移一行刪除一行,直到遇到空行
具體看代碼的具體實現 game.h
void DelCurLine(int rowIdx)
(4)判斷方塊是否能移動
在game.h中實現
bool MoveAble(int rockIndex, RockLocation_t* currentLocatePtr, int f_direction)1
**比較當前位置的坐標(左上角)開始,能否放下rockIndex的方塊。
註:f_direction為」↑」的話,則傳入的rockIndex為下一個方塊**
如果不能移動的話,給游戲game_board設置標記表示該位置被佔有
//全局變數-游戲板的狀態描述(即表示當前界面哪些位置有方塊) //0表示沒有,1表示有(多加了兩行和兩列,形成一個圍牆,便於判斷方塊是否能夠移動) int game_board[yROCK_SQUARE_NUM + 2][xROCK_SQUARE_NUM + 2] = { 0 };123
實現過程遇到的一些問題
(1)在快速下落的時候,可能方塊會掉出圍牆的范圍內,
快速下落是使方塊每次下落2個單位距離。
在判斷不能下落時,使當前坐標的top即y減去一個單位的距離
(2)遇到多行滿行時消除不了,
在判斷滿行時,循環找出滿行,找出一個滿行,就消除一行,然後繼續判斷是否滿行,直到遇到空行
『貳』 哪位大神給我講解一下俄羅斯方塊的演算法C語言
首先你得有個俄羅斯方塊界面的概念,它就是M*N的一個2維數組,那麼一個方塊向左移動的極限就是有一個點已經到了最左邊。
拿一個豎條為例,他本身是一個4*4的小格子,當他是豎條時可以看成
0010
0010
0010
0010
向左移動時,只要判斷1是否在左邊邊界,沒有就往左一格,另外要注意邊橫桿時,要先判斷是否最左邊越界,有越界就不能變化
『叄』 最簡單,最基本的俄羅斯方塊C程序~~
前 言
visual basic繼承了basic語言易學易用的特點,特別適合於初學者學習windows系統編程。隨著21世紀信息社會的到來,計算機在人們的工作和生活中的深入,要求我們越來越多地與計算機打交道,為了使用戶在繁忙的日程工作中得到放鬆,於是出現了各種各樣的休閑軟體,如聊天工具,游戲等等。於是我們小組著手設計開始一個這樣的游戲軟體。通過這學期來Visual Basic的學習,我初步掌握了Visual Basic語言的最基本的知識,於是在牛榮和李鵬等老師的指導下動手用Visual Basic編寫俄羅斯方塊游戲。
我們之所以選擇開發俄羅斯方塊游戲,無可爭議,《俄羅斯方塊》是有史以來最偉大的游戲之一。 在曾經發布過的所有游戲中,《俄羅斯方塊》還被認為是僅有的一個能夠真正吸引廣泛人群的作品。誰能說清楚,迄今為止人們究竟花了多少萬個小時在這個游戲上?也許這些時間本來可以被花在更具生產力的活動上。某些批評家也許會聲稱,《俄羅斯方塊》要比過去二十年間出現的任何東西都要浪費人們的時間。至於我們,則要欣然提名它為GameSpot評選出的歷史上最偉大游戲之一。
為了懷念經典,也為了能夠給大多的計算機用戶在工作之餘找到一個休閑、娛樂的一個方式,我們小組開始著手用VB語言開發一個經典的俄羅斯方塊游戲。
工程概況
2.1 項目名稱
俄羅斯方塊游戲
2.2 設計平台
VB 全稱Visual Basic,它是以Basic語言作為其基本語言的一種可視化編程工具。
Vb是microsoft公司於1991年退出的windows應用程序開發工具visual意思是「可視化的」。在它剛推出來時,自身還存在一些缺陷,功能也相對少一些。但是經過多年的開發研究。最近microsoft公司又推出了VB6.0版本
VB6.0運行環境:硬體,要求486以上的處理器、16MB以上內存,50MB 以上的硬碟,cd-rom驅動器,滑鼠。軟體:要求windows 95以上版本。
2.3程序設計思想
游戲是用來給大家娛樂的,所以要能在使用的過程中給大家帶來快樂,消除大家的疲勞,所以我們在游戲中添加了漂亮的場景和動聽的音樂,設置了過關升級的功能,激發大家的娛樂激情。
從游戲的基本玩法出發,主要就是俄羅斯方塊的形狀和旋轉,我們在設計中在一個圖片框中構造了一個4*4的網狀小塊,由這些小塊組合成新的形狀,每四個小塊連接在一起就可以構造出一種造型,因此我們總共設計了7中造型,每種造型又可以通過旋轉而變化出2到4種形狀,利用隨機函數在一個欲覽窗體中提前展示形狀供用戶參考,然後將展示的形狀復制到游戲窗體中進行擺放,在游戲窗體中用戶就可以使用鍵盤的方向鍵來控制方塊的運動,然後利用遞歸語句對每一行進行判斷,如果有某行的方塊是滿的,則消除這行的方塊,並且使上面的方塊自由下落,其中,方塊向下的速度是有時鍾控制項控制的,在游戲中,用戶也可以使用向下鍵加快下落速度,定義一個變數,對消除的函數進行記錄,最後就可以得出用戶的分數,用if 語句對分數判斷,達到一定的積分就可以升級到下一個檔次。
俄羅斯方塊游戲設計的主要步驟為以下10個方面:
(1)游戲界面的設計。
(2)俄羅斯方塊的造型。
(3)俄羅斯方塊的旋轉。
(4)俄羅斯方塊的運動情況(包括向左,向右和向下)。
(5)俄羅斯方塊的自動消行功能。
(6)游戲級別的自由選擇。
(7)游戲速度的自由選擇。
(8)游戲得分的計算。
(9)游戲菜單選項的設計及功能實現。
(10)游戲的背景音樂及特效。
2.4運用的控制項和主要對象
我們在設計過程中主要用到的控制項有:command控制項,image控制項,picture控制項,label控制項,timer控制項,text控制項,windows media player控制項等等。
2.5主要實現的功能
我們開發的俄羅斯方塊游戲,主要實現了以下幾種功能:
1.可以靈活控制方塊在圖形框中運動。
2.游戲過程中方塊可以自由旋轉。
3.當某一行的方塊排列滿時,將自動將這一行方塊消除,然後將上面所有方塊向下移動,可以支持連續消行。
4.游戲前可以選擇游戲的速度和游戲的等級,游戲速度既為方塊下落速度,游戲等級為初始游戲時在基層隨機生成一定行數的無規律方塊,生成的行數由你來選擇,每行至少產生5個以上的無規律方塊,這樣增加了游戲難度,對於游戲高手來說,無疑不是一個新的挑戰。
5.游戲的得分支持積分,並且按照公式:
得分 = 原來分數+ 100 * (2 ^ 同時消除的行數-1)
這樣,你同一時間消除的行數越多,你的得分也就越高,當游戲積分到了一定時可以自動升級,這個升級指速度升級。
6.游戲中提供了一個漂亮的場景和動聽的音樂,給你帶來無限激情。
2.6開發人員
由於這次課程設計所選的題目太復雜,而時間又比較緊張,指導老師建議和同學分工完成。我們小組成員包括組長孫磊周,副組長鄒海星,此游戲由我們兩個人共同開發而成。
正文
3.1游戲設計的具體實現
在我們兩個人共同努力下,此次設計,終於能夠圓滿完成。由於時間的緊促,在設計中,也許會有一些考慮不周之處,但其功能已經能夠滿足大多用戶的需求,相信假以時日,一定能做出一個更經典,更完美的俄羅斯方塊游戲,下面我們將對每一步的具體如何實現展示給大家。
3.1.1游戲界面的設計和背景音樂及特效的實現
俄羅斯方塊游戲主要由兩個界面構成,登陸界面和開始游戲界面,在登陸界面中我們可以首先看到聖誕節的晚上飄梅花的場景,梅花從窗體頂部做函數曲線的下落運動,在窗體中定義一個Image控制項組,在通用中定義梅花X坐標變數動態數組,Y坐標變數動態數組,步距X的變數動態數組,步距Y的變數動態數組,以及振幅變數動態數組。然後在窗體form_load中可以定義梅花的數量,利用隨機函數產生隨機的梅花坐標,步距和振幅,Image控制項在運行時候就調用梅花圖片,Image控制項就可以由時鍾控制項控制下落速度,可以自由調節,梅花按snow(i).Left = xp(i) + am(i) * Sin(dx(i))函數在做縱向的正玄函數軌跡運動,豎直方向上為自由下落運動,,有am(i)來控制梅花的左右移動振幅。因此,我們就可以看到一個梅花在空中自由飄舞的畫面了。
背景畫面是用photoshop軟體處理的漂亮圖案,原本畫面中的動畫效果都是由Image控制項製作的,還有點擊進入游戲的按鈕是由Label控制項實現的,因為Image控制項沒有置前置後功能,不能將下雪的場景體現完整性,所以將這些圖案全部放在背景上,不影響雪花飄落的效果,當點擊畫面的時候一樣可以進入游戲界面。
游戲的背景音樂是由一段代碼調用系統播放器Windows Player播放背景音樂,由於本次設計主要是針對游戲如何設計的,所以在這里就不對播放背景音樂的功能做介紹了。
3.1.2俄羅斯方塊的造型
相信朋友們都玩過俄羅斯方塊,對這個游戲的玩法和方塊形狀都比較熟悉。我們這個游戲只選擇了最基本的7中造型,包括長條型,正方型,正S型,反S型,正7型,反7型,T型。如果需要我們可以添加更多的造型。將游戲界面的游戲區圖片框分割成10*20的小塊,每個小塊放置一個command控制項,預覽區圖片框按同樣比例分割成4*4的小塊,同樣有command控制項構成,我們可以把預覽區圖片框看作是從游戲區圖片框中選取的一個部分,游戲區的小方塊編號和欲覽區編號如下圖:
0 1 2 3 4 5 6 7 8 9
… … … … … … … … … …
… … … … … … … … … …
90 91 92 93 94 95 96 97 98 99
3 4 5 6
13 14 15 16
23 24 25 26
33 34 35 36
游戲區編號 欲覽區編號
利用Select將方塊的7中造型列出,比如長條型的設計,在欲覽區中分別有3.4.5.6和5.15.25.35四個方塊構成兩中形態,用數組為:
m(0) = 3: m(1) = 4: m(2) = 5: m(3) = 6: situation2 = 0
m(0) = 5: m(1) = 15: m(2) = 25: m(3) = 35: situation2 = 1
將它的形狀編號為0和1,在後面方便調用,其他的方塊造型同樣的方法。
3.1.3俄羅斯方塊的旋轉
俄羅斯方塊的旋轉主要將方塊的位置加以變換得到的,例如上述範例,長條型有兩中樣式,根據小方塊的編號變動來實現整個造型的旋轉,比如:
If n(0) - 18 >= 2 And n(3) + 9 <= 198 Then
If cmdfang(n(0) - 18).Visible = False And _
cmdfang(n(1) - 9).Visible = False And _
cmdfang(n(3) + 9).Visible = False Then
hidefang 0
n(0) = n(0) - 18
n(1) = n(1) - 9
n(3) = n(3) + 9
showfang 0
situation = 1
End If
End If
方塊的造型在旋轉的時候存在一個公式,當然首先要判斷是否滿足旋轉的要求,以上是一個長條型由橫著變成豎立狀態的旋轉,我們以它的造型中的第三個小方塊n(3)為中心旋轉,這樣,在開始運動的時候,長條形要發生旋轉最少要運動到第三行,才能由橫著變成豎立狀態,游戲區圖形框中第三行的第一個方塊的編號為20,所以長條造型的第一個小方塊的編號n(0)必須要大於20。同樣,長條型方塊在下落到底部的時候也有限制。如果長條下落到最後一行也將無法由橫著變成豎立狀態。
3.1.4如何實現方塊的運動和自動消除滿行的方塊
我們的這個俄羅斯方塊游戲主要是利用command控制項的visible屬性完成效果的,其實在游戲區圖形框可以看成是由許多的command小方塊組成,方塊運動的過程就是造型里方塊顯示或者隱藏,就像現在的霓虹燈效果一樣,由時鍾控制項控制visible屬性改變的速度,上一層的消失,下一層的顯示,這樣,從視覺效果可以看到方塊的下落運動效果。
方塊在下落的過程中會自動判斷每一行方塊的visible屬性,如果全部為true時,就會將這一行小方塊的visible屬性全部變成false,在將上面的小方塊向下移動,利用for語句進行循環判斷,將所有這樣情況的行改變小方塊visible屬性。當有多行同時出現這樣情況時使用遞歸調用,實現連續消行。具體程序代碼如下:
For i = 190 To 10 Step -10
If cmdfang(i).Visible = True And _
cmdfang(i + 1).Visible = True And _
cmdfang(i + 2).Visible = True And _
cmdfang(i + 3).Visible = True And _
cmdfang(i + 4).Visible = True And _
cmdfang(i + 5).Visible = True And _
cmdfang(i + 6).Visible = True And _
cmdfang(i + 7).Visible = True And _
cmdfang(i + 8).Visible = True And _
cmdfang(i + 9).Visible = True Then
For j = i + 4 To i Step -1
t = 1
cmdfang(j).Visible = False
cmdfang(2 * i + 9 - j).Visible = False
For k = 1 To 4000
DoEvents
Next
t = 0
Next
linenum = linenum + 1
For j = i - 1 To 0 Step -1
If cmdfang(j).Visible = True Then
cmdfang(j).Visible = False
cmdfang(j + 10).Visible = True
End If
Next
clearline '為了實現連消數行,這里使用遞歸調用
End If
Next
3.1.5游戲速度和游戲級別自由選擇
游戲速度的自由選擇無非就是改變時鍾控制項的頻率,我們在菜單中添加了選擇速度的功能,還有添加了考驗功能,將欲覽窗中的方塊造型隱藏,給玩家提高了難度,如果你不願意接受考驗也可以點擊顯示還原成原來狀態。
游戲級別的自由選擇是讓用戶選擇游戲開始時候,游戲區底部出現一定行數的隨機方塊,同樣給玩家增加了難度,功能代碼如下:
For i = 19 To 20 - Val(txthard.Text) Step -1
For j = i * 10 To i * 10 + 9
If Rnd >= 0.5 Then cmdfang(j).Visible = True
Next
Next
可以根據你選擇的難度系數在底層的每一行隨機產生超過半數(即5個以上)以上的小方塊,這樣適合喜歡高難度的玩家。
3.1.6游戲得分的計算和游戲菜單的編輯
游戲得分的計算主要是根據消除的行數來決定的,當然每一次同時消除的行數不一樣,每一行的得分也不一樣,如果你每次消除的行數為1,則最後得分是100分,如果同時消除2行,則最後得分是300分,同時消除3行,得分為700分,同時消除4行,得分為1500分,這由公式:得分 = 原來分數+ 100 * (2 ^ 同時消除的行數-1)。
游戲的編輯,讀者可以參照下面的功能介紹。
3.2 游戲功能的介紹
文件-------開始:開始游戲。
繼續:繼續游戲。
暫停:暫時停止游戲,點擊繼續的時候可以繼續游戲。
退出:退出遊戲。
設置-------選擇游戲級別。
選擇游戲速度。
考驗-------顯示:顯示欲覽去方塊。
隱藏:隱藏欲覽去方塊。
幫助-------操作提示以及版本信息和作者資料。
用戶界面具體如圖:
圖—登陸界面 圖—游戲界面
圖—菜單編輯界面 圖—游戲幫助界面
有關說明
經過兩個多星期的設計和開發,俄羅斯方塊游戲已經成功。其功能基本符合用戶需求,能夠完成游戲的控制,方塊的變換以及消層等功能。並提供游戲設置,對於一些技術性比較過硬的玩家,可以調游戲級別、以及游戲速度,使得玩家能夠充分的發揮競技游戲的特色,可以不斷的挑戰自我,挑戰極限。
4.1游戲設計中的不足之處
但是由於課程設計時間較短,所以該游戲還有許多不盡如人意的地方,比如方塊類型太少,退出遊戲不能存儲進度等多方面問題。這些都有待進一步改善,我們在游戲中還可以更換背景音樂,以適合不同的玩家,在每通過一關可以給玩家播放一段flash,吸引玩家去挑戰極限,不斷提高玩家的興趣,相信在以後的製作過程中我們將給大家帶來一個更新功能更全面的游戲。
4.2VB與C語言之間的不同之處
我們這個小游戲也可以用C語言來實現,在程序的編程上沒有VB語言方便實用,C語言和VB語言之間存在很多的共同點,雖然語法方面有點差異,但是在編程思路上完全一樣,VB能夠實現很多C#不能做到的功能,如When語句、Optional參數、局部Static變數、對象實例訪問靜態方法、Handles綁定事件、On Error處理異常、Object直接後期綁定等等。VB和C#語言,編譯出來的是同樣的CIL,但為什麼VB支持很多有趣的特性呢。我們一起來探究一下。
4.21局部靜態變數
VB支持用Static關鍵字聲明局部變數,這樣在過程結束的時候可以保持變數的數值:
Public Sub Test1()
Static i As Integer
i += 1 '實現一個過程調用計數器
End Sub
我們實現了一個簡單的過程計數器。每調用一次Test,計數器的數值就增加1。其實還有很多情況我們希望保持變數的數值。而C#的static是不能用在過程內部的。因此要實現過程計數器,我們必須聲明一個類級別的變數。這樣做明顯不如VB好。因為無法防止其他過程修改計數器變數。這就和對象封裝一個道理,本來應該是一個方法的局部變數,現在我要被迫把它獨立出來,顯然是不好的設計。那麼VB是怎麼生成局部靜態變數的呢?將上述代碼返匯編,我們可以清楚地看到在VB生成的CIL中,i不是作為局部變數,而是作為類的Field出現的: .field private specialname int32 $STATIC$Test1$2001$i
也就是說,i被改名作為一個類的欄位,但被冠以specialname。在代碼中試圖訪問$STATIC$Test1$2001$i是不可能的,因為它不是一個有效的標識符。但是在IL中,將這個變數加一的代碼卻與一般的類欄位完全一樣,是通過ldfld載入的。我覺得這個方法十分聰明,把靜態變數變成生命周期一樣的類欄位,但是又由編譯器來控制訪問的許可權,讓它成為一個局部變數。同時也解釋了VB為什麼要用兩個不同的關鍵字來聲明靜態變數——Static和Shared。由於局部靜態變數的實質是類的欄位,所以它和真正的局部變數還是有所不同的。比如在多線程條件下,對局部靜態變數的訪問就和訪問欄位相同。
4.2.2Handles和WithEvents
VB除了可以用C#那樣的方法來處理事件響應以外,還有從VB5繼承下來的獨特的事件處理方式——WithEvents。
我喜歡稱這種事件處理方式為靜態的事件處理,書寫響應事件的方法時就已經決定該方法響應的是哪一個事件,而C#則是在代碼中綁定事件的。VB中WithEvents靜態方法是非常有用的,它可以顯著增強代碼可讀性,同時也讓VB.net中的事件處理非常方便,不像C#那樣離開了窗體設計器就必須手工綁定事件。
4.2.3類型轉換運算符
在Visual Basic 2005中將加入一個新的運算符——TryCast,相當於C#的as運算符。我一直希望VB有這樣一個運算符。VB目前的類型轉換運算符主要有CType和DirectCast。他們的用法幾乎一樣。我詳細比較了一下這兩個運算符,得出以下結論:
1.在轉換成引用類型時,兩者沒有什麼區別,都是直接調用castclass指令,除非重載了類型轉換運算符CType。DirectCast運算符是不能重載的。
2.轉換成值類型時,CType會調用VB指定的類型轉換函數(如果有的話),比如將String轉換為Int32時,就會自動調用。
4.2.4默認屬性和屬性參數
在原先的VB6里,有一項奇特的功能——默認屬性。在VB6中,對象的名稱可以直接表示該對象的默認屬性。
4.2.5可選參數和按名傳遞
VB從4.0開始支持「可選參數」這一特性。就是說,函數或子程序的參數有些是可選的,調用的時候可以不輸入。其實VB從1.0開始就有一些函數帶有可選參數,只不過到了4.0才讓用戶自己開發這樣的過程。在VB4里,可選參數可以不帶默認值,而在VB里,如果使用可選參數,則必須帶有默認值。在調用的時候,VB若發現參數被省略,則自動讀取.param部分的默認值,並顯式傳遞給過程。這一部分完全由編譯器處理,而且沒有任何性能損失,和手工傳遞所有參數是完全一樣的。至於按名傳遞,VB會自動調整參數的順序,其結果與傳統方式的傳遞也沒有任何的不同。這說明我們可以放心地使用這項便利。而且帶有可選參數的過程拿到C#中,頂多變成不可選參數,也不會造成什麼其他的麻煩。
PS.很多COM組件都使用了默認參數,而且有些過程的參數列表非常長,在VB里可以輕松地處理它們,而在C#中經常讓開發者傳參數傳到吐血。
4.2.6在經過對比之後可得以下一個結論:
1.目前的主流編程語言沒有簡單的,如果你想學精通的話。
2.VB的門檻比較低,編程思想較容易接受。
3.學習C不能短期內見到成效。
4.據用戶調查69%的考生覺得VB更容易接受
致謝
在本次課程設計中,我從指導老師牛榮和李鵬身上學到了很多東西。老師認真負責的工作態度,嚴謹的治學精神和深厚的理論水平都使我收益匪淺。他無論在理論上還是在實踐中,都給與我很大的幫助,使我得到不少的提高這對於我以後的工作和學習都有一種巨大的幫助,感謝他耐心的輔導。
另外,在游戲開發過程中化希耀老師和杜義君老師也給於我們很大的幫助,幫助解決了不少的難點,使得游戲能及時開發完成,還有所有的同學同樣給與我不少幫助,這里一並表示感。
參考文獻:
[1]Vsual Basic 程序設計教程 作者:龔沛曾,陸慰民,楊志強 高等教育出版社出版
[2]Vsual Basic 6.0程序設計 作者:劉新民,蔡瓊,白糠生 清華大學出版社出版
[3]80例上手 VB6 編程 作者:唐凱軍,湯惠莉 山東電子音像出版社
[4]Vsual Basic 實例教程 作者:盧毅 科學出版社出版
[5]Vsual Basic 經典範例50講 作者:趙欣勝,亢慧娟,劉晟宏 科學出版社出版
『肆』 俄羅斯方塊下沉模塊C語言怎麼理解
首先,要把這七個方塊用一種數據結構存儲起來
其次,在游戲中將這七個方塊隨機挑選出來並顯示在屏幕上,根據鍵盤事件進行旋轉
最後,判斷到達底部的方塊是簡單疊加還是引發消除事件
另外,對這個游戲來說,還有一些記分和過關加速的規則
『伍』 俄羅斯方塊 c語言編程思想 怎麼實現的一個思路
1.定義各基本的圖形單元,並把它們實現。
2.定義顯示區域中行、列數,實現可以按1中定義的單元進行填充(顯示)
3.定義數據結構,進行各行填充滿時的判斷,此時可以進行消除。並把上面各行依次下移。
(注意:1中定義的圖元,在下落到最底行時,就不必要保持圖元的信息,而是把相對應的2中
定義的行列區域進行填充,這實際上就是3中定義的數據結構的操作,圖形只是按照數據結構
中對應的定義顯示出來而已,實際上,你先把3定義好之後,再做1,2更合適)
4.加上對圖元的控制(加快速度,左右翻轉,左右移動)
5.增加積分設計,增加分值對速度的影響等。
6.增加其它好玩的設計,如:爆炸效果、消除時的特效等等。
7.有耐心的話,增加其它元素,如:連網對戰,雙人對戰,歷史積分記錄等等功能。
8.圖形美化,等等其它細節。
『陸』 用c語言編寫俄羅斯方塊程序 求詳解
1、用C語言繪制圖形界面
EasyX圖形庫(http://www.easyx.cn)即TC的圖形庫在VC下的移植。
包含庫#include <graphics.h>
先初始化圖形窗口
initgraph(WINDOW_WIDTH, WINDOW_HIGH) ;WINDOW_WIDTH為窗口的寬頻,WINDOW_HIGH為窗口的高度。
清空繪圖設備
cleardevice();
設置畫筆顏色
setcolor(RED) ;
設置線條風格
setlinestyle(PS_SOLID, NULL, 0);
畫矩形
rectangle
還有畫線、顯示文字等函數,可以參照其幫助文檔。
注意:由於我們用的是EasyX圖形庫,故源文件後綴要為.cpp,但其中內容都是C的語法。
2、存儲表示出俄羅斯方塊的形狀
一、我們可以用編號,不同的編號代表不同的俄羅斯方塊,根據編號把不同方塊的畫法寫在代碼中,這樣19種
方塊就得有19種相應的代碼來描繪。而且這樣擴展性不好,若以後設計了新的方塊,則需要更改大量源代碼。
二、我們很自然的想到可用字模點陣的形式來表示,即設置一個4行4列的數組,元素置1即代表這個位置有小
方塊,元素置0即代表這個位置無小方塊,這個整個的4*4的數組組成俄羅斯方塊的形狀。
1000
1000
1100
0000
我們把俄羅斯方塊點陣的數位存在rockArray中,我們可以事先把這19種方塊的字模點陣自己轉化成十六進制,然後在rockArray數組的初始化時賦值進去。
但這樣做未免有點太費力,且擴展性也不太好,若以後設計的新方塊種類加入,要改變數組rockArray中的值。
我們可以考慮把所有俄羅斯方塊的點陣存儲在配置文件中,在程序初始化時讀取文件,把這些點陣轉換成unsigned int的變數存儲在rockArray中。
這樣,以後我們增添新的方塊形狀只需要在配置文件中增加新的點陣即可。
@###
@###
@@##
####(為使得看起來更醒目,我們用@表示1,用#表示0)
3、讓圖形動起來
在某位置處用函數DrawRock在屏幕上畫出俄羅斯方塊,然後再擦除掉(即用背景色在原位置處重繪一次方塊),最後在下落的下一個位置處用函數DrawRock在屏幕上畫出俄羅斯方塊,如此循環,中間用計時器間隔一段時間以控制下落的速度。
同理,按下屏幕的左右鍵也是如此,只是在按下鍵盤時把方塊的位置重新計算了。
那麼按下上方向鍵時,如何讓方塊翻轉呢?
我們在配置文件中就把方塊的順時針翻轉形態放在了一起:
@###
@###
@@##
####
@@@#
@###
####
####
@@##
#@##
#@##
####
##@#
@@@#
####
####
我們每按一次上方向鍵改變一次方塊的形狀即可。若一直按上鍵,形狀應該是循環地翻滾。
我們想到了循環鏈表的數據結構可實現這個效果。
可是我們若把這些一種類的方塊的各種形態串成循環鏈表形式,那麼每次重新生成方塊時我們就難以隨機地生成方塊了。
故還是得用數組來存儲,但又要有循環鏈表的功能,於是我們想到了靜態循環鏈表。
我們用結構體來作為一個方塊在rockArray中的元素
typedef struct ROCK
{ //用來表示方塊的形狀(每一個位元組是8位,用每4位表示方塊中的一行)
unsigned int rockShapeBits ;
int nextRockIndex ; //下一個方塊,在數組中的下標
} RockType ;
這樣,當我們按下上方向鍵時,把傳入函數DrawRock中的rockIndex變為當前方塊結構體中的nextRockIndex即可。
『柒』 俄羅斯方塊下降的速度是通過什麼技術實現的
俄羅斯方塊實現下降速度使用編程技術:JAVA,C語言,C#。
俄羅斯方塊
俄羅斯方塊是款非常流行的小游戲,通過七個方塊的旋轉和位移,構成各種變幻莫測的圖案。而游戲者也在不斷的疊加和消除中找到樂趣。
從編程的角度來說,這個游戲混合了鍵盤事件,定時器,隨機數,滑鼠事件(如果沒有菜單,這個也不是必需的),數據結構比較清晰,演算法比較靈活,圖形是比較簡單的矩形,所以很適合剛學習完某種語言的語法又想做點什麼的初學者。
本文使用的語言包括:c(Turboc2.0,VC6.0),JAVA(Applet),c#(.NET2003)
編寫這個游戲的基本過程是:
首先,把這七個方塊用一種數據結構存儲起來
其次,在游戲中將這七個方塊隨機挑選出來並顯示在屏幕上,根據鍵盤事件進行旋轉
最後,判斷到達底部的方塊是簡單疊加還是引發消除事件
另外,對這個游戲來說,還有一些記分和過關加速的規則,這些會穿插在上面的內容中講述。
1存儲和旋轉七個方塊
對於OOP語言(JAVA,C#)來講,可以寫一個數據結構類,處理本游戲中的全部數據。在界面中調用這個類,以實現界面操作與數據結構分離。在後面展示這兩個數據結構類的時候,會發現除了語法外,這兩個類是基本相同的(把C#的類改了改,再加上鍵盤操作就成Applet了)。
對於過程化語言(c)來說,界面顯示函數與數據結構函數地位相當,所以在形式上稍微分分就行了。
1.1存儲七個方塊
普通俄羅斯方塊游戲中,只有七個基本方塊:|,Z,N,L,7,|-,O,如果加上旋轉,一共是19種方塊(要注意哦,最後一個正方形的方塊不能旋轉)。這19種方塊都可以畫在一個4*4的方格中。
於是就有兩個方法:一個是只存儲七個方塊,在游戲運行的時候計算旋轉後的方塊形狀;另一個是將19種方塊全部存儲起來,在游戲運行的時候計算取其中的哪個方塊。
另外,考慮到4*4是16,而一個int正好是16位(TC2是16位,其他的是32位),所以可以把一個方塊存儲在一個int數據中,取出的時候,判斷它的每個bit位,為1處有小方塊,為0處是空白。
分別用二維數組和bit的方法來表示這19個方塊:
int blocks_shape[19][16]={
0,0,0,0,1,1,0,0,0,1,1,0,0,0,0,0,/*11*/
0,0,0,0,0,1,0,0,1,1,0,0,1,0,0,0,/*12*/
0,0,0,0,0,1,1,0,1,1,0,0,0,0,0,0,/*21*/
0,0,0,0,1,0,0,0,1,1,0,0,0,1,0,0,/*22*/
0,0,0,0,1,1,1,0,1,0,0,0,0,0,0,0,/*31*/
0,0,0,0,1,0,0,0,1,0,0,0,1,1,0,0,/*32*/
0,0,0,0,0,0,1,0,1,1,1,0,0,0,0,0,/*33*/
0,0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,/*34*/
0,0,0,0,1,0,0,0,1,1,1,0,0,0,0,0,/*41*/
0,0,0,0,0,1,0,0,0,1,0,0,1,1,0,0,/*42*/
0,0,0,0,1,1,1,0,0,0,1,0,0,0,0,0,/*43*/
0,0,0,0,1,1,0,0,1,0,0,0,1,0,0,0,/*44*/
0,0,0,0,0,1,0,0,1,1,1,0,0,0,0,0,/*51*/
0,0,0,0,0,1,0,0,1,1,0,0,0,1,0,0,/*52*/
0,0,0,0,0,0,0,0,1,1,1,0,0,1,0,0,/*53*/
0,0,0,0,1,0,0,0,1,1,0,0,1,0,0,0,/*54*/
0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,/*61*/
0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,/*62*/
0,0,0,0,1,1,0,0,1,1,0,0,0,0,0,0,/*71*/
};
注釋里第一個數字表示方塊編號,第二個數字表示該方塊的第幾個變形。
private int[] blocks_shape = {3168,1224,1728,2244,3712,2188,736,3140,2272,1100,3616,3208,1248,1220,228,2248,3840,17476,3264};
顯然,第二種方法節約了一些內存。
1.2旋轉七個方塊
在游戲中計算旋轉後的方塊形狀:
這個其實就是考考二維坐標知識。還是不貼圖。先在腦袋裡想像一個4*4的方格,上面有個|-。|佔三個方格的長度,-佔一個。以左下角為原點,從左向右畫x軸;從下向上畫y軸。如果在游戲中想逆時針旋轉方塊,就把這個坐標軸順時針旋轉一次。多想幾遍得到結論:原來的x坐標與新的y坐標相同,原來的y坐標與新的x坐標方向正好相反。這里的「相反」意思是,原來是4,現在是1,原來是2,現在是3。語言不好表達啦,不過想通的話就很容易理解。
在游戲中計算調用19個方塊中的哪個方塊:
將19個方塊存入數組後,再設一數組告訴程序哪七個下標是七個基本方塊。比如:private int[] start_bricks = {0,2,4,8,12,16,18};每次隨機產生的方塊下標都為start_bricks里的元素。當游戲者旋轉方塊時,將當前方塊下標加1,再判斷加1後的下標是否在start_bricks里。如果在的話,說明已經是另一個形狀了,舍掉,使用start_bricks里原來的下標。最後根據此下標在blocks_shape數組中取出形狀,顯示在屏幕上。
看看代碼。
private int[] bricks = {3168,1224,1728,2244,3712,2188,736,3140,2272,1100,3616,3208,1248,1220,228,2248,3840,17476,3264};
private int[] start_bricks = {0,2,4,8,12,16,18};
/*mid是當前方塊在bricks中的下標*/
for(i=0;i<7;i++)
{
if(mid+1==start_bricks[i])
/*如果mid加1後是start_bricks中的元素*/
/*則還是取start_bricks中原來的元素,即七個基本方塊之一,不讓它變形*/
mid=start_bricks[i-1];
}
2方塊落下的處理
2.1判斷方塊已經到達底部或是否碰到牆壁
不論是用二維數組還是用bit的方法存儲的方塊,最終都需要遍歷方塊的16個小方塊中為1的地方是否將會碰到障礙物。「將會」指的是方塊如果向左,向右,向下移動後就會碰到障礙物;「障礙物」指的是左右下牆壁和底部已經落下未被消除的小方塊。
比較困難的地方,就是把為1的地方轉換為相應的坐標,用此坐標判斷是否碰到了障礙物。用旋轉的辦法比較簡單,根據旋轉的方向轉換一下坐標就可以了。如果採用存儲19個方塊的方法的話,直接看下程序:
用二維數組:
/*遍歷16個小方塊*/
for(j=0;j<16;j++)
{
/*此處有小方塊,判斷它是否碰到障礙物*/
if(blocks_shape[i][j]==1)
{
/*a,b是方塊左上角坐標,aaa,bbb是新得到的小方塊的坐標*/
aaa=a-1+j/4;
bbb=b+j%4;
if( ( aaa==h )||( aa[aaa][bbb]>0 )||( bbb<0 )||( bbb>9 ) )
/*aaa==h表示該小塊已經到達底部;aa[aaa][bbb]>0表示底部該位置已經有了小方塊*/
{
/*返回false,表示會碰到障礙物*/
return false;
}
}
}
用bit與此類似,只是多了一個移位處理:
for(int i=0;i<16;i++)
{
/*num是當前方塊的int值,a,b是當前方塊的左上角坐標*/
if( (num>>(15-i)&1)!=0 )/*此位為1*/
{
if( (a+i/4>22)||(b+i%4<0)||(b+i%4>11) )/*取得新坐標並加以判斷*/
{
flag=false;
break;
}
if( (arr[a+i/4][b+i%4]>0) )/*底部該位置是否有已經落下的小方塊*/
{
flag=false;
break;
}
}
}
2.2消除一行
判斷到方塊落下後,就開始檢查是否有滿足消除條件的行了。
規則很簡單:只要某行被小方塊全部填充,該行就被消除,上面的小方塊全部下移一行。所以,只要把原來的小方塊全部擦去,計算完新方塊位置後,再全部畫出就可以了,計算的時候,可以遍歷整個游戲區域,看有沒有可以消除的行。但是在實際編程中就會發現,這樣的設計雖然簡單,但是計算量大,而且會引起閃爍(因為是整個擦除和重畫),效果不是很好。仔細觀察這個游戲,就會發現,其實每次消除的時候,只要判斷當前方塊所在的四行就足夠了。在編程的時候,還可以為方塊設一個最高高度h,每次刷新的時候,只刷新從h到當前方塊底部的行。雖然這樣有點煩瑣,但是節約了計算時間,減少了重繪面積,效果還是挺明顯的。
另外,一些關於這個游戲演算法的介紹,有人建議把隨機產生下一個方塊的計算放在當前方塊正在下落的時候,因為那時比較空閑。總之,只要用心去想,一定會寫出代碼緊湊,資源利用合理,界面舒適的游戲。
『捌』 用c語言編寫俄羅斯方塊的程序
這里把游戲的關鍵設計放在三個盒子和一個坐標上:
大盒子:一個兩維數組,記錄著方塊點陣的開與關(把游戲的舞台想像
成一個點陣),在下面也把這個東西稱為地圖
兩個5*5小盒子:兩維數組,一個盛放著正在下落的方塊,一個盛放在
下一個下落的方塊(即next),當然這兩個也必須想像成一個點陣:如長條
的點陣為:
00000
00100
00100
00100
00100
現在你只要有這么一個概念:一個不斷定時下落的小盒子從大盒子頂
部下降到底部,之後再將next盒子放在下落盒子,再進行下一輪的下落...
中間的控制等尚不要太著急.
現在面臨著一個問題:
下落的盒子和地圖之間要怎麼聯系起來?
一個好的方法是再定義一個坐標:x,y,保存著小盒子左上角在地圖上對應
的下標(位置),即當x
=
0,
y
=
0時,小盒子處於地圖的左上部.如此,當
小盒子需要移動時,即只須要改變x,y的值.
現在說說旋轉.
小盒子保存著當前下落形狀的點陣,那麼旋轉就只須要將這個點陣旋
轉90度:例如:
00000
00000
00100
00000
00100
->
01111
00100
00000
00100
00000
這一點實現起來還是不太難的.
判斷碰撞
通常這種情況只須要在有移動小盒或旋轉盒子時發生:也即點陣非空
是互斥的,當小盒要向下移(x++)時,如果小盒裡的點陣與地圖上的點陣(非
空的地方)重疊,則不能下移,(卡住了),旋轉則轉換後的形狀與地圖有沖
突則要放棄旋轉.
到了這里,你應該有一個大概的了解了,至於怎樣在屏幕上畫出來,這
個是比較簡單的,下面的代碼會慢慢與你解釋.
*/
/*接下一貼*/
『玖』 我在VC環境下使用C語言編寫俄羅斯方塊,怎麼實現方塊自動下落
圖片往下重畫再刷屏啊。
『拾』 C語言中俄羅斯方塊怎麼做
當時做得時候工具用turboC
2.0開發的,課程設計.
具體的代碼網上可以搜到很多,我就不細說了.
當時編碼的時候,通常把俄羅斯方塊的編碼工作分成幾個小塊完成,我描述一下:
1.
當前下落塊的控制邏輯.
2.
用戶輸入的控制邏輯,這個是用中斷控制,比如bioskey()函數去獲取當前的輸入值,具體的我記不清了.
3.
判斷一行是否能夠消去邏輯(公共環境是用20*12的數組來存放.)
4.
難度以及其他配置模塊管理,模塊劃分清楚之後,編碼較為容易.
希望可以有幫助:
)