DarkBASIC 程式設計/原始單頁版本
一些課程可能不完整或根本沒有完成。如果你覺得自己能夠勝任,請貢獻你的力量!
首先,感謝您檢視這本關於 DarkBASIC 的書籍。這是關於 DarkBASIC 程式設計的第一本 WikiBook。並非每個人都能程式設計,但在資訊時代,我相信每個人都有必要掌握使用不同型別技術的技能。特別是,計算機和程式設計。今天和接下來的 30 天,你將學習很多關於 DarkBASIC 程式設計的知識,以及你使用計算機可以實現的目標。DarkBASIC 就是關於讓 DirectX 按照你的意願行事,以及你在計算機遊戲程式設計世界中的統治地位。我希望你能閱讀併為本書做出貢獻,以及發表你的抱怨,因為這樣我才能修復問題,其他人也會受到啟發。希望您喜歡!
在本教程中,我將假設你沒有任何程式設計經驗,否則你不會閱讀這本書。你可能會拿起手冊,將其與 C++ 進行比較,然後輕鬆地在 DarkBASIC 中進行程式設計。首先,不是為了嚇唬你,但遊戲程式設計並不容易,其次,你不會在 DarkBASIC 中很快就能製作出 <插入模仿大片遊戲> 的殺手級作品或克隆版或其他任何東西。我還將假設你擁有“經典”或非專業版 DarkBASIC 的 v1.0 版本,否則使用其他版本,你可能會遇到一些執行程式碼的問題。程式設計不是一個新概念,並且有數百種程式語言,例如 DarkBASIC,其中一種與 DarkBASIC 可比的程式語言是 BlitzBASIC,你可能聽說過 Visual Basic。
這不是一個愚蠢的問題。程式設計不僅僅是為 Windows 製作應用程式,或者用計算機理解的語言進行交流。程式設計是輸入、處理和輸出。如果你學習計算機科學,你可能會做程式大綱,但現在你是業餘程式設計師,所以讓我們保持簡單。並非所有人都瞭解 VC++ 或 Pascal。DarkBASIC 面向遊戲。你可以在其中製作應用程式,但比較困難。在我們使用的版本中沒有訊息框。但 DarkBASIC 簡單有趣,特別是對於初學者和初級程式設計師。無需編寫 1000 多行程式碼來將 2D 角色顯示在螢幕上,你只需編寫一行程式碼;無需編寫一個龐大的程式來使立方體旋轉,你只需用 20 行或更少的程式碼編寫一個簡單且易於閱讀的程式。如果你沒有耐心,請慢慢來,不要在你完全理解之前就繼續前進,否則在你完成這本維基百科書籍之前,你就會禿頂。我要說的是:這本書正在進行中。我會盡快完成,所以請耐心等待。程式設計就是簡單地輸入程式碼行,這些程式碼行一旦編譯或執行,就會告訴計算機執行一項任務,直到完成為止。涉及的內容包括輸入,也就是你的程式設計;處理或計算;最後是輸出,也就是你看到的內容。
圖 1.1(這是輸入、處理和輸出模型。)所以你知道:編碼器是程式設計師的另一個名稱。
所有程式都遵循上述方法,因為每個程式都(1)肯定是被程式設計的,(2)肯定會被編譯,(3)肯定顯示結果。那麼,程式碼到底是什麼呢?程式碼是程式的配方。計算機不會犯錯。你會犯錯。為了防止程式執行可能損害計算機的任務,編譯器(或檢查程式是否有效的程式)會執行程式並生成語法錯誤(如果有錯誤)。這些語法錯誤會告訴你你犯了一個錯誤,你必須在檢視程式之前修復它(在大多數情況下)。所以,計算機不會犯錯。
還有很多型別的錯誤!最常見的一種稱為語法錯誤。語法錯誤是程式程式碼中的錯誤。如果程式語言像書面語言一樣包含胡言亂語,那就是錯誤的。就像在英語中,asdfjdj 不是一個單詞,它是胡言亂語。就像在 DarkBASIC 中,print 是一個命令,而 printf 不是。另一種錯誤稱為執行時錯誤,這是指你的程式編譯成功,但你沒有得到想要的結果。例如,如果你的寫作很糟糕,“hello”這個詞可能看起來像 jello,而接收者會從中獲得錯誤的資訊。執行時錯誤是不應該發生的事情,就像在你最喜歡的電子遊戲中,角色有時可以穿過牆壁,或者程式在發生這種情況時崩潰。
修復錯誤的過程稱為除錯。你將對此感到熟悉;你將花費一半以上的時間進行除錯。因此,儘可能地儲存、編譯、除錯和執行。這將為你節省很多憤怒和壓力。最後記住這一點:對於計算機來說,語言會經過彙編或轉換為二進位制,然後傳送回你的程式語言。如果二進位制模式正確,則沒有語法錯誤。記住,0 表示關閉或假,1 表示開啟或真。還記得我上面提到的彙編嗎?
好的,以下是它的工作原理。首先,你編譯或檢查語法,然後你輸入的程式碼會經過所謂的機器語言或組合語言(它的名稱根據它在編譯其彙編程式時的作用而變化)。然後它變成純二進位制檔案(對人類不可讀,但適用於計算機;它們除了 0 和 1 之外什麼也無法理解)。然後它被髮送回編譯器,如果二進位制檔案與正確的內容匹配,它就會被執行。如果不匹配,則會出現語法錯誤,需要除錯。現在,不要引用我的話,但基本上就是這樣。所以現在你已經準備好開始用 DarkBASIC 程式設計,並且會明白我在說什麼。
還有一件事:DarkBASIC 不區分大小寫。如果你不知道這意味著什麼,那就是 DarkBASIC 不區分大寫字母和小寫字母。
好吧,你回來了。很好,希望你已經嘗試過 DarkBASIC 編輯器了。在你瞭解 Hello World 傳統是什麼之前(老程式設計師不要劇透!),我想我應該告訴你一些事情。DarkBASIC 編輯器不太友好,所以請確保你下載了你喜歡的 IDE,然後將其連結到 DarkBASIC。
所以你知道:IDE 是整合開發環境。它使程式設計師,無論專業還是新手,都能更容易地進行程式設計。目前,不要太擔心 IDE 是什麼,畢竟你才剛剛開始。
好了,現在是時候進入傳統了。
程式碼
Print "Hello World!" Print "This is Dbtutor's wikibook on DarkBASIC Programming!!"
程式碼結束
將此原始碼複製並貼上到 IDE 或編輯器(無論哪個)中並執行它。你得到的是你在 DarkBASIC 中編寫的最簡單的程式。Hello World 示例是初學者程式設計師的傳統,所以讓我們繼續發揚光大。Hello World 程式在螢幕上顯示文字“Hello World”。但是引號有什麼用呢?引號用於顯示你想要在螢幕上顯示的內容。否則,它看起來就像一個大命令。
你的任務
將 Hello World 替換成你想要的任何文字
首先,我希望你完成了上面的任務。如果你沒有完成,或者在這個程式中遇到了問題,我將向你展示如何操作。好的,假設你想列印幾件事,並且你需要對其進行空格以提高可讀性。還記得我說過 Print 會列印引號內的內容嗎?嗯,它們被稱為字串,字串是可以更改和操作的字元。如果沒有要列印的字串,你只會得到一個空白。現在,對於所有在一行上的內容,你使用分號(;)。嘗試使用上述兩種方法,直到你理解它們。在 DarkBASIC 中,你的程式本身就已經結束了,不是嗎?
但是,如果你在程式需要退出的地方使用“end”命令,這是一個好習慣。所以在 Hello World 中的 Print 命令之後,插入命令“end”。現在,轉到檔案並構建 EXE,將 EXE 儲存到任何你想要的資料夾中並執行它。從技術上講,它應該只是一個一閃而過的畫面,你無法看到它。這就是你需要某種等待系統或輸入來讓你看到結果的地方。所以刪除 exe 並重新開啟 DarkBASIC,在我們的 Hello World 中,在 end 命令之前插入一個 wait key。Wait key 的作用是允許使用者按下任意鍵以結束程式,所以重新構建此程式的 exe,然後執行它。這個程式不太友好,是嗎?在程式頂部新增以下命令
程式碼
Set window on Set window layout 1,1,1 Set Window title "Hello World - A Friendly Greeting From DarkBASIC" Set window position 100,200 Set window size 640,480
程式碼結束
現在執行 Hello World 程式,看看發生了什麼?我們現在有一個不錯的視窗友好環境。但是,如果你在另一臺具有不同設定的計算機上,你會錯過一些文字,而且這些數字到底代表什麼?好的,這些數字是 X 座標和 Y 座標,如果你在學校沒有學過數學,X 是水平方向,Y 是垂直方向。如果你不知道這些詞的意思,X 向左或向右執行,或橫向執行,而 Y 向上或向下執行。所以 X 和 Y 是兩個軸,所以我們有兩個維度,當我們進入 3D 時,預計會有一兩段關於維度的解釋。現在,讓我們進入今天最後一部分,瞭解如何更改文字顯示的位置。
程式碼
Set cursor 1,50
程式碼結束
在第一個 Print 語句的正上方插入這段程式碼。我們的程式現在很長了,我們也可能忘記了上面一些內容的作用。歡迎使用註釋,Rem 命令允許你新增備註,Rem 之後的所有內容都會被忽略。你應該始終為你的程式碼添加註釋,以便其他人能夠理解它,並且以便你能夠知道你在編碼時在想什麼以及為什麼這樣編碼。記住,要大量添加註釋!!
所以你知道:Rem 是 Remark 的縮寫,如果我還沒有告訴你,BASIC 代表初學者通用符號指令程式碼。
以下是你的程式最終的樣子,大致上
Hello World 程式結果
Rem Setup the window Set window on Set window layout 1,1,1 Set window title "Hello World Program" Set window position 100,200 Set window size 640,480 Rem put the first line of text 50 pixels down Set cursor 1,50 Print "Hello World!" Print "A friendly greeting from DarkBASIC!" Rem wait for the press of any key Wait key Rem then end End
程式結束
在我們離開之前,這裡有一個小測驗
- 在 DarkBASIC 中,字串以什麼開頭
- A)#
- B)*
- C)'
- D)"
- 它們以什麼結尾
- A)%
- B)^
- C)&
- D)"
- BASIC 代表
- A)初學者通用符號指令程式碼
- B)熊正在故意偷國際餅乾
- C)初學者字母數字字串資訊程式碼
- D)開始所有插入的符號智慧編碼
- 在 2D 中,有兩個軸,它們是
- A)U & V
- B)X & Y
- C)U & V(在紋理中),X & Y 也是
- D)Z & U
- Rem 可以為多少行添加註釋
- A)1 行或多行
- B)1 行或更少
- C)單行
- D)雙行
好的,以下是答案,不要作弊!
- 1 & 2 顯然是 D。
- 3 是 A。
- 4 如果你選擇的答案不是 Z & U,那麼你應該走上正軌了,但 C 是最佳答案,而
- B 可以被認為是最正確的答案。
- 5 是 C。
嘗試使用 IDE 和 DarkBASIC 視窗命令。完成後,為 Hello World 程式添加註釋。編寫一個僅包含註釋的程式。在維基百科上查詢 IDE。瀏覽 DarkBASIC 網站(http://www.thegamecreators.com)。
== End of Lesson ==
好吧,我們快到體驗 DarkBASIC 程式設計的第一週結束的時候了,或者至少是這本書的結束!好的,基礎知識都是關於邏輯、開發程式、設計、設定展望和構建模組。這與應用程式無關,它更側重於遊戲,因為 DarkBASIC 用於遊戲程式設計。你將瞭解條件、變數、邏輯等等。記住,之前我提到過 0 和 1,更好的理解方式是 TRUE 和 FALSE。DarkBASIC 很簡單,所以沒有布林運算子,還是有的?假設你宣告一個名為 A 的變數。目前 A = 0,直到我們說 A = 1,還有一個名為 B 的值,它等於 1。如果當 A 或 B 為真時,C = 1,或者當 A 和 B 都為真時,C = 1,但如果這兩個值都不為真呢?然後我們將不得不使用另一個值,我們的程式很快就會變成這樣
- if A or B = 1
- C = 1
- else
- D = 1
- endif
這就是邏輯,這就是條件,這就是 if/endif 命令。上面我沒有縮排,我應該縮排的,所以任何時候你使用 if/endif,我都希望你為使用的語句縮排,好嗎?如果你複製/貼上了上面在 DarkBASIC 中的程式碼段並編譯它,你不會得到任何錯誤,但是如果你執行這個程式,你將一無所獲。為什麼?它們只是值,實際上沒有涉及到螢幕輸出,所以讓我們稍微修改一下這個程式。
簡單的條件語句程式
Rem we can also use a ` to comment quickly I will do that Rem from now on! `Declare some variables a = 1 b = 0 `The conditional statement if a or b = 1 c = 1 else d = 1 endif if c = 1 then Print "Condition C is Met" if d = 1 then Print "Condition D is Met" wait key end
如你所見,我在上面使用了變數,如果你不知道,變數是儲存可以更改的資料的一種方式。如你所見,如果我將 OR 運算子更改為 AND b = 1,那麼我們將面臨一個全新的挑戰。但是讓我們稍微岔開一下話題,如果你想刪除螢幕上的文字,你必須使用“cls”命令,這意味著清除螢幕。你還可以透過在 cls 命令後簡單地新增一個 0 到 255 之間的值來更改 cls 的透明度值。在接下來的幾課中,我將向你展示如何將螢幕顏色更改為你想要的任何顏色!你可能想知道 DarkBASIC 中的變數,大約有三種資料型別
Rem Clear the Screen cls Rem String Data "Wikibooks rock!" "My name is John Smith" "Look I'm a string!" Rem the number below is a real number or a floating point decimal 35.5555 Rem the number below that is an integer number 12345 wait key end
就是這樣!為了養成良好的習慣,在所有程式的開頭都使用 cls,在其他語言中,除非你清除螢幕,否則螢幕上會保留上次修改的文字。縮排也很重要,但我們稍後再討論。那麼為什麼要添加註釋或縮排呢?在團隊合作或開源專案中,它使你的程式更易於人類閱讀,而且更容易閱讀和定位,此外,當你以後回到你的專案時,你需要記住發生了什麼,你可能會忘記。回到變數,你可以隨意命名變數,但要確保它們不要太長,並且簡要描述它們的作用或用途。
以下是一些變數示例
string$ = "Hey I'm a string and I love it!" float# = 333.445 integer = -11111
那麼為什麼變數前面有符號呢?這表明我們正在處理哪種型別的變數,$ 是字串?實數或浮點數是 #,在某些語言中,值前面沒有符號,這可能會讓人有點困惑。所以,這再次提高了人類的可讀性。因此,在設計軟體時,請確保其原始碼易於人類閱讀!養成良好的程式設計習慣,例如縮排——它將為你和其他人節省時間。目前,清空你的思緒,明天再回來。
好了,是時候輸入一些除了按下任意鍵之外的內容了。難道你不想自己製作一個像 Mad Libs 這樣的遊戲嗎?我現在正在用 Visual C++ 製作一個,在 DarkBASIC 中,你必須使用 Input 命令。Input 命令需要一個提示(可選),然後是一個變數來儲存接收到的輸入。那麼這會是什麼樣子呢?
Remstart Input Example By Dbtutor Yes you can have groups of comments Remend Input "Insert Name Here ",name$ Print name$;" is your name"
還記得分號嗎?嗯,它們也可以將你的字串與變數分隔開來(即使它是一個奇怪的另一個字串)。你也可以將輸入作為單個變數輸入,所以它看起來像這樣。
Input a$
哦,是的,你也可以使用浮點數和整數進行輸入!在我使用逗號的地方,你也可以使用分號,如果你更喜歡的話。Remstart 意味著它之後的所有內容都是註釋,所以要注意,它會將所有內容都變成註釋,直到你使用 Remend 命令。如果你在 DarkBasic 中進行資料庫程式設計(不建議這樣做,我建議使用 Visual Basic 代替!)並且有一百個需要儲存在變數中的客戶怎麼辦?你可以使用 Dim 命令!
Dim arrayname(arrayvalue,arrayvalue2(optional),arrayvalue3(optional) arrayname(arrayvalue) = value
讓我展示一個更深入的例子,你仍然可以使用字串、整數和浮點數,只要你遵循規則(記住前面是否有符號!)。
一個好的 Dim 語句
dim list$(10) list$(0) = "Milk" list$(1) = "Bread" list$(2) = "Whatever" Etc...
一個糟糕的 Dim 語句
dim list$(10) list$(1) = "Whatever" list$(11) = "This is a no no - you can't exceed the array declared value!"
希望你現在一直在使用這些方法,如果沒有,請複習所有內容並付諸實踐。
你的任務
編寫一個 Mad Libs 遊戲
測驗即將到來!目前,編寫 Mad Libs 遊戲,並輕鬆休息一段時間。
在我們開始之前,這裡有一個測驗!告訴過你了!
Quiz #2
以下哪個字串是正確的字串?
- A)"Me"
- B)#noIam#
- C)"I am
- D)123456
輸入命令的作用是什麼?
- A)接受使用者輸入並將輸入儲存到變數中,以便稍後檢索。
- B)允許使用者輸入一個稍後要使用的字串。
- C)在螢幕上列印文字。
- D)以上都不是。
良好的程式設計實踐是什麼?
- A)不縮排但大量註釋。
- B)大量註釋。
- C)在需要時添加註釋,在需要時縮排,並使用cls命令。
- D)大量縮排。
DarkBASIC 面向什麼?
- A)資料庫程式設計。
- B)應用程式程式設計。
- C)遊戲程式設計。
- D)網頁程式設計。
為什麼養成使程式易於人類閱讀的習慣是一個好習慣?
- A)以便其他人能夠理解你的程式,你也可以理解。
- B)這不是好習慣。
- C)用於開源專案。
- D)A + B。
如果 A = 1 且 B = 0,如果 A 或 B 為真,則 C 等於多少?
- A)2
- B)0
- C)1
- D)N/A
#6 由 Cody C Oebel 修正
注意:如果 A = 1,且 B = 0,在不知道 C 的表示式的情況下,如果 A = 1 且 B = 0,則無法說明 C 應該等於什麼。我更正了 # 6 的答案,它應該是 D 或 N/A。
考試答案作弊不會幫助你成為更好的程式設計師
1 的答案是 A
2 的答案是 A
3 的答案是 C
4 的答案是 C
5 的答案是 A
6 的答案是 C 注意:正確答案是 D 或 N/A
由 Cody C Oebel 編輯 6 的正確答案是 N/A 或 D
好的,如果你沒有作弊並且獲得了不錯的分數,那麼恭喜你;否則請再次嘗試,直到你獲得好成績。現在讓我們花一些時間來學習一下游戲設計。好的,讓我們以《大金剛國》為例,這是一個很棒的圖形遊戲,而且非常有趣。但有些人說它的遊戲設計很糟糕,從某種意義上說確實如此,你收集的東西沒有實際價值,對玩家沒有任何特殊作用。讓我們看看《超級馬里奧兄弟》。
你收集硬幣以獲得額外的生命和更高的分數,你收集綠蘑菇也可以快速獲得額外的生命,你的主要攻擊方式是跳躍,並且必須避免掉下平臺,玩家可以自己探索很多東西,你最終收集大蘑菇變得更強大,如果幸運的話還可以得到一朵花獲得一種嬉皮士火力。在設計平臺遊戲時,這是一個很好的思路,可以鬆散地基於其他成功的遊戲進行設計,但不要完全抄襲。
現在讓我們看看一些 Apogee 遊戲,例如《Biomenace》就像馬里奧但更成熟,你有一把槍,但良好的平臺遊戲的基準仍然存在。遊戲圍繞玩家的新優勢展開,因為你的槍是你的生存保障。在《太空侵略者》中,你不會收集東西,但它是一款經典的生存遊戲,街機遊戲的基準是儘可能長時間地生存,獲得最高分,擁有有限的資源和能量增益以暫時延長在困難部分的生存時間。讓我們看看 RPG,例如《最終幻想》是關於你的角色成長和學習,它也專注於故事情節。
沒有真正的關卡,你不斷培養你的角色,直到他成為宇宙中最強大的存在,然後擊敗主要的反派,所以實際上是你自己才是主角。專注於遊戲的核心區域並圍繞它進行構建,我這樣做已經有一段時間了,通常我的遊戲都很受歡迎。不要讓遊戲太難,如果你在數百萬次測試階段後覺得它很有趣,那就很好。如果作為設計師的你對遊戲的任何部分有任何不溫不火的感覺,請更改它,直到你感到滿意。試著想象一個完全陌生的人會有什麼感受!設計與使其發揮作用一樣重要,如果沒有設計,你將如何建立一個遊戲?除了邊做邊想之外,你什麼也做不了。記住,首先是遊戲玩法,然後是多媒體,然後是故事,最後測試你的遊戲並將所有內容整合在一起。玩遊戲以瞭解是什麼讓它們變得有趣!
現在,讓我們看看一些運算子。這些是幫助我們在 Dark Basic 中使用數學和邏輯的東西,它們應該很簡單。
運算子
> is Greater Than < is Less Than >= is Greater than or equal to <= is Less than or equal to
現在讓我們將上述內容應用於條件語句。
`10 = 9 is not 1 it's 0 `So no text will be printed if 10 = 9 then print "That'll never happen" `But 10 is greater then or equal to itself if 10 >= 10 then Print "This will always happen" `10 is greater then 8 if 10 > 8 then Print "10 is bigger then 8 no doubt" Etc.
在數字運算中,我們將看到平方根和 DarkBASIC 中的所有數學命令,但現在我們只處理 rnd 命令。
以下是語法
variable = rnd(value)
不幸的是,rnd 的範圍是從 0 到設定的範圍值,我不知道如何更改它,我擔心,但如果你需要幫助,可以考慮在 DarkBASIC 論壇上提問:The Game Creators。此連結將帶你到 DarkBASIC 的主頁,我在論壇上沒有使用者名稱,但以前有,但由於每個人都太急於互相攻擊,所以我停止訪問了。嚴格遵守規則,否則他們會埋葬你,並確保你知道你在釋出什麼,並做好最壞的打算。抱歉,嚇到你了,但有時這就是真相,我曾經有很多感受受到傷害,並且對使用者的殘忍感到憤怒。現在讓我們做一個猜數字遊戲!!
來自讀者的註記:你可以透過簡單地使用“value”作為你想要達到的最高數字減 1,然後加 1 來解決此問題,例如,如果我想生成一個從 1 到 6 的隨機數(就像一個標準的 6 面骰子)
variable = rnd(5) + 1
我們使用值 5,因為這比 6(我們想要的數字)少 1。這將生成一個從 0 到 5 的數字,然後加 1,建立一個從 1 到 6 的數字。希望這有幫助,我本來應該在新增之前詢問的,但我沒有看到你的聯絡資訊。
`Guessing Game Example `By Dbtutor cls `Ask the users for their name Input "Enter your name before you play! ";name$ wait key cls `Create a random number let's change the range a bit value = rnd(9) if value = 0 then value = 1 if value = 1 then value = 2 if value = 2 then value = 3 if value = 3 then value = 4 if value = 4 then value = 5 if value = 5 then value = 6 if value = 6 then value = 7 if value = 7 then value = 8 if value = 8 then value = 9 if value = 9 then value = 10 gosub guess `Take a guess! guess: Input "Take a guess ";name$;"! ";guess gosub checkguess `Check the guess checkguess: if guess > value wrong = wrong+1 Print "Sorry too high!" wait key cls gosub guess endif if guess < value wrong=wrong+1 Print "Too low!" wait key cls gosub guess endif if guess = value then gosub win `You won! win: cls Print "You rock you've won the game!" Print "You were wrong ";wrong;" times" Print "Your guess was ";guess Print "Press Any Key" wait key cls end
哇!你從編寫“Hello World”程式開始,現在已經制作了一個猜數字遊戲!繼續努力,如果你足夠勇敢,可以在 DarkBASIC 論壇的新手區展示你的程式。現在 gosub 是做什麼的呢?Gosub 代表 Go Subroutine,這只是更短更極客化的一種說法。你需要有一個要跳轉到的標籤,並且必須像這樣宣告標籤。
來自另一位讀者的註記:我注意到,如果你編寫以下程式碼行
value = rnd(9) if value = 0 then value = 1 if value = 1 then value = 2 if value = 2 then value = 3 if value = 3 then value = 4 if value = 4 then value = 5 if value = 5 then value = 6 if value = 6 then value = 7 if value = 7 then value = 8 if value = 8 then value = 9 if value = 9 then value = 10
遊戲將選擇一個數字,然後一直增加它,直到它達到 10。你只需在被要求輸入數字時按下 10 即可獲勝。要更正此問題,請將程式編寫如下
`Guessing Game Example `By Dbtutor `modified by Huruba Dumitru Alin cls `Ask the users for their name Input "Enter your name before you play! ";name$ wait key cls `Create a random number let's change the range a bit value = rnd(9) if value = 0 then value = 1 gosub guess `Take a guess! guess: Input "Take a guess ";name$;"! ";guess gosub checkguess `Check the guess checkguess: if guess > value wrong = wrong+1 Print "Sorry too high!" wait key cls gosub guess endif if guess < value wrong=wrong+1 Print "Too low!" wait key cls gosub guess endif if guess = value then gosub win `You won! win: cls Print "You rock you've won the game!" Print "You were wrong ";wrong;" times" Print "Your guess was ";guess Print "Press Any Key" wait key cls end
現在遊戲只會選擇一個從 1 到 9 的數字,接下來你只需猜出它。
來自另一位讀者的註記:我發現有一種更簡單的方法來進行上述更正。Dbtutor 需要一個從 1 到 10 的數字,而你的更正只將數字範圍縮小到 1 到 9。此外,由於你編寫此程式的方式,現在獲得 1 的機率高於獲得任何其他數字的機率。修復此問題的一種更簡單的方法如下…
<pre> `Guessing Game Example `By Dbtutor `modified by Huruba Dumitru Alin cls `Ask the users for their name Input "Enter your name before you play! ";name$ wait key cls `To solve the 0 being a value problem just add 1 instead value = rnd(9)+1 `the value down here is now no longer needed making the program less sloppier `executes the command better now. gosub guess `Take a guess! guess: Input "Take a guess ";name$;"! ";guess gosub checkguess `Check the guess checkguess: if guess > value wrong = wrong+1 Print "Sorry too high!" wait key cls gosub guess endif if guess < value wrong=wrong+1 Print "Too low!" wait key cls gosub guess endif if guess = value then gosub win `You won! win: cls Print "You rock you've won the game!" Print "You were wrong ";wrong;" times" Print "Your guess was ";guess Print "Press Any Key" wait key cls end
這是一種更容易從隨機數選項中去除 0 的方法,同時不會影響你的機率。將來,如果你需要一個隨機數,請使用
value = rnd(x)+1 'with x being one less than you want to go to, I hope that helped.
gosub mylabel mylabel:
就是這樣,使用標籤進行一些實驗以瞭解它們的功能。你可以使用 return 命令返回到最後跳轉到的標籤。
任務
在論壇上展示你的作品(可選)!
使提示更精確。
限制生命次數。
好的,今天就到這裡,去睡個午覺或做點什麼吧,哈哈!:D
我想我說過課程將在第 7 天結束,我錯了。現在讓我們學習函式。函式用於建立 DarkBASIC 中不存在的自定義命令。它們也用於執行函式,這難道不明顯嗎?DarkBASIC 沒有面向物件程式設計或 OOP,因此如果你是一位非常優秀的程式設計師,可以使用函式來替代。那麼如何使用函式呢?
來自讀者的註記:DarkBASIC Professional 透過使用者定義型別和指標支援 OOP。
這是一個簡單的函式
hello_world(1) wait key end function hello_world(1) Print "Hello World" endfunction
首先,括號表示引數列表,函式位於程式的末尾,如果你的程式遇到函式宣告,請注意!你可以使用 exitfunction 輕鬆退出函式。使用函式的最佳方法是使用自定義命令/過程建立庫。以上函式以行號作為引數。你也可以使用函式建立自己的輸出命令。
function output(x,y,msg$)
set cursor x,y print msg$
endfunction
使用此方法,你可以從某種意義上使用面向物件程式設計,如果你是一位更高階的使用者。
DarkBASIC 中庫的示例
`Basic Function Example #include "myfunctionlib.dba" x = 100 y = 10 hello_world(x,y) `Now we have our own command! Rem ##################################################################################### `Note the example below was not included in the above program it was in a different file named my `functionlib.dba `A little function library function hello_world(x,y) set cursor x,y Print "Hello World" endfunction
VC++ 中的 #include 命令的工作方式如下
#include <iostream.h> using namespace std; Etc.
在 DarkBASIC 中,庫的工作方式類似但並不完全相同於 C++ 示例。現在你已經瞭解了什麼是函式以及它的作用!
任務
使用函式和庫製作一個 Mad Libs 遊戲。建立你自己的命令,例如用於加法等的命令。
這可能是第 3 課的最後一天了。我們一直在做大部分時間都是應用程式和軟體程式設計。但很快我們就會每天編寫一個遊戲,從《Pong》開始,到《BreakOut》等等。不幸的是,我們不會編寫角色扮演遊戲,因為角色扮演遊戲的開發需要數月時間,並且大約需要 5000 行程式碼,包括我們需要的工具。
軟體的設計過程如下
The Software I want to Develop Is It's Main Purpose Is Problems That Need to be Solved Etc.
事實上,有一種方法涉及一系列我記不清的圖片,以及另一種類似於上述方法的方法。我希望你在第 3 課的過程中學習了一些關於 DarkBASIC 程式設計的知識。第 9 天將在下一課中繼續…
== End of Lesson ==
這節課只有一天的內容。完成後,我們將繼續學習 2D,不要期望馬里奧或乓球,首先我們將學習字串操作,大約一天左右,然後我們將繼續學習影像等等。誰喜歡數學?我不喜歡,這就是為什麼我們將讓 DarkBASIC 為我們做數學運算。它比使用計算器更容易,你甚至不必考慮它。
典型的數學運算子
+ is Increment of a value = is equal to - is decrement of a value ÷ is the division symbol. (ALT + 246 to create the ASCII symbol for division) X multipying
好的,首先,增量是指將值增加任意數量,而減量是指減少值。
典型的程式設計運算子
+ still addition = is equal to - is subtraction / is division * is Multiplication
記住上面的內容,就像你記得聖誕節一樣,否則你在程式設計中做數學運算就會遇到問題!我還可以繼續介紹更多的運算子,但在像DarkBASIC這樣簡單的語言中並不需要,因為大部分數學運算都可以透過更簡單的命令來處理,比如wrapvalue。
這個例子可能很簡單,但還是把它寫出來。
`Math Example `By Dbtutor a = 1+2 b = 3-7 c = 9/3 d = 10*2 Print a Print b Print c Print d wait key end
大多數人已經知道將會發生什麼以及正在發生什麼。
這裡有一些簡單的東西!
`Few math examples a = 67 hexofa$ = hex$(a) ` hex$ returns value of 'a' as a hexdecimal string. binaryofa$ = bin$(a) ` bin$ returns value of 'a' as a binary string. b = 3 c = sqr(b) inc d dec e Print a Print hexofa$ Print binaryofa$ Print b Print c Print d Print e wait key end
為什麼要使用上面這些命令我也不知道,你只需要在很少的情況下使用它們,更多關於DarkBASIC中數學運算的例子,請查閱DarkBASIC編輯器的命令參考中的數學部分。現在就到這裡……
==End of Lesson==
相信我,迴圈很有用,它們可以完成繁瑣的任務,並且易於使用。
以彩票程式為例
Dim lottery(100) lottery(1) = 1 lottery(2) = 2 lottery(3) = 3 lottery(4) = 4 etc... Print Lottery(1) Print lottery(2) Print Lottery(3) etc...
以上方法適用於平方,以及不瞭解迴圈的人。
使用迴圈完成
`Let's image the dim command above is down here
for a = 1 to 100
Print lottery(a)
next a
讀者提示:你不能列印“lottery(a)”,因為它不存在,請改為以下程式碼
dim lottery(100) for a = 1 to 100 print a next a wait key
使用迴圈時,請記住縮排,這可以使程式更易於其他人閱讀。有了迴圈,我們終於可以進行更高階的輸入了,無需變數的輸入,好吧,一些變數。讓我們看看一些迴圈。
Repeat/Until
Repeat `what the loop does here until conditionmet
While/Endwhile
While conditionmet `What the loop does endwhile
Do/Loop
do
`task here
loop
記住,退出迴圈的唯一方法是退出程式(這是不允許的)、使用exit命令(這是最佳方法)或使用gosub命令。在某些迴圈中,迴圈會在滿足某個條件後結束,而在其他迴圈中,則在完成某個任務後退出。如果你認真聽了,你應該知道我在說什麼。今天結束了,去吃飯、睡覺、散步,做任何事,明天回來!
這是高階輸入部分,如果我們想要一個系統鍵,我們可以很容易地使用spacekey()等命令。去看看它們,它們是最容易理解的,也瞭解一下如何在DarkBASIC中停用它們。對於其他鍵,基本上有兩種方法:scancode(value),它因不同國家的鍵盤而異,西班牙語鍵盤與英國鍵盤不同,你必須找到一個值!或者你可以使用ASCII值,它有一個有趣的讀音(它讀作ass key :P)。在維基百科上查詢ASCII的含義,只需在搜尋框中輸入即可。如果你只是好奇,可以在點選這裡訪問維基百科,因為我忘了,我記得好像是美國標準字元什麼的。我們將使用ASCII,因為它對每臺電腦都是一樣的,不需要使用數字值。
示例
`Loops are needed for input BTW do if inkey$() = "charhere" then exit loop
這是一個鍵的示例
do if inkey$() = "a" then print "Lowercase A" if inkey$() = "A" then Print "Uppercase A" loop
記住,在使用inkey$()時,A與a不同。現在課程結束了,作為作業,請找出ASCII的含義,並嘗試使用inkey$()。
== End of Lesson ==
第12天已經到了,你正在朝著在DarkBASIC和通用程式設計領域取得成功的職業道路前進!很多人在DarkBASIC中編寫檔案時遇到困難,有些人則在資料型別等方面遇到問題。這節課需要花費很多時間來講解,我估計你需要5天時間,而我需要大約2周時間來編寫。希望我能早點完成,但如果不能,你只需要等待我或其他人來貢獻內容。今天,我們將學習如何儲存檔案。
以以下場景為例
text$ = "Hey guess what open me up in notepad and see what happens!"
set dir "C:/"
if file exist("openmeupfast.txt") = 1
delete file "openmeupfast.txt"
endif
open to write 1,"openmeupfast.txt"
write string 1,text$
close file 1
open to read 1,"openmeupfast.txt"
read string 1,newtext$
Print newtext$
close file 1
wait key
end
真是太複雜了!在機器語言中,要完成同樣的操作需要數千行程式碼,是不是很瘋狂!正如你所發現的,上面的程式碼建立了一個字串變數,將我們工作的目錄移動到C盤,如果檔案存在則刪除它(否則我們無法覆蓋它,因為它已經存在),寫入檔案,關閉它,開啟它以讀取內容,使用一個新的字串來包含文字行,然後列印它,最後你需要按任意鍵才能結束。這很棒!但記住副檔名?你可以更改它來建立自己的檔案。你還可以寫入各種內容,例如:位元組、字元等等。要檢視可以寫入的內容,請檢視DarkBASIC幫助檔案中的命令參考。我們現在只使用字串,以後再使用位元組。
這個例子會生成一個語法錯誤,我現在就告訴你原因。
a = 1 delete file "wrong.txt" open to write 1,"wrong.txt" write string 1,a
記住,數字不是字串,要將數字轉換為字串,我們可以執行以下操作。
a = 1 a$ = str$(a) b = val(a$)
str$命令將數字轉換為值,val命令將字串轉換為值。你還可以使用字串執行許多其他奇特的操作,你可以在DarkBASIC幫助檔案中的字串命令參考中看到。檢視一些示例,並稍微修改一下。
這是一個關於字串的無用軟體
`Crazy Strings `By Dbtutor cls message$ = "Hello World!" Print "ASC() returns the ASCII number of the first letter in the str" Print asc(message$) Print "Len counts how many characters in a string" Print len(message$) Print "Mid gets the middle write characters of a string" midval = 3 Print mid$(message$,midval) Print "Here's the binary of the number 678" Print bin$(678) Print "Here's the hex of that number" Print hex$(678) Print "There are many more ways of destroying strings" Print "Much are useless, but take a gander at them" wait key end
如你所見,操作字串很容易,但幾乎沒什麼用。在某些情況下它們很有用,例如檔案管理器工具,我們很快就會製作一個,以及其他一些檔案內容。在2D教程的最後一部分,我們將使用檔案來製作一個非常簡單的工具,非常類似於ZZT或MegaZeux。需要講的內容很多,請耐心等待!在第13天,我們將學習更多關於檔案寫入的方法,還記得位元組嗎?你可以用它將值寫入檔案。我使用了txt作為副檔名,嘗試使用.dat、.ini等。你甚至可以自己建立一個!使用write,你還可以寫入單詞或整數、長整數甚至浮點數。我不知道為什麼。
檔案寫入的良好示例
a = 1
b$ = str$(a)
if file exist("a") = 1 then delete file "a"
open to write "a",1
write string 1,b$
close file 1
if file exist("a") = 1 then readit = 1
if readit = 1
open to read 1,"a"
read string 1,c$
d = val(c$)
Print d
Print "Same thing! Use val and str! Their better!"
wait key
end
endif
注意:來自Cody Oebel
上面的程式碼無法正常工作,並且無法編譯和執行。
我發現If file exist("a") = 1 ... 中的= 1 是模稜兩可的,並且沒有必要。
以下是我的程式碼片段版本
`Edit by Cody C Oebel:
g = 11
set dir "c:/"
b$ = str$(g)
if file exist("a.txt") then delete file "a.txt"
open to write 1, "a.txt"
write string 1, b$
close file 1
if file exist ("a.txt")
open to read 1, "a.txt"
read string 1, z$
d = val(z$)
print d
print "This should work now, and is smaller amount of code"
wait key
endif
end
現在,明白我的意思了嗎?稍後我們將使用當前目錄和檔案分支語句來製作一個簡單的檔案瀏覽器。非常簡單!例如,在tilemappers等中有時會使用write byte,但標準是write string,因為它很簡單。記住,保持簡單!
讓我們寫入一個數組
dim a$(10) a$(1) = "jsdakjlakljldsaf" a$(2) = "ashjajasjhsjks" save array a$(10),"array.ini" load array a$(10),"array.ini" for a = 1 to 10 Print a$(a) next a wait key end
注意:同樣,上面的程式碼不起作用:來自Cody Oebel
這是我的工作版本,供其他讀者檢視一些小錯誤。
還要注意,編譯器的底部顯示了格式
用於儲存陣列和載入陣列,例如檔名、陣列。
我還添加了變數字串名filename$來包含“array.ini”。
dim a$(10) filename$ = "array.ini" a$(1) = "jsdakjlakljldsaf" a$(2) = "ashjajasjhsjks" set dir "c:/" save array filename$, a$(10) load array filename$, a$(10) for a = 1 to 10 Print a$(a) next a wait key end
現在我們可以儲存大型陣列了,資料庫程式設計?還記得我們的猜謎遊戲嗎?稍微修改一下,以便你可以將新學的程式碼包含在其中。你已經學到了很多關於檔案的知識。準備在第13天學習目錄!
第13天到了,我們距離中途點只有兩天了。這是一個好訊息,你越快成為DarkBASIC程式設計高手越好!好吧,實際上DarkBASIC需要一段時間才能掌握,我並不是想嚇唬你,但我也不是程式設計高手。如果你認識某個遊戲製作高手,通常不是因為他們是最好的程式設計師,而是因為他們是很棒的遊戲製作人。一些DarkBASIC使用者已經制作了一些商業遊戲,例如:Dumbo & Cool、Star Wraith等。DarkBASIC非常適合製作遊戲和團隊合作。對於應用程式來說就不那麼合適了,你今天就會發現這一點。
這是一個簡單的檔案管理器
Input "Set directory to: ";direct$ set dir direct$
你看不到檔案,對吧?我們可以使用一些簡單的命令輕鬆地檢視檔案和其他內容。記住,有些命令很繁瑣,但與迴圈一起使用時!現在這是一個檔案管理器,你可以更改目錄、檢視檔案等等,它不是一個專業的工具,它只是向你展示了基本操作。但在我們這樣做之前,是時候看看一個更好的檔案管理器了。
`Simple File Manager `By Dbtutor `Get the directory to use setdirect$ = get dir$() `Set the directory to the current directory set dir setdirect$ `Current amount of items items = 10 find first Print get file name$(1) for a = 2 to items find next Print get file name$(a) next a Wait key end
哇,這很酷,但沒有使用者輸入也沒有檔案操作,因此這個程式是檔案系統檢視器。就像Windows資源管理器!如今,編寫檔案管理器幾乎沒什麼用,尤其是如果它很醜陋的話。但在DarkBASIC程式中使用檔案管理器可以提高生產力,而不是輸入檔名或目錄等等。我們不會回到DOS時代,天哪,輸入一個命令並希望它能工作!還記得我說過繁瑣嗎?嗯,有一種更好的方法來編寫上面的程式。別擔心,我們稍後會編寫一個檔案管理器!在我向你展示更有效的方法之前。
按照以下說明操作
Go to http://www.computechtenerife.com/ Register as a user. Click on Dark Basic Support and then Downloads Scroll down and find the function libraries Click on the Db file selector Download and extract the files for usage later
好的,現在我們完成了,我們可以看到在檔案系統檢視器世界中做事情的更好方法。我們距離檔案管理器只有一步之遙了。
`Simple File Viewer `By Dbtutor set dir "C:\" Perform checklist for files for a = 1 to checklist quantity() Print checklist string$(a) next a Wait key end
看看我們減少了多少行程式碼?還有其他用於目錄和裝置等內容的perform checklist。去看看,並用其中一些替換檔案命令的perform checklist。
現在記住你下載的檔案管理器庫,如果你還沒有猜到,我們將修改include檔案(而不是函式庫)內部的一些程式碼來製作我們自己的修改版檔案管理器。記住,該庫的版權屬於一位名為TDK_MAN的DarkBASIC使用者,他是最棒的DarkBASIC程式設計師之一,除了你(只是奉承)我相信在30年後你也可以打敗他。開玩笑的,如果你在讀這段話,TDK,不要見怪。他製作了許多DarkBASIC程式,包括MatEdit,我們將在後面的3D章節中使用它,以及3D建模器等等。
這是原始碼
`Thanks TDK For the Library Off your Site! Rem Fileselector Function Demo - Copyright TDK_Man May 2003 Rem Modded Version By Dbtutor gosub filemanager filemanager: #Include "FileSelect.dba" Set Display Mode 800,600,16 Cls Sync On Rem Required DIM Statements At The Beginning Of Your Program Dim Files$(1000,2): Dim Drv$(26): Dim Temp$(1000,2): Dim GotDrives(1) Dim Path$(1): Dim Filename$(1): Dim SliderHeight(1): Dim FileOffset(1) Title$="Load File": Rem Text to appear at top of fileselector Filter$="*.*": Rem 3 char filter extension (Eg: 'TXT') or *.* for all files CurDir$="C:\Program Files\Dark Basic Software": Rem Starting Directory Rem Function Call Selected=Fileselect(CurDir$,Title$,Filter$) Rem On return Selected=1 if OK clicked and 0 if Cancel clicked CLS If Selected=1: Rem OK Was Clicked Print "Selected Filename: ";Filename$(0) Print "Selected Path: ";Path$(0) `Modded Code here Print "Press Any Key to Manage File" wait key myfile$ = filename$(0) mydir$ = path$(0) gosub managefile Else: Rem Cancel Was Clicked Print "Cancel Button Chosen" Endif `All Original Code Below `By Dbtutor managefile: set dir mydir$ getext$ = left$(myfile$,4) if getext$ = ".bmp" or ".jpg" then gosub view_bmp if getext$ = ".mid" or ".wav" then gosub view_audio view_bmp: Load image myfile$,1 paste image 1,1,1 set cursor 1,400 wait key cls gosub filemanager view_audio: load music myfile$,1 play music 1 wait key cls gosub filemanager
有了其他人的函式庫,你就可以輕鬆地獲得一個檔案管理器!你可以在TDK的網站(http://www.matedit.com/db.htm)上找到很多函式庫和教程。第13天就到這裡,有一段時間沒有測驗了,所以以後要做好準備迎接大量測驗。我找不到任何值得讓你測試的內容。第14天將會有大量資料出現。
我們已經知道什麼是變量了,但你還沒有使用資料語句。資料語句使用起來非常簡單,你只需輸入資料,空格,然後輸入所有資料型別。
資料示例
data "strings",12,5.6,"and integers and floats tooooooooooooooooo!!!!!!!" data 12 data "string me" data 5.50
只要用逗號分隔,你可以在一個語句中包含許多資料型別。這很有用,但我們如何讀取資料呢?我們可以使用read。
`Read Example data 4 read var1 Print var1
你可以使用restore重置資料指標,稍後你會明白我在說什麼。使用不同的標籤來儲存不同的資料是一種好的實踐。
`Big Data Example gosub datastored datastored: data 1234 data 12 data 1 data 4 data 56 gosub readdata readdata: read var1 read var2 read var3 read var4 read var5 print var1 Print var2 Print var3 print var4 Print var5
它首先儲存資料然後讀取資料,如果你願意,也可以反過來操作。無論你以何種方式讀取和儲存資料,它都能正常工作。現在我們進入了遊戲階段,沒有解釋(好吧,有一些),只有純粹的遊戲程式設計。我們每天都會程式設計一個遊戲,哇哦,現在就開始吧!
==End of Lesson==
終於到達了中途點,經過了所有這些編碼、閱讀和天數。在本章中,我們將使用更多文字命令來製作一個文字冒險遊戲,你將學習這些命令。此外,你將學習如何用各種顏色清除螢幕,哦,男孩,你一定會喜歡這節課的。
你可能想,我的天,文字總是必須是白色的嗎!
`NOPE ink rgb(0,255,0),1 Print "OMG FINALLY COLOR!"
沒錯!我是一個加拿大人,但我仍然將顏色拼寫為color而不是colour。RGB代表什麼?它代表紅色、綠色、藍色,用鏡頭看看你的顯示器,你會看到很多這些顏色的畫素。rgb必須用括號分隔,然後用逗號分隔透明度值。透明度範圍為0到255。RGB值範圍也為0到255。
一些需要記住的顏色
255,0,0 - red 0,255,0 - green 255,255,0 - yellow 0,0,255 - blue 0,255,255 - cyan 255,255,255 - white 0,0,0 - black 255,0,255 - pink 192,192,192 - light grey
要檢視更多內容,請檢視畫圖程式,檢視rgb值並隨意嘗試,這就是我發現的方法,所以你也可以找到方法。使用以上值,你應該能夠建立漂亮的顏色。值越低,顏色越暗,值越高,顏色越亮。
現在,在那之後,你想要一個更好的列印方法,對吧?
text x,y,string$
使用文字時,需要使用+而不是分號來分隔變數。所有值都必須是字串,請記住要將值轉換為字串,請使用第6課中所示的str$命令。
正確的方法
a = 1 text 1,100,"This is no syntax error "+str$(a)
錯誤的方法
a = 1 text 1,100,"This is a syntax error you won't see this text until you fix "+a
我們可以輕鬆更改字型
set text font fontnameasstring$
我們也可以輕鬆地使文字不透明,或者允許我們在其他文字值上書寫
set text opaque
以下是樣式更改
set text bold set text italic set text bolditalic
以下是更改大小的方法
set text size integernumber
好的,以下是這些內容在一個程式中的示例
set text font "Times New Roman" set text size 30 set text bold text 1,100,"Hey"
你的作業是隨意嘗試文字值和顏色,明天再來
好的,現在我們已經學習了大量關於更改文字值的知識,是時候編寫你自己的文字冒險遊戲了。我們將其命名為“厄運地牢”,它將讓玩家使用眾多資料命令等逃離城堡的陰暗地牢。
首先讓我們做一個提綱
現在我們有了提綱,讓我們寫一個簡單的故事
邪惡的精靈把你囚禁在他們的監獄裡,現在你必須逃離厄運地牢。當心,有些路通往厄運,另一些路通往出路。
在我們的遊戲中,只有兩種死亡方式,因為它更像是一個迷宮。
現在讓我們為它建立一些資料
`Dungeons of Doom `By Dbtutor `Room dim room1$(10) dim room2$(10) dim room3$(10) dim room4$(10) dim room5$(10) dim room6$(10) dim room7$(10) dim room8$(10) dim room9$(10) dim room10$(10) dim room11$(10) dim room12$(10) rem ----------------- gosub startgame startgame: cls gosub start for a = 1 to 10 Print room1$(a) next a do if inkey$() = "l" then gosub room1_b if inkey$() = "r" then gosub room2_b if inkey$() = "u" then gosub room3_b loop room1_b: cls gosub room1 for a = 1 to 10 Print room2$(a) next a wait key end room2_b: cls gosub room2 for a = 1 to 10 Print room3$(a) next a wait key end room3_b: cls gosub room3 for a = 1 to 10 Print room4$(a) next a do if inkey$() = "l" then gosub room4_b if inkey$() = "r" then gosub room5_b if inkey$() = "d" then gosub startgame if inkey$() = "u" then gosub room6_b loop room4_b: cls gosub room4 for a = 1 to 10 Print room5$(a) next a wait key end room5_b: cls gosub room5 for a = 1 to 10 Print room6$(a) next a do if inkey$() = "b" then gosub room3_b loop room6_b: cls gosub room6 for a = 1 to 10 Print room7$(a) next a do if inkey$() = "l" then gosub room7_b if inkey$() = "r" then gosub room8_b if inkey$() = "d" then gosub room3_b if inkey$() = "u" then gosub wingame loop room7_b: cls gosub room7 for a = 1 to 10 print room8$(a) next a do if inkey$() = "b" then gosub room6_b loop room8_b: cls gosub room8 for a = 1 to 10 print room9$(a) next a do if inkey$() = "b" then gosub room6_b loop wingame: cls gosub win for a = 1 to 10 print room10$(a) next a wait key end `Data Statements start: data "Dungeons of Doom - Starting Area" data "The cell door swings open, the guard lies dead in a pool of blood" data "A large gash does through his neck, clutching your dagger you" data "Have a decision to make." Data "You can Go - L>eft, R>ight, or U>p" for a = 1 to 5 read room1$(a) next a return room1: data "Dungeons of Doom - Room 1" data "You look around the corner and leap out at a guard" data "Sticking a sharp spear in the air your gored by it" data "Through the heart you die instantly and never escape" data "The Dungeons of Doom....." data "Press Any Key" for a = 1 to 6 read room2$(a) next a return room2: `Right of start data "Dungeons of Doom - Room 2" data "As you reach the room, you notice the walls close in!" data "You are squished between the walls" data "The End - Press Any Key" for a = 1 to 4 read room3$(a) next a return room3: `North of the start point data "Dungeons of Doom - Room 3" data "This room is a room that leads all ways..." data "U>p, L>eft, R>ight or D>own" for a = 1 to 3 read room4$(a) next a return room4: `Left of Up one from start point data "Dungeons of Doom - Room 4" data "You run into a monstrous troll, who proceeds to bash you" data "Over the head with a club, waking up inside a pie" data "You are instantly eaten by a horde of trolls" data "The End - Press Any Key" for a = 1 to 5 read room5$(a) next a return room5: `Right of the room4 data "Dungeons of Doom - Room 5" data "You run into a dead end, you must go out the way you came" data "B>ack" for a = 1 to 3 read room6$(a) next a return room6: `North of Room data "Dungeons of Doom - Room 6" data "This room is a dank one, to the north you feel cold air a way out?" data "U>p, L>eft, R>ight, or D>own" for a = 1 to 3 read room7$(a) next a return room7: `Left of the room 6 data "Dungeons of Doom - Room 7" data "Dead End Go Back" data "B>ack" for a = 1 to 3 read room8$(a) next a return room8: `Right of Room 6 Data "Dungeons of Doom - Room 8" data "Dead End Go Back" data "B>ack" for a = 1 to 3 read room9$(a) next a return win: Data "You Won" Data "Escaping to the Forest, now you need to find a town!" data "Press Any Key" for a = 1 to 3 read room10$(a) next a return
這個遊戲已經完成了,如果所有內容都不起作用,請隨時傳送電子郵件至:thenerd2468@hotmail.com
然後,為了證明你理解了正在發生的事情,你的作業是回去添加註釋來描述每個部分正在發生的事情。作業的最後部分是編輯所有程式碼和資料語句以製作續集,新增房間和更多內容。不,這個遊戲不是文字角色扮演遊戲,我們將在下一課中製作文字角色扮演遊戲。我認為明天你將迎來遊戲程式設計的突破。
哦,男孩,哦,男孩,哦,男孩!今天我們將製作一個Pong遊戲,一個BreakOut遊戲,你將學習影像、精靈等等!好的,那麼我們如何在DarkBASIC中載入多媒體?還記得在檔案管理器程式中,我們有一些令人困惑的檔案格式嗎?不幸的是,我沒有新增動畫。
多媒體示例
`Image `Supports bmps and jpgs only id = 1 string$ = "myimage.bmp" load image string$,id x = 1 y = 1 paste image id,x,y `Music `Sound works the same way, only instead the word music is replaced with the word `sound `Supports are: wav, mp3, and midi musid = 1 musstring$ = "mymusic.mid" load music musstring$,musid play music musid stop music musid loop music musid `Animation `Supports gif, avi, may support other formats animid = 1 animstring$ = "myanimation.gif" load animation animstring$,animid play animation animid `Bitmap `Works same as image only supports bitmaps, you can load only 32 bmpid = 1 bmp$ = "mybmp.bmp" load bitmap bmp$ `This pastes the bitmap, but the id can be used to create bitmaps at certain `locations `see bmps under the command reference for those details end
檢視DarkBASIC中更多多媒體示例,還有一些是3dsound,你也可以播放CD上的音樂。我們將在後面的章節中使用DarkBASIC中更多多媒體示例,現在我們將重點關注示例中提到的內容。
你的主要問題可能是什麼是精靈?精靈是遊戲中使用的二維角色。基本上,精靈是一個功能更強大的影像,在DarkBASIC中,精靈是系統的生命線。
精靈的工作原理
sprite spriteid,x,y,imageid
你不能使用load bitmap並將它作為精靈的影像,你只能使用load image命令載入的影像。
之前你沒有在DarkBASIC中操作影像的x,y座標,但現在即將改變。在我們開始之前,如果我們讓計算機來處理遊戲的幀率,那麼我們的遊戲將在不同速度的計算機上執行緩慢且不同。使用sync on將幀率控制權交給您,而不是計算機。每次使用sync命令時,螢幕都會不斷更新。使用sync rate命令設定幀重新整理率,對於DarkBASIC中的3D遊戲,30通常是不錯的選擇,對於2D遊戲,40也很好,但請使用30以確保。Darkbasic中有一些命令可以繪製粗略的圖形,我們將使用的命令是:line(line startingx,toendingx,startingly,toendingy), circle(x,y,radius), 和 dot(dot x,y)。它們使用預設墨水繪製這些圖形,如果未設定墨水,則將使用青色作為預設值。還有更多命令可以繪製不同的基本二維形狀,但我們不會使用它們。如果你好奇,請檢視DarkBASIC命令參考中的BASIC2d。
以下是如何移動圓圈的示例
`Moving Circle `By Dbtutor `Hide the mouse hide mouse `Setup sync rate sync on sync rate 30 `Make the screen grey cls rgb(192,192,192) `Select an ink color for us, make it all transparent ink rgb(0,155,0),0 `Draw the circle at cordinates provided xpos = 100 ypos = 200 circle xpos,ypos,10 `Start the main loop do `Clean up mess left over, and re-draw circle cls rgb(192,192,192) circle xpos,ypos,10 `User control if upkey() = 1 then ypos = ypos - 7 if downkey() = 1 then ypos = ypos + 7 if rightkey() = 1 then xpos = xpos + 7 if leftkey() = 1 then xpos = xpos - 7 `Allow no leaving the screen if xpos > 600 then xpos = xpos - 7 if xpos < 1 then xpos = xpos + 7 if ypos > 400 then ypos = ypos - 7 if ypos < 1 then ypos = ypos + 7 `Refresh the screen sync loop
哇,效果很好,對吧?讓我們現在去睡覺吧。
在我們開始之前,我想要感謝所有訪問此維基百科的人,感謝大家抽出時間閱讀它,以及當我在谷歌上搜索“DarkBASIC程式設計”時,我的書出現在第一頁。這感覺很棒!我希望你學到了一些東西,我會盡快完成這本書,但我一直忙於學習新事物和學業。我一直在學習彙編、C++、Pascal和Visual Basic,我也考慮購買一個遊戲機構建套件“The XGameStation”,由Lamothe先生或你可能認識的Andre' Lamothe或Lord Necron製作。除了Lee Bamber(DarkBASIC背後的遠見卓識者)之外,他是我程式設計方面最大的靈感來源之一。好的,讓我們從Pong遊戲開始,我必須說編寫這個Pong遊戲很有挑戰性,我遇到了很多錯誤。你必須使用你自己的影像,只包含原始碼。
理解材料 在我繼續進行Pong遊戲之前,有一些事情我必須,不,需要向你解釋。首先,你需要理解什麼是“精靈”,是的,我知道我提到了它,但沒有像我現在這樣深入,那只是一個基本的示例。基本上,精靈只不過是一個比標準點陣圖允許更多操作的活動影像。用我們的術語來說,精靈在大多數情況下只不過是一個二維角色。在DarkBASIC中,我們可以對精靈做更多的事情,而不僅僅是使用普通的影像。
你已經知道如何設定精靈了。但你不知道如何刪除精靈,如何檢測與精靈的碰撞,並且還沒有太多使用它們。刪除精靈的語法很簡單:delete sprite spriteid。精靈顯然必須存在,否則你會得到一個執行時錯誤,指出“bob”或精靈不存在。與精靈碰撞的工作原理相同:最精確和最佳的方法是使用此命令sprite collision(spriteid1,spriteid2)。同樣,它們必須像我所說的一樣存在,並且你必須有兩個,我再說一遍顯而易見的事情,但有些人真的很笨。
另一種方法的工作原理相同,只是它沒有那麼精確,並且如下所示:sprite hit(spriteid1,spriteid2)。簡單!在閱讀下面的程式碼後,可能不太容易理解隨機數的作用。簡而言之,這些隨機數是為了讓計算機生成一個0到1之間的數字,指示球應該向哪個方向移動。它們分別用於X軸和Y軸,你應該已經知道它們是什麼了。
Pong遊戲 -
如果你不理解這些內容,請複習以前的課程或查閱DarkBASIC幫助檔案。
`Pong example code `By Dbtutor `You must use your own multimedia! sync on sync rate 40 hide mouse `Load the images load image "paddle1.bmp",1 load image "paddle2.bmp",2 load image "ball.bmp",3 ` Load the music load music "Dodge This.mid",1 ` Load the sound load sound "thump.wav",1 ` Play the music play music 1 ` Start the main game loop ` Setup some variables first oneypos = 1 onexpos = 1 twoypos = 1 twoxpos = 620 bally = 150 ballx = 150 movey = rnd(1) movex = rnd(1) onegoal = 0 twogoal = 0 do `Display Scores & Whatnot set text opaque text 1,1,"Goals: "+str$(onegoal) text 585,1,"Goals: "+str$(twogoal) `Player Control for 1 if upkey() = 1 then oneypos = oneypos - 7 if downkey() = 1 then oneypos = oneypos + 7 if oneypos < 1 then oneypos = oneypos + 7 if oneypos > 432 then oneypos = oneypos - 7 `The paddle sprite sprite 1,onexpos,oneypos,1 `Player 2 Paddle if inkey$() = "w" then twoypos = twoypos - 7 if inkey$() = "s" then twoypos = twoypos + 7 sprite 2,twoxpos,twoypos,2 if twoypos < 1 then twoypos = twoypos + 7 if twoypos > 432 then twoypos = twoypos - 7 `The Ball if movey = 1 then bally = bally + 5 if movey = 0 then bally = bally - 5 if movex = 1 then ballx = ballx + 5 if movex = 0 then ballx = ballx - 5 sprite 3,ballx,bally,3 `Collision Detection if sprite hit(1,3) = 1 then movex = 1:play sound 1 if sprite hit(2,3) = 1 then movex = 0:play sound 1 if ballx < 1 then movex = 1:twogoal = twogoal + 1:play sound 1 if ballx > 620 then movex = 0:onegoal = onegoal + 1:play sound 1 if bally < 1 then movey = 1:play sound 1 if bally > 432 then movey = 0:play sound 1 `Wins if onegoal = 10 text 100,150,"Player 1 Has Won!" wait 300 end endif if twogoal = 10 text 100,150,"Player 2 Has Won!" wait 300 end endif `Refresh the screen sync loop
好的,這就是Pong的全部榮耀。現在是時候進行一個長時間的測驗了。
1 在遊戲設計中,二維角色稱為什麼?
- A) 馬里奧
- B) 查拉
- C) 剪貼畫
- D) 精靈
2 正確或錯誤:30是任何計算機上游戲的良好同步率
- T)rue
- F)alse
3 在電腦遊戲中,手動設定幀率的最佳方法是什麼
- A)開啟同步,將其設定為平均速率,例如 30,並在需要時使用同步重新整理
- B)讓電腦全權處理
- C)將同步速率設定為 0
- D)只需開啟同步
4 你如何宣告資料語句?
- A)Data 資料型別
- B)dat 資料型別
- C)godarkbasic 資料型別
- D)data.db 資料型別
5 資料語句儲存哪些型別的資料?
- A)僅字串
- B)陣列
- C)字串、整數和實數(浮點小數或浮點數)
- D)整數
6 在我們的文字冒險遊戲中,你必須逃離
- A)城堡
- B)監獄
- C)森林
- D)地牢
好的,現在,關於答案,如果你在完成本書後作弊,那就別做懦夫,不要走捷徑。
答案
- 1 - 精靈
- 2 - 正確
- 3 - A
- 4 - A
- 5 - C
- 6 - D
最後,我們需要結束這一漫長而艱難的硬編碼日,因為另一天正在等待著,並帶來了許多新的編碼特性。
Okay, so we've made Pong the next step is to make a Break-Out game. Just giving you,
遊戲的原始碼將證明你沒有自己編寫乒乓球遊戲。所以我要讓你編寫自己的打磚塊遊戲,我會提供一些指導性示例。在這個簡短的打磚塊遊戲練習之後,我將討論多媒體!
碰撞
如果精靈碰撞(球拍,球) = 1 則反彈球 = 1
使球反彈的可能解決方案:S
- 設定一個名為 ballmovex 的變數,將其值設定為隨機的 1 或 0。- 如果球擊中 0,則使其向左移動,如果擊中 1,則向右移動 - 對名為 ballmovey 的變數執行相同的操作,但在此 - 案例中向上或向下移動。
設定方塊的可能解決方案
- 設定一個數組,其中包含磚塊的 x 位置和 y 位置。然後一個用於判斷磚塊是否被擊中,所以如果磚塊被擊中,它將等於 1 或 true,然後對破壞磚塊的操作使用條件語句(if 和 then)。
如果精靈碰撞(球拍,磚塊擊中(磚塊編號)) = 1 則銷燬磚塊 = 1
如果銷燬磚塊 = 1
brickx(bricknum) = -1 bricky(bricknum) = -1
endif
需要記住的事情
Remember you need a do loop to accept advanced input such as inkey$(), returnkey(), etc.
我已經提供了很多關於如何完成打磚塊遊戲的建議,希望這會很容易完成,不會出現任何問題。如果你遇到“這是什麼”的情況,我建議你訪問 DarkBASIC 官方主頁上的程式碼庫:http://www.thegamecreators.com,它擁有 DarkBASIC 程式設計師所需的一切。
Multimedia In DarkBASIC - Audio
很少有人會說他們討厭音樂,事實上大多數人喜歡在遊戲中聽到環境音樂,我知道我確實喜歡!上面,我使用了一些奇怪的命令,播放聲音,播放音樂,載入音樂,播放音樂。好吧,DarkBASIC 有三種音訊支援,MP3、Wave 和 Midi。載入音樂非常簡單,聲音的工作方式也一樣。所以我要給你一個程式碼示例,你提供聲音,我提供程式碼!
音訊程式碼示例
Rem Audio Example `Load audio load sound "mysound.wav",1 load music "mymusic.mid",1 `Play audio once play sound 1 `Loop music loop music 1 `wait key wait key stop music 1 loop sound 1
那麼最後的數字是什麼?記住影像,這個數字是給定的數字 ID。記住你的音訊位置和副檔名!
Multimedia in DarkBASIC - Animations
這可能是最後的多媒體條目,除非有人在 dll 上做了一個,我不會做,因為我使用的是舊版本的 DarkBASIC。
此時,動畫不包括像馬里奧行走這樣的動畫,但包括像動畫 GIF(圖形交換格式)和 AVI(音訊影片交錯)這樣的動畫。到目前為止,我相信有兩種動畫格式 .gif 和 .avi,如果還有其他格式,請告訴我。動畫可用於遊戲結束螢幕,甚至是一些真人快打風格的終結技!!
程式碼示例
load animation "animation1.avi",1 play animation 1 wait key stop animation 1 load animation "animation2.gif",2 play animation 2 loop animation 2
- 請幫助完成本書,以任何可能的方式做出貢獻!-
________________________________________________________________
這是關於 2D 遊戲的。這個維基幫助我成為了今天的程式設計師。不,我不是 DBTutor,但我將做出貢獻。我是 IRON PROGRAMMER!!如果您有任何問題,請在 DarkBASIC 論壇上與我聯絡。
我挑戰你建立一個 2D 格鬥遊戲。這些很簡單。這是一個例子
''cls rgb(150,150,150) load image "Sumostein.bmp", 1 sprite 1, sprite1xpos, sprite1ypos, 1 sprite1xpos = 300 sprite1ypos = 300 load image "Sumocula.bmp", 2 sprite 2, sprite2xpos, sprite2ypos, 2 load image "Sumocula Punch.bmp", 3 sprite 3, sprite2xpos, sprite2ypos, 3 hide sprite 3 load image "Sumostein Punch.bmp", 4 sprite 4, sprite1xpos, sprite1ypos, 4 hide sprite 4 sprite2xpos = 300 sprite2ypos = 300 playeronelives = 3 playertwolives = 3 mainloop: do cls rgb(150,150,150) sprite 1, sprite1xpos, sprite1ypos, 1 sprite 2, sprite2xpos, sprite2ypos, 2 sprite 3, sprite2xpos, sprite2ypos, 3 sprite 4, sprite1xpos, sprite1ypos, 4 hide sprite 3 if upkey() = 1 then sprite1ypos = sprite1ypos -5 if downkey() = 1 then sprite1ypos = sprite1ypos +5 if leftkey() = 1 then sprite1xpos = sprite1xpos -5 if rightkey() = 1 then sprite1xpos = sprite1xpos +5 if controlkey() = 1 then gosub sumosteinpunch if inkey$() = "w" then sprite2ypos = sprite2ypos -5 if inkey$() = "s" then sprite2ypos = sprite2ypos +5 if inkey$() = "a" then sprite2xpos = sprite2xpos -5 if inkey$() = "d" then sprite2xpos = sprite2xpos +5 if inkey$() = "x" then gosub sumoculapunch if spacekey() = 1 then end if sprite1xpos =<0 then sprite1xpos = sprite1xpos +5 if sprite1xpos =>550 then sprite1xpos = sprite1xpos -5 if sprite1ypos =<0 then sprite1ypos = sprite1ypos +5 if sprite1ypos =>350 then sprite1ypos = sprite1ypos -5 if sprite2xpos =<0 then sprite2xpos = sprite2xpos +5 if sprite2xpos =>550 then sprite2xpos = sprite2xpos -5 if sprite2ypos =<0 then sprite2ypos = sprite2ypos +5 if sprite2ypos =>350 then sprite2ypos = sprite2ypos -5 loop sumoculapunch: hide sprite 2 show sprite 3 wait 250 if sprite collision(3, 1) = 1 playeronelives = playeronelives -1 if playeronelives = 0 delete sprite 1 end endif endif hide sprite 3 show sprite 2 gosub mainloop sumosteinpunch: hide sprite 1 show sprite 4 wait 250 if sprite collision(4, 2) = 1 playertwolives = playertwolives -1 if playertwolives = 0 delete sprite 2 end endif endif hide sprite 4 show sprite 1 gosub mainloop''
這是 2D 多人格鬥遊戲的簡單格式。請注意,我巧妙地沒有提供媒體!哈哈哈哈!現在開始程式設計吧!
請僅在書籍標題頁面新增{{字母順序}}。
->>3D 程式設計<<- 噠噠噠!(我不是 DBTutor,也不是 IRONPROGRAMMER,我是 gluon,你可以在 DexOS 論壇上找到我)
第一個示例
一個可控的立方體
SYNC RATE 60
MAKE OBJECT CUBE 1,1
DO
if leftkey()=1 then YROTATE OBJECT 1,OBJECT ANGLE Y(1)-2
if rightkey()=1 then YROTATE OBJECT 1,OBJECT ANGLE Y(1)+2
if upkey()=1 then XROTATE OBJECT 1,OBJECT ANGLE X(1)-2
if downkey()=1 then XROTATE OBJECT 1,OBJECT ANGLE X(1)+2
SYNC
LOOP
END
我們可以說球體等,而不是建立物件立方體。
一個帶紋理的物件
sync on hide mouse make object cube 1,20 load image "car.jpg",1 texture object 1,1,1 do sync loop
移動物件
Sync on sync rate 40 hide mouse make object cube 1,10 do if rightkey()=1 then y=wrapvalue(y+1) if leftkey()=1 then y=wrapvalue(y-1) if upkey()=1 then move object 1,1 if downkey()=1 then move object 1,-1 yrotate object 1,y sync loop
