跳轉到內容

DarkBASIC 程式設計/DarkBASIC 基礎

來自華夏公益教科書,開放的世界,開放的書籍

好吧,我們幾乎走到了你第一週體驗 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,在其他語言中,除非你清除螢幕,否則螢幕上會有文字。例如,在 Pascal 中,除非你清除螢幕,否則你會看到上次修改留下的相同文字。縮排也很重要,但我們將在以後討論它。那麼為什麼要註釋或縮排呢?在團隊合作或開源專案中,它使你的程式更容易被人理解,同時更容易閱讀和定位,此外,當你回到你的專案時,你可能需要記住發生了什麼,你可能會忘記。回到變數,你可以根據自己的意願命名變數,但要確保它們不要太長,並且能簡要描述它們的作用或用途。

以下是一些變數示例

string$ = "Hey I'm a string and I love it!"
float# = 333.445
integer = -11111

為什麼變數前面有符號?這表明我們正在處理哪種型別的變數,$ 是一個字串?一個 real 或 float 是 #,在某些語言中,值前面沒有符號,這可能有點令人困惑。所以再一次,這使它更容易被人理解。所以,在設計軟體時,要確保它的原始碼是易於被人理解的!養成良好的程式設計習慣,比如縮排——這將為你和其他人節省時間。現在,清除你的思緒,明天再來。


好吧,現在是時候輸入一些除了按下任意鍵之外的東西了。難道你不希望像 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$

哦,是的,你也可以使用浮點數和整數,也可以使用 input!在上面我使用逗號的地方,你也可以使用分號,如果你願意。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


Input 命令的作用是什麼?

A)接受使用者輸入並將它儲存到一個變數中,以便以後檢索。
B)允許使用者輸入一個字串,以便以後使用。
C)在螢幕上列印文字。
D)以上都不是。

良好的程式設計習慣是什麼?

A)不縮排,但要大量註釋。
B)大量註釋。
C)在需要註釋時註釋,在需要時縮排,並使用 cls 命令。
D)大量縮排。

DarkBASIC 面向什麼?

A)資料庫程式設計。
B)應用程式程式設計。
C)遊戲程式設計。
D)Web 程式設計。

為什麼養成良好的習慣使程式易於被人理解?

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




好的,如果你沒有作弊,並且取得了不錯的成績,那麼恭喜你,否則請再試一次,直到你取得好成績。現在讓我們花一些時間來學習一些關於遊戲設計的內容。好的,讓我們以 Donkey Kong Country 為例,這是一款很棒的圖形遊戲,而且非常有趣。但有些人說它的遊戲設計很糟糕,從某種意義上來說,它確實如此,你收集的東西沒有真正的價值,對玩家沒有特殊的作用。讓我們看看超級馬里奧兄弟。


你收集硬幣是為了讓玩家獲得額外的生命和更高的分數,你收集綠蘑菇是為了快速獲得額外的生命,你的主要攻擊方式是跳躍,你必須避免從平臺上掉下來,玩家可以自行探索很多東西,你最終收集了大蘑菇來變得更強大,如果你幸運的話,可以得到一朵花來獲得一種嬉皮士式的火力。在設計平臺遊戲時,這是一個不錯的展望,在其他成功的遊戲中鬆散地借鑑設計是不錯的,但不要完全照搬。


現在讓我們看看一些 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 論壇上提問:[http://www.thegamecreators.com 遊戲創造者]。這個連結會帶你到 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 到 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

讀者筆記:上面的程式碼包含一個函式引數,在 BASIC 語言中是技術上不允許的!函式名稱後面的 (1) 應該會產生錯誤,因為 “1” 會被認為是引數的變數名,而變數名不能以數字開頭。為了讓 DarkBASIC 允許這種錯誤,會導致程式設計不規範,並且會讓新程式設計師在 “升級” 到更專業的 BASIC 程式語言(例如微軟的 Visual BASIC,好吧,半專業!)時感到困惑。此外,考慮到函式的性質,不需要任何引數,因此正確的程式碼應該是:

hello_world()
wait key
end

function hello_world()
   Print "Hello World"
endfunction

函式位於程式的末尾,如果你的程式遇到函式宣告,小心!你可以使用 exitfunction 輕鬆退出函式。函式名稱後面的方括號可以包含函式所需引數列表。該列表應由用於每個引數的變數名組成。假設我們想將 “Hello World” 訊息放置在螢幕上的任何位置。我們可以將 x 和 y 座標作為引數提供給 hello_world() 函式,如下所示:

hello_world(20,10)
wait key
end

function hello_world(x,y)
   set cursor x,y
   print "Hello World"
endfunction

在這個例子中,你可以看到我們在開頭呼叫 hello_world 函式時提供了兩個數字。當函式被呼叫時,這些數字被放入 x 和 y 中,因此 x = 20 且 y = 10。這些引數變數僅對函式區域性,這意味著它們不會改變函式外部任何相同名稱的變數(除非這些變數被設為全域性變數,這會讓這個函式介紹變得更加複雜,所以我們先放到後面再說)。使用函式的最佳方法是建立包含你自己的命令/過程的庫。例如,你可以透過修改我們的 hello_world 函式來建立自己的輸出命令:

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 天將在下一課中繼續...

華夏公益教科書