基本介紹
- 中文名:GVBASIC入門
- 外文名:Beginner''s All-purpose Symbolic Instruction Code
- 套用學科:計算機
- 適用領域範圍:語言系統
歷史,入門,使用總結,使用技巧,
歷史
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語言的特點而倍受注目。
入門
GVBASIC的運行環境
2.1.1 GVBASIC(適用於CC800、PC1000、PC1000A)
進入方法:換算-->GVBASIC
編輯界面:
----------------------
-]_ -
- -
- -
- -
- -
----------------------
你可以在命令提示符後面進行GVBASIC程式的編制。
2.1.2 BASIC助手(適用於全部系列)
如果你用的是PC1000/PC1000A/CC800系列的文曲星,BASIC助手則需要下載到你的文曲星上。BASIC助手可以在文曲星官方網站上找到。
如果你用的是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熱線幫助。
第一個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程式成功了!
初等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運行環境
變數:用一個或幾個字母和數字的組合來表示一個數或者字元串。變數的定義和變數所表示的數在程式中的改變,都要使用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,其中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)
語句LET:進行表達式計算
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)
語句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了。當然這裡的算法不是很好有很好的算法再上為了讓大家能夠明白所以就犧牲一下速度了
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的辦法最好到底有什麼好處只有大家在程式設計的時候才能發現。