GVBASIC入门
序言1.1 BASIC的历史
BASIC是Beginner''s All-purpose Symbolic Instruction Code 的缩写,意为初学者通用符号指令代码语言,它是在1964年由美国的两位教授Thomas 和John G.Kemeny在Fortran语言的基础上设计的语言系统,这个简单、易学的程序设计语言当时只有17条语句,12个函数和3个命令,现在一般称其为基本BASIC。
BASIC语言自诞生起,几十年间,经过世界各地的微机生产厂家的不断扩充和完善,先后出现了许多版本,其有几个版本使用最为广泛,如:APPLE-Ⅱ机上用的APPLE SOFT BASIC,LASER-310上用的MSBASIC以及IBM-PC及其兼容机上用的BASICA和GWBASIC等.另外还是MicroSoft公司的MSBASIC和QBASIC等.
从诞生之初,BASIC语言就以其简单,易学对硬件要求低等特点受到了广大程序设计人员,特别是电脑初学者的青睐,历经数十年,显示了其顽强的生命力。如令BASIC语言在许多国家都作为一种计算机程序的教学语言和入门语言。流行当今的VisualBasic语言也借荐了许多BASIC语言的特点而倍受注目.
1.2 什么是文曲星GVBASIC
文曲星GVBASIC是在APPLE SOFT BASIC和GWBASIC基础上,继承了BASIC语言简单,易学功能强大的特点,根据文曲星自身的硬件特点而开发的程序语言,它的出现极大的拓展了文曲星的使用范围及功能,使用户能够根据自身的需求,编制出他们所需要的而现有文曲星上又没有的软件,真正做到了想你所想,做你所想。并且由于文曲星GVBASIC和其它BASIC语言的共通性,因此通过使用它可以为更好地了解及使用其它的BASIC语言和其它程序语言打下了一个良好的基础.
GVBASIC入门说完了BASIC语言的历史和GVBASIC语言的由来,让我们来进入GVBASIC语言的学习第一步。
2.1 GVBASIC的运行环境
2.1.1 GVBASIC(适用于CC800、PC1000、PC1000A)
进入方法:换算-->GVBASIC
编辑界面:
----------------------
-]_ -
- -
- -
- -
--
----------------------
你可以在命令提示符后面进行GVBASIC程序的编制。
2.1.2 BASIC助手(适用于全部系列)
如果你用的是PC1000/PC1000A/CC800系列的文曲星,BASIC助手则需要下载到你的文曲星上。BASIC助手可以在 http://www.ggv.com.cn/或 http://www.wqxnet.com/上找到。
如果你用的是NC1020或更新的的文曲星,BASIC助手已经被内置到你的文曲星上。进入方法同2.1.1节"CC800/PC1000/PC1000A进入GVBASIC的方法"。
如果以前没有BAS文件,会弹出"创建新文件?"的对话框,按Y即可。如果以前有BAS文件,BASIC助手会进入BASIC文件列表,按F1可以创建新文件。
编辑界面:
----------------------
-10_-
--
- -
- -
- -
----------------------
你可以在自动设置行号的后面进行GVBASIC程序的编制。
2.1.3 GVBASIC热线帮助
在CC800/PC1000/PC1000A的GVBASIC环境下或NC1020以后的BASIC助手内按"求助"键,会弹出GVBASIC热线帮助。在你编程的过程中遇到了程序错误,或者是不熟悉语句的使用,可以参考GVBASIC热线帮助。
2.2 第一个GVBASIC程序
好了,介绍完GVBASIC的运行环境,让我们来编出属于自己的第一个GVBASIC程序吧。本教材所有程序若无特殊说明均在BASIC助手下进行编辑和运行。
程序2.1 第一个GVBASIC程序
在BASIC助手编辑状态下输入:(前面的数字是行号,由BASIC助手自动添加,你无需输入)
10 CLS
20 PRINT "Hello, World!"
30 PRINT "By TimberHare"
40 END
你可以先不必知道上面的几行程序是什么意思,接下来我会为你一一讲解的。输入完毕,按跳出,选择保存文件,输入一个你喜欢的文件名,按输入保存。这样你就编程了属于自己的第一个GVBASIC程序。你也可以将TimberHare改成你自己的名字。
在BASIC助手的文件列表中,把反显示条移动到你刚才保存的文件名上面,按输入运行。你会看到屏幕上显示:
----------------------
-Hello. World! -
-By TimberHare -
- -
- -
- -
----------------------
如果你的程序没有运行成功或出现了错误信息,请确认:
1.程序输入无误。
2.命令使用大写输入。(引号内的文字是输出信息,无需大写)
如果你的程序正常显示,那么恭喜你,你的第一个GVBASIC程序成功了!
2.3 初等GVBASIC介绍
上面的程序是如何让你的文曲星打印出"Hello, World!"的呢?是PRINT命令在起作用。像PRINT一样,GVBASIC中有很多命令(也叫指令、语句)让你的程序显示出各种各样的效果,不一定是打印出文字,也可以是画出图形,发出声音等。那么就由我来给大家慢慢介绍GVBASIC中初学者最常用到的几条命令。我也将在介绍这些语句的同时介绍GVBASIC中的几个最基本、最常用的概念。
2.3.1 PRINT命令
我们先从上面的PRINT命令讲起。试着把2.2的程序的20行改为:
20 PRINT "GVBASIC PROGRAM"
再运行,你会发现输出变成了:
----------------------
-GVBASIC PROGRAM-
-By TimberHare -
- -
--
- -
----------------------
这说明什么呢?这说明PRINT所在屏幕上面印出的文字与后面引号内的文字是一样的。在语句中像PRINT语句后面的引号中的内容,随着该内容的变化,引起执行后效果变化的命令的一部分叫做该命令的参数。所以,PRINT语句输出的内容是由它后面的参数决定的。
介绍了参数的概念,那我们来介绍PRINT语句的一般形式。所谓语句的一般形式,是指该命令所支持的不同形式的参数的形式的表达,其表达具有一般性,而不是针对某个特殊的情形。
语句 PRINT:在当前光标位置输出指定字符
语法 作用
PRINT 输出空一行
PRINT "xxx" 其中"xxx"为任意字符串
PRINT A$ 输出字符串A$
PRINT B 输出实数型变量B
PRINT C% 输出整型变量C%
PRINT A;B 以紧缩方式输出A和B:(其中A、B可以为数变量、字符串变量或字符串)
若A、B皆为数变量,则将两个数隔一个空格输出,否则不空格紧靠着输出
PRINT A,B 以换行方式输出A和B:(其中A、B可以为数变量、字符串变量或字符串)
输出A后换一行再输出B。
再顺便说一下程序开始的CLS:
语句CLS:清除当前屏幕内容
语法 作用
CLS 清除当前屏幕内容,将光标位置设置为1,1
还有程序结束时的END:
语句END:结束程序的执行
语法 作用
END 结束此程序的执行,等待一次按键后退出到BASIC运行环境
上面说到了很多关于数变量、字符串变量和字符串的概念。这些变量的概念将贯穿你学习、使用GVBASIC的始终。下面我们来逐一介绍:
变量:用一个或几个字母和数字的组合来表示一个数或者字符串。变量的定义和变量所表示的数在程序中的改变,都要使用LET语句(将在2.3.2中介绍)。在GVBASIC中变量的名称最长16个字符,且必须以字母开头。而且,变量名的定义不能与保留字相冲突,比如PRINT,LET等命令名都属于保留字。事实上,在GVBASIC热线帮助中所列出的命令和系统函数名称都不可以作为变量名的定义。
数变量:包括实数型变量和整型变量。
实数型变量:表示一个实数,范围从-1E+38到1E+38,通常正号可以省略,例如:B表示变量为实数型。
整型变量:表示一个整数,范围从-32768到+32767,通常正号可以省略,类型声明符为%,例如:C%表示变量为整型。
字符串:一个或几个字母、数字或符号的组合,用一对双引号括起来。
字符串变量:表示一个字符串,类型声明符为$,例如:A$表示变量为字符串。
还有一点要注意的是:在GVBASIC里面,所有的命令必须使用大写字母书写。
2.3.2 LET命令赋值
变量是怎么定义的?又是怎么在程序中改变的?这要用到GVBASIC中用处最大的命令:LET。
语句LET:给变量赋值
语法 作用
LET A=xxx 给变量A(可以是实数型、整型或字符串)赋值xxx,其中xxx的数据类型要与变量类型匹配
且未溢出(在文曲星处理范围之内)
什么叫做数据类型匹配?就是说,实数不能赋值给整型变量,数不能赋值给字符串变量,字符串也不能赋值给数变量。但是由于实数包含整数,所以整数可以赋值给实数型变量。
LET语句在通常情况下写作:A=xxx,其中LET可以省略。
现在把程序2.1改为:
10 CLS
20 A$="Hello, World!"
30 B$="By TimberHare"
40 PRINT A$,B$
50 END
再运行,可以发现运行的结果是一样的。虽然此时无法看出使用变量的优越性,可是当我们要在一个程序里面大量处理同几个数据作为输入,对程序的简化、修改的简便是不言而喻的。
2.3.3 用LET命令进行计算
我们使用计算机的最初目的就是输入数据进行计算。用LET命令可以对一个表达式进行计算后赋值给变量。什么是表达式?表达式包括数学上的有理式、无理式,逻辑关系表达式和字符串表达式等。表达式的概念是十分广泛的,它的特点是任何表达式计算的结果可以用一个变量来表示。表达式常用的运算有:
数值表达式
+ 加法运算符
- 减法运算符
* 乘法运算符
/ 除法运算符
^ 乘方运算符
关系运算符
= 等于
> 大于
>= 大于或等于
﹤>不等于
逻辑运算符
AND 逻辑与
OR 逻辑或
NOT 逻辑非
注意:关系运算符中的等于"="并非LET语句省略式中的"="!尽管两者意义相近,但是等于运算的结果是一个数,这个数代表着关系运算是否成立,1代表成立,0代表不成立,而赋值是将"等号"右端的数、字符串、变量或表达式赋给左端的变量。其他的关系运算符用法与等于运算相近。
逻辑运算符的用法:
0 AND 0 = 0,1 AND 0 = 0,0 AND 1 = 0,1 AND 1 = 1
0 OR 0 = 0,1 OR 0 = 1,0 OR 1 = 1,1 OR 1 = 1
NOT 0 = 1,NOT 1 = 0
由于关系运算的结果只有0或者1,所以可以利用逻辑运算进行复杂的关系运算。
合法的表达式的例子:2+3,45*A/B,A>2,A$+B$,(A=5) AND (B=7)
注意:数和变量的乘法不可省略乘号,如C=2R是错误的;两个或多个字符串可以进行相加,结果为前面的字符串紧跟着后面的字符串的新的长字符串;同一个表达式内有多个运算符时要按照运算优先级进行,顺序为:括号,乘方,乘除,加减,NOT,AND,OR,关系运算。所以务必要注意使用关系运算做逻辑运算时一定加上括号。
语句LET:进行表达式计算
A=表达式 将表达式的值赋给变量A,注意变量数据类型的匹配。
2.3.4 处理数据的输入
要编一个实用的程序,不能把你所需要的数据都编在程序里,这样你要使用新的参数计算一个新的结果,就会涉及到改程序的问题。改程序是很麻烦的一件事情,能不能在运行程序的过程中把需要的参数输入到程序里面直接运行而不需要修改程序呢?这就需要处理数据的输入了。都说输入和输出是相辅相成的,最基本也是最常用的输出命令PRINT我们已经讲过了,现在我们来讲输入的命令:INPUT。
语句INPUT:输入数据将它赋值给变量
语法 作用
INPUT A 从键盘输入变量A,以"?"为提示符
INPUT B$;A 从键盘输入变量A,以B$为提示符;B$可以直接写成字符串形式
通过INPUT命令,我们很容易通过输入向程序传达不同的参数。
程序2.2 输入半径作为参数计算圆的周长
10 CLS
20 INPUT "R=";R
30 S=2*R*3.1416 : PRINT "Area=";S
40 END
从这个例程,我们可以理解INPUT语句的用法。同时,也对上面学到的PRINT进行了复习。还有,本例程用到的GVBASIC的另一个重要性质:可以在一个行号下写多条命令,之间用":"隔开。由于GVBASIC最多支持行号到9999,在编写大型程序的情况下,9999有可能不够用,利用GVBASIC的这个性质可以节省行号资源。利用这个性质的一点注意:用":"作为分隔符时,最好在":"两边各加一个空格,否则极容易使程序出错。
2.3.5 用INKEY$函数处理数据的输入
上面介绍了用INPUT命令处理数据的输入。下面,我们来介绍另外一种处理输入的方法:INKEY$函数。说到这里,我们先要介绍一下函数在GVBASIC里面的概念。函数代表的是一个值,但是它不同于变量的一点是大多数函数需要参数,通过参数来得到函数的值,函数的值随着参数的变化而变化。一些函数需要自定义,另外一些可以直接运用,这些可以直接运用的我们称之为系统函数。我们现在要介绍的是一个特殊的系统函数INKEY$,它没有参数,但是这个函数传达了系统获得按键的状态,相当于我们按的键作为了INKEY$函数的参数。函数也有数据类型,这一点它和变量很像,比如说INKEY$后面带有的$符号表明它是一个字符串型函数。下面我们来介绍INKEY$的作用。当我们在使用INPUT输入数据时,我们输入了一个字符串。在输入完字符串后,需要键入"输入"键确认结果。可是,一些情况下我们不需要键入"输入"键,我们只需要按一个键就足以想要的效果,这时我们应该使用INKEY$函数。例如大多数的程序中的菜单,只需要接受某一个键就可以知道你要做什么,这样的情况下我们大多数使用INKEY$函数处理输入。INKEY的另外一个作用是:它使系统进入等待一次按键的状态,当此次按键完成后,程序继续运行。比如说我们想做一个"按任意键继续"的效果,使用INKEY$是最佳的选择。
函数INKEY$:系统等待一个按键值,当按键完成后将该值赋值给变量,程序继续执行
语法 作用
A$=INKEY$ 其中A$可为任意字符串变量。
INKEY$ 非正式用法,可以使系统等待一次按键
用上面介绍的INKEY$我们先来做一个"按任意进继续"的例程,在以后介绍了程序控制流程语句之后,INKEY$的用途将更加广泛。
程序2.3 模仿DOS下的"DIR命令",分页时按任意键继续
10 CLS
20 PRINT "Drive C has no label"
30 PRINT "Serial No.TimberHare"
40 PRINT "COMMAND COM"
50 PRINT "HIMEM SYS"
60 PRINT "按任意键继续...";
70 A$=INKEY$
80 PRINT "EMM386 EXE"
90 PRINT "3 file(s) listed"
100 PRINT "433290 bytes total"
110 PRINT "979924 bytes free"
120 END
通过这个程序你可以很明显的看出INKEY$与INPUT的差别。当然,你也可以将上面PRINT命令的参数改为其它你想要的输出结果。
2.3.6 程序流程的控制(跳转语句GOTO)
刚才我们讲过的程序中,程序里面所有的语句都是按照行号依序执行的。那么,为什么要引入行号呢?如果顺序执行的话不要行号也能执行了。行号的主要作用之一其实就是为跳转语句提供方便。所谓跳转语句,就是在程序中使程序的执行转到我们想要的地方执行,而非顺序按照行号执行。GOTO语句就是这样的跳转语句。
语句GOTO:跳转到指定行号继续执行
语法 作用
GOTO xxxx 跳转到行号xxxx继续执行,其中xxxx是程序中已经定义的行号,否则GOTO语句将出错
xxxx 简化用法,等同于GOTO xxxx,一般在一行内写多个语句或者作为THEN(将在以后介绍)后面的语句时使用
请看下面的例程:
程序2.4 示例跳转语句GOTO的使用
10 CLS
20 PRINT "BEFORE GOTO"
30 GOTO 50
40 END
50 PRINT "AFTER GOTO"
60 GOTO 40
你可以去掉30句再运行此程序,观察程序输出的变化。可以看出,如果没有30句的GOTO,程序将不会执行50句的输出。
2.3.7 程序流程的控制(子程序GOSUB...RETURN)
上面我们讲了用GOTO语句来控制程序的流程。下面,我们来学习一种新的程序流程控制方法,那就是调用子程序。所谓子程序,简单的说,就是一小段程序代码。这些子程序在实际应用中往往联系到主程序的一些参数,然后传达另一些处理过的数据返回到主程序,在调用子程序的语句的下一行继续执行主程序。特别是一段特定的程序在一个程序中要大量的重复调用,这时候最好用子程序。下面我们来讲一下如何运用子程序。
语句GOSUB:跳转到指定行号的子程序
语法 作用
GOSUB xxxx 跳转到xxxx行号的子程序执行,遇到RETURN语句则返回到GOSUB语句的下一行继续执行
语句RETURN:从子程序返回
语法 作用
RETURN 从子程序返回到相应GOSUB语句的下一行继续执行
从上面的介绍中我们不难看出GOSUB和RETURN必须组合使用。这也是我们在这本书里介绍的第一组组合使用的语句。下面请看例程:
程序2.5 示例子程序语句GOSUB的使用
10 CLS
20 PRINT "BEFORE GOSUB"
30 GOSUB 60
40 PRINT "AFTER GOSUB"
50 END
60 PRINT "IN THE SUBPROGRAM"
70 RETURN
你可以将30句的GOSUB改为GOTO,运行程序会发现有错误信息出现,这是因为RETURN找不到与之对应的GOSUB语句;再将70句删掉,会发现回不到40句了。这就是GOSUB语句与GOTO语句的区别。虽然我们可以这样写:
程序2.5a 用GOTO代替GOSUB做子程序
10 CLS
20 PRINT "BEFORE GOSUB"
30 GOTO 60
40 PRINT "AFTER GOSUB"
50 END
60 PRINT "IN THE SUBPROGRAM"
70 GOTO 40
但是如果这样写程序就有失灵活性,更何况如果调用子程序再多一些用GOTO程序会是多么的繁琐。
常用的技巧总结
一.随机函数的应用。
随机函数大家都很熟悉吧!对于虾米们可能不知道如何使用下面让我来为大家介绍一下他的用法
RND(1)可以产生一个0-0.999999999999999………….无限循环的一个数字。这个数字也是不确定的。那么怎么进行运用呢?
很简单:
RND(1)*N
这里N是一个数字假设N是10的话我们进行一下分析。RND(1)的最小可能是0对吧!最大也就是9.999999999了我们现在用10相乘会得到0-9.9999999999999的数据然后呢我们用INT()函数(一个取正函数)进行取正所以得到0-9这样假如我们要的倒1-10的数呢?使用随机函数的公式就是
INT(RND*N)+1
N是你的数字。然后就可以抽取1-N的数字了当然其他的也就可以了
例子:
10 A=INT(RND*26)+65
20 PRINT CHR$(A);
30 KZ$=INKEY$
40 GOTO 10
这样就会发现屏幕上会打印出A-Z的26个字母的其中的一个。上面的程序。PRINT后面有;表示下次打印字符不需要换行。注意这一点对于在屏幕第5行打印字符很有用
CHR$是字符转换函数可以将一个ASCII转换为他的相应字符。如果不知道每个对应什么参看GVBASIC的帮助就可以了
随机函数的应用
1.试题系统里面需要你首先可以你的试题编号然后用RND来随机抽取这样会出现千变万化的结果
2.游戏当总敌人的智能方面,众所周知如果让电脑去寻找一条路线或目标肯定是远远超过人的。这个时候使用随机函数干扰他。比如一个敌人遇到城墙的话有两种选择。第一种是寻找游戏者。第二种:停止不动 第三种:随便找个方向而不管是否能找到游戏者。
那么我们的程序再遇到这种情况后。就可以设定一个范围比如 R=INT(RND(1)*50)
然后规定 R<10 就寻找路径 R>=10 AND R<=40就停止不动 R>40就随便走动。
根据这个分析大家肯定会知道这个电脑是一个稳重型的.因为他大部分情况是在停止状态当中。当然你通过数据的范围分配就可以让他变得很聪明或痴呆无比。再就是攻击系统需要使用比如你受到攻击了。到底失去多少HP(血)呢?用 R=INT(RND(1)*10)+30看看这样就很生动了是吧!在就是如果你写电脑攻击多个对象的时候也是需要随机函数来抽取到底攻击哪个对象,当然选择完毕还要判断这个对象是否已经死亡或者是己方人员如果是自己人或者已经死亡那么表示不能攻击这个对象。需要重新RND道理很简单应该能明白哈!
3.模拟比如你要给你的GAME做一个片头屏幕上下着雪。那么雪的移动速度和位置都可以用随机函数来确定这样就实现了。至于怎样控制多个雪花移动请参看我的其他文章关于[多个动画角色的控制]。
二.数据文件的使用(随机文件)
我这里要和大家说的是随机文件。因为在WQX里面使用随机文件可以让数据的读取和查找十分迅速。当然顺序文件也不错但是他比较简单我这里就不多说了
先看下面的
////////////////////////////////////////////
称呼 性别 地区 职务 编号
////////////////////////////////////////////
青蛙 雄 池塘 班长 12312341
兔子 雌 山坡 组长 5652
鸭子 不祥鸭圈 平民 5656
… …
这是一个表格。看到了第一行的 称呼…职务 的划分了么(随机文件叫字段)。这就表示这个表格的每条信息(随机文件叫记录)的划分情况。下面的每个信息(记录)就是文件里面的具体数据。
当然我们在做游戏的时候需要保存多个游戏者的名称,游戏时间,分数等等和这个一样了。
那么怎么用文件保存呢?
语法就是
OPEN "FF.DAT" FOR RANDOM AS #1 LEN=40
晕了么?让我来解释一下 OPEN 就是打开的意思(如果文件没有建立OPEN的同时会建立一个空的文件)。 FOR RANDOM 表示文件打开的是随机的方式这种方式打开的文件可以直接访问任意一条的信息,相当方便。 AS #1 就是 文件打开的时候给他分配一个数字编号。就像你的学号一样.为什么这样呢。这样用起来方便.因为以后只要用 #1 就可以表示这个文件了。(当然我这里讲述的是通俗一点的说法,其实只要能将问题说明白也不用使用那么多虾米都看不懂得专业术语)关键的地方是 LEN=40这里的40是什么意思呢?其实他表示你的一条信息的最大的长度。就是
称呼的字节长度+性别的字节长度… +编号的长度(不懂的话往下看就知道了)
我粗略的算了一下用40个字节比较合适。对了要提醒的是汉字是2个字节哟!
文件已经打开了。但是怎么读取一条信息呢?
首先你应给告诉你的程序。你的文件的信息的划分情况。语句是 FIELD
FIELD #1 ,8 AS XM$ ,6 AS XB$,10 AS DQ$,6 AS ZW$,10 AS BH$
这里的XM$,XB$,DQ$,ZW$,BH$是姓名,性别…编号的汉字拼音缩写当然你可以自己起任意的变量名称。
这样你就划分好了一号文件的情况 XM$=8个字节长度,XM$=10个字节长度….. …..
你算算这些长度的总和
8+6+10+6+10=40
对吧!所以我们的文件打开的时候LEN=40明白了么?
一个文件都是有大小的。GVBASIC使用LOF(文件号)
这个文件的大小就是 LOF(1)
我们用 LOF(1)/40就可以得到文件里面有多少个动物的数据了哈!
文件打开了。字段也划分好了怎么写入呢?
其实很简单
LSET XM$=具体的数据
LSET XB$=具体数句
。。。。 。。。。。。
LSET(我后面会给大家解释的)
当你把所有的数据都写入完毕的时候你实际还没有真正的存入文件里面(实际是写入了缓冲区不过不管他什么缓冲不缓冲的不知道也没有关系).怎么存入呢?一句话
PUT #1 ,N
这里的#1大家都知道了。N是什么意思呢?N表示写到数据文件的第几条。当你的文件里面有3个动物的信息的时候你 PUT #1,4就是填写为新的数据如果PUT #1 ,2就是将现在的信息覆盖第二条信息.以此类推。
要注意的是你的N最小是1,N最大只能是这个文件的信息(记录)的总数+1也就是说如果你有3个动物的信息如果你PUT #1,5的话就会因为没有第4条而出现错误。怎么确定文件有多少记录呢?LOF(1)/40前面讲过了
好了祝贺你这条信息保存了。然后呢?如果你要继续添加数据的时候就继续添加如果不需要了那么一定注意!!!!!!!!!!!用 CLOSE #1 关闭文件。(虾米一定注意,打开文件并使用完毕要关上。做事情要善始善终嘛!要不然会倒霉的)
好了说说LSET吧!还记得姓名被划分了8个字节的长度吧?也就是说如果你在姓名里面填写一个字母也要占用8个字节,其他的会用空格(置于是不是空格我也不清楚,可能是吧)补充的(浪费!所以要合理的划分字段长度,)
既然是8个长度,那么输入一个 [小猪] 的话怎么放入呢?是
1.
小猪
oooooooo (8个字节)
还是
2.
小猪
oooooooo(8个字节)
其中LSET就是表示用第一种方式写入,如果你要用第二种的话就是用RSET
LSET实际就是LEFT SET ,RSET 就是 RIGHT SET
需要说明的是你输入的长度如果超过了8个字节长度,多余的字节会被截去的。
明白了吧!其实复杂的东西如果明白了就是这么简单。
数据是保存好了。但是怎么搞出来呢?
用 GET呀!
GET #1,N
其中N就是第几条信息。(N最小为1最大不能超过你的信息的数目)
GET #1,1就是读取第一条信息。然后你字段划分的变量里面就有数句了
PRINT XM$;XB$;DQ$;ZW$;BH$
就可以看到了啊!
到这里就完全讲完了怎么样?有做一个课程表,成绩管理的程序的冲动嘛。哈哈还等什么动手做吧!(记得最后CLOSE #1哟!还有当你CLOSE以后就不能再读这个文件了除非你再OPEN)
使用总结:1.我经常玩星迷的游戏发现如果不创建安装文件就会出错误。(尴尬)
如果你能再OPEN以后用LOF(文件号码)测文件的长度。(果为0就表示没有信息。)那么就不会出现上面尴尬的局面了。(文件没有内容你随便GET不出错才怪)
2.再就是如果你要做查询就可以让用户输入信息然后从文件的第一条到最后一条依次读取然后进行比较。(虽然慢但是在文曲星上面很不错了。当然如果你能给信息编号用分治的算法搜索更好了啊,不过就是程序复杂了一点)
3.如果你要保存地图的话。一个地图信息的长度为20(因为wqx的屏幕20个字符),然后5个(WQX最多为5行)为一个组的对待就可以了。比如第1关的场景就是
ROUND=1
FOR XUN=(ROUND-1)*5 TO ROUND*5
GET #1,XUN
NEXT XUN
你就可以读取任意关的场景了啊!当然不一定是20个字符和5行信息这要看你的地图的划分情况了啊!反正我用的都是这样的(我喜欢因为速度快)。
说到这里我已经很累了。希望我的这些东西能给你们帮助。其实我也没有什么别的目的。就是大虾多一点,程序好一点哈!还有各位虾米要坚信:
只有最后的大虾没有永远的虾米!
技巧互动程序的设计
首先声明:这里的一些程序是比较基础的内容主要是给小虾们看的。各位大虾不要.. ..
许多星迷问怎么制作互动游戏程序这个问题其实很简单下面给大家解释一下
首先文曲星的INKEY$由于某些原因(我也不清楚)变得和INPUT$一样了。也就是说程序如果执行INKEY$的话就停到这里了。那么怎么样来即能够让INKEY$得到用户的键盘信息这里需要用到
IF PEEK(199)<128 THEN GOTO 行号
那么这一句程序做什么用呢?很简单PEEK(199)是监测内存当中是否有用户按下键盘。如果有那么就>=128所以如果用户没有按的话就没有必要执行INKEY$的问题了这样也就避免了程序停留在INKEY$上的问题了。程序如下面所写的
10 IF PEEK(199)<128 THEN GOTO 30'如果发现内存没有按键盘信息就跳过20行从而避免程序的停顿
20 KZ$=INKEY$'得到用户的键盘按下的信息,INKEY$是得到用户键盘信息的函数
25 IF KZ$=" " THEN B=B+1'如果按下的是空格那么就让B+1
30 A=A+1:LOCATE 1,1:PRINT A '程序执行到这里A+1主要为了测试10句的作用看看程序是否停留在20行上了(这里当然没有了)。LOCATE 1,1让光标移动到 第一行,第一列为只。然后打印 A. LOCATE 用法 LOCATE Y,X (Y代表纵向第几行,X代表横的第几列也就是第几个字符位置)
35 LOCATE 2,1:PRNIT B'这一句俺就不多说了
40 GOTO 10 '程序转向到10
这样大家会发现如果不按键盘的话30-40的程序在不停的执行根本没有停留在INEKY$上面怎么样问题解决了。当你按下空格的话 B就+1这样互动的第一部就完成了。
(当然这里的这些技术早在N年以前就公开了但是考虑到有许多小虾和第一次亲密接触GVBASIC的人还很多不知道所以就做以下解释大虾不要笑哇!)
小虾们可以转换或将下面的代码搞到星星里面看看效果(注意 * 不要呀!)
*******************************************************
10 IF PEEK(199)<128 THEN GOTO 30
20 KZ$=INKEY IF KZ$=" " THEN B=B+1
30 A=A+1:LOCATE 1,1:PRINT A
35 LOCATE 2,1:PRNIT B
40 GOTO 10
*****************************************************
知道了上面的程序我们就可以继续作下面的了
如何控制一个方块在屏幕上移动
首先我们这个方块的绘制不能用绝对坐标需要用X,Y变量的相对坐标
请看下面的程序
1 GRAPH'更改屏幕为图形模式
5 X=100'初始化X
6 Y=40'初始化Y
8 TEMPX=100'下面有它的解释
10 IF PEEK(199)<128 THEN GOTO 40
20 KZ$=INKEY$
25 IF KZ$=CHR$(23) THEN TEMPX=TEMPX-8'这里大家肯定会奇怪为什么是TEMPX呢?下面我为大家解释一下这是因为如果你让X直接+8或者-8的话如果超出屏幕那么就会导致错误而且我们下面的程序还要在X,Y的位置清除原来的图形呢。如果这里就改写了X的数据那么我们怎么清除原来的图形呢?所以这个TEMPX是临时使用的一个变量对这个变量进行了合法的检验及图形的清理以后就可以把他给X了。当然这里的算法不是很好有很好的算法再WQXNET.COM上为了让大家能够明白所以就牺牲一下速度了
26 IF KZ$=CHR$(27) THEN END'如果按跳出就结束程序
30 IF KZ$=CHR$(22) THEN TEMPX=TEMPX+8'和20一样的道理。CHR$(22)是表示方向
右键。你可以让KZ$=一个字符但是你在做程序的时候不能输入右方向为一个字符。所以需要用这个东东了。上为CHR$(20),下为CHR$(21)具体的解释看相关的GVBASIC手册
40 IF TEMPX<0 THEN TEMPX=0'检验TEMPX是否超出屏幕
45 IF TEMPX>160-8 THEN TEMPX=160-8'同40
50 DX=X:DY=Y:GOSUB 600'转向到600也就是清除图形的模块(虽然就一句话但是当你移动的不是方框而是一个由很多程序组出来的精灵的时候就要用到了,并且这也是好的习惯)
60 X=TEMPX'因为已经在X,Y原来的位置清除图形了并且TEMPX也进行了合法的检验所以这里我们就可以让X=TEMPX以便能在新的位置绘制图形
70 DX=X:DY=Y'为什么动DX,DY呢?主要是为了程序的代码的重用性大家慢慢考虑其中的道理吧!
80 GOSUB 500'绘制动画
100 GOTO 10'转到10句
500 BOX DX,DY,DX+7,DY+7,1,1'绘制方块
510 RETURN
600 BOX DX,DY,DX+7,DY+7,1,0'清除方块
610 RETURN
小虾们可以转换或将下面的代码搞到星星里面看看效果(注意 * 不要呀!)
****************************************************************
1 GRAPH5 X=100'
6 Y=40
10 IF PEEK(199)<128 THEN GOTO 40
20 KZ$=INKEY$
25 IF KZ$=CHR$(23) THEN TEMPX=TEMPX-8
26 IF KZ$=CHR$(27) THEN END
30 IF KZ$=CHR$(22) THEN TEMPX=TEMPX+8
40 IF TEMPX<0 THEN TEMPX=0
45 IF TEMPX>160-8 THEN TEMPX=160-8
50 DX=X:DY=Y:GOSUB 600
60 X=TEMPX
70 DX=X:DY=Y
80 GOSUB 500
100 GOTO 10
500 BOX DX,DY,DX+7,DY+7,1,1
560 RETURN
600 BOX DX,DY,DX+7,DY+7,1,0
610 RETURN
******************************************************************
怎么样运行一下,屏幕上有一个可以用左右方向控制的方块了吧!如果你把!500,600里面的图形程序改成精灵的话那么你就有了一个能够走动的精灵的动画了。
GOSUB和GOTO造成的内存溢出
请看这个分析你就知道GOSUB 和 GOTO 使用不当之处了
10 INPUT A
20 GOSUB 40
25 PRINT A
30 GOTO 10
40 IF A>10 THEN PRINT "你输入的数字大于10请重新输入":GOTO 10
50 RETURN
这个程序的致命的错误就在于40句的GOTO 10.因为当20句的程序转向到40的时候系统已经为这个GOSUB 保存了这句程序的下一句程序的位置(也就是行号25 ) 在堆栈当中,如果正常的话遇到RETURN程序会根据堆栈保存的位置返回,同时清空这个堆栈所占用的空间(这就是RETURN为什么能够正确返回到GOSUB 下句的原因).
40句的程序由于直接返回了程序,那么GOSUB 所存放的那个地址就没有因为遇到RETURN而清空.这样就占用了一定的资源。如果你的程序里面多次(比如循环)使用这种错误方法的话那么很快内存就会因为保存了过多的地址而造成堆栈的溢出,文曲星上就叫内存空间不足(OUT OF MEMORY).也许大家有时候做游戏明明程序不大但是总是内存不足可能这就是罪魁祸首。千万要注意啊!
上一个错误的小程序例子。如果有谁能运行这个程序不内存溢出的话。那请你相信你现在是在梦里运行这个程序。
10 GOSUB 20
20 GOTO 10
30 RETURN
这个程序就是因为10句用了GOSUB 但是没有用30返回而是用20的GOTO返回了所以... ...
希望对大家有帮助
动画无闪烁的技巧
许多星迷在制作动做游戏的时候都会遇到动画绘制闪烁的问题,这个主要是文曲星的机器性能导致的。
但是我们可以采取一种积极的办法尽量减少他的闪烁。特别是动画多的时候我介绍的这个技巧很好用。
让我们看看通常的动画程序的过程。(当然这种办法在电脑上是无所谓的但是在WQX上就会闪烁的)
假设一个动画用X,Y表示他的坐标那么它的动画控制过程是这样的。
1 清除动画
========================
2 计算他的新的X,Y的坐标
3 根据它的X,Y坐标进行一定的数据判断(这部分程序量的多少决定闪烁的严重程度)
========================
4 在 X,Y绘制动画
5 返回到第1部进行下一次控制
大家会发现第1步清楚图形以后。2,3程序运行的时候这个动画在屏幕上是不显示的
只有第4部运行的时候才能看到。
假设每个步骤占用1秒的时间(仅仅是假设,因为程序不可能慢到1秒一步的程度)
那么这个动画只有 4,5步的时候是可见的。1,2,3步都不可见。
这样5秒内的时间内可见为2秒,不可见是3秒那么闪烁就是不可避免的。
那么我们需要解决的就是在2,3步骤优化
具体的办法就是
1 用Tx=X,Ty=y表示X,Y的位置进行计算
2 根据Tx,Ty坐标进行一定的数据判断
3 X,Y的位置清空图形。然后让X=Tx,Y=Ty
4 在X,Y的位置绘制动画
5 返回到第1部分
这样我们发现动画不可见的步骤仅仅为第3步。这样大量减少了动画的闪烁情况。
为什么用Tx,Ty表示动画的坐标呢?因为用Tx,Ty可以对动画的新的X,Y坐标进行许多合法性的判断同时不破坏X,Y的值以便于动画的清除。
下面是一个简单的动画程序
向大家进行解释
5 X=1:Y=1
10 BOX X,Y,X+5,Y+5,1,1
20 X=X+1
30 IF X=10 THEN LCOATE 1,1:PRINT X
40 IF X=20 THEN LOCATE 1,1:PRINT X
50 IF X=30 THEN LOCATE 1,1:PRINT X
60 IF X=40 THEN LCOATE 1,1:PRINT X
70 IF X=50 THEN LOCATE 1,1:PRINT X
80 IF X=60 THEN LOCATE 1,1:PRINT X
90 IF X=70 THEN LCOATE 1,1:PRINT X
100 IF X=80 THEN LOCATE 1,1:PRINT X
110 IF X=90 THEN LOCATE 1,1:PRINT X
120 IF X=100 THEN LCOATE 1,1:PRINT X
130 IF X=110 THEN LOCATE 1,1:PRINT X
140 IF X=120 THEN LOCATE 1,1:PRINT X
145 IF X=130 THEN END
150 BOX X,Y,X+5,Y+5,1,0
160 GOTO 10
这个程序运行的时候闪烁的很严重。其中的30-40就是对X的判断当然游戏里面是对他的合法性以及其他的功能的判断。
优化后的程序
5 X=1:Y=1
10 TX=X:TY=Y
20 TX=TX+1
30 IF TX=10 THEN LCOATE 1,1:PRINT TX
40 IF TX=20 THEN LOCATE 1,1:PRINT TX
50 IF TX=30 THEN LOCATE 1,1:PRINT TX
60 IF TX=40 THEN LCOATE 1,1:PRINT TX
70 IF TX=50 THEN LOCATE 1,1:PRINT TX
80 IF TX=60 THEN LOCATE 1,1:PRINT TX
90 IF TX=70 THEN LCOATE 1,1:PRINT TX
100 IF TX=80 THEN LOCATE 1,1:PRINT TX
110 IF TX=90 THEN LOCATE 1,1:PRINT TX
120 IF TX=100 THEN LCOATE 1,1:PRINT TX
130 IF TX=110 THEN LOCATE 1,1:PRINT TX
140 IF TX=120 THEN LOCATE 1,1:PRINT TX
145 IF TX=130 THEN END
150 BOX X,Y,X+5,Y+5,1,0
155 X=TX:Y=TY
160 BOX X,Y,X+5,Y+5,1,1
170 GOTO 10
这个程序的闪烁程度就大大降低了。当然大家会认为150-160,10,行的程序有些啰嗦。这是因为这里的30-40没有对X,Y进行一些特殊的判断和改动。如果再制作复杂游戏的时候X,Y的变化情况是相当复杂的。
同时提醒大家的是对坐标进行改动的时候比如X=X+1的时候最好不要直接改变她的值。采用TX=TX+1的办法最好到底有什么好处只有大家在程序设计的时候才能发现啊!