跳转到内容

DarkBASIC 编程/原始单页版本

来自 Wikibooks,开放世界中的开放书籍

一些课程可能不完整或根本没有完成。如果你觉得自己能够胜任,请贡献你的力量!


首先,感谢您查看这本关于 DarkBASIC 的书籍。这是关于 DarkBASIC 编程的第一本 WikiBook。并非每个人都能编程,但在信息时代,我相信每个人都有必要掌握使用不同类型技术的技能。特别是,计算机和编程。今天和接下来的 30 天,你将学习很多关于 DarkBASIC 编程的知识,以及你使用计算机可以实现的目标。DarkBASIC 就是关于让 DirectX 按照你的意愿行事,以及你在计算机游戏编程世界中的统治地位。我希望你能阅读并为本书做出贡献,以及发表你的抱怨,因为这样我才能修复问题,其他人也会受到启发。希望您喜欢!


第1课 - 编程入门

[编辑 | 编辑源代码]

在本教程中,我将假设你没有任何编程经验,否则你不会阅读这本书。你可能会拿起手册,将其与 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 不区分大写字母和小写字母。


第2课 - Hello World 传统

[编辑 | 编辑源代码]

好吧,你回来了。很好,希望你已经尝试过 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 ==

第3课 - 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,在其他语言中,除非你清除屏幕,否则屏幕上会保留上次修改的文本。缩进也很重要,但我们稍后再讨论。那么为什么要添加注释或缩进呢?在团队合作或开源项目中,它使你的程序更易于人类阅读,而且更容易阅读和定位,此外,当你以后回到你的项目时,你需要记住发生了什么,你可能会忘记。回到变量,你可以随意命名变量,但要确保它们不要太长,并且简要描述它们的作用或用途。

以下是一些变量示例

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 ==

第4课 - 数字运算

[编辑 | 编辑源代码]

第 9 天续

[编辑 | 编辑源代码]

这节课只有一天的内容。完成后,我们将继续学习 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==

第5课 - 循环

[编辑 | 编辑源代码]

相信我,循环很有用,它们可以完成繁琐的任务,并且易于使用。

以彩票程序为例

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 ==

第6课 - 文件控制与数据

[编辑 | 编辑源代码]

第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天将会有大量数据出现。

第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==

第7课 - 2D 游戏编程 第1部分

[编辑 | 编辑源代码]

终于到达了中途点,经过了所有这些编码、阅读和天数。在本章中,我们将使用更多文本命令来制作一个文字冒险游戏,你将学习这些命令。此外,你将学习如何用各种颜色清除屏幕,哦,男孩,你一定会喜欢这节课的。

你可能想,我的天,文本总是必须是白色的吗!

`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

这个游戏已经完成了,如果所有内容都不起作用,请随时发送电子邮件至:[email protected]

然后,为了证明你理解了正在发生的事情,你的作业是回去添加注释来描述每个部分正在发生的事情。作业的最后部分是编辑所有代码和数据语句以制作续集,添加房间和更多内容。不,这个游戏不是文字角色扮演游戏,我们将在下一课中制作文字角色扮演游戏。我认为明天你将迎来游戏编程的突破。

哦,男孩,哦,男孩,哦,男孩!今天我们将制作一个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. 1 - 精灵
  2. 2 - 正确
  3. 3 - A
  4. 4 - A
  5. 5 - C
  6. 6 - D

最后,我们需要结束这一漫长而艰难的硬编码日,因为另一天正在等待着,并带来了许多新的编码特性。

课程结束

[编辑 | 编辑源代码]

第8课 - 2D 游戏编程 第2部分

[编辑 | 编辑源代码]

第 19 天

[编辑 | 编辑源代码]
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 多人格斗游戏的简单格式。请注意,我巧妙地没有提供媒体!哈哈哈哈!现在开始编程吧!



请仅在书籍标题页面添加{{字母顺序}}

第 20 天

[编辑 | 编辑源代码]

->>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
华夏公益教科书