跳转到内容

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 天将在下一课中继续...

华夏公益教科书