GW BASIC 聊天机器人,带有 DATABASE.TXT 文件

问题描述 投票:0回答:1

我正在尝试编写一个简单的 GW Basic 聊天机器人,该机器人从文本文件中读取关键字和回复以及默认回复。这是示例 DATABASE.TXT 文件

============= GW BASIC CHATBOT DATABASE =============

========= TESTS ROUTINE ===========

k:hello
k:hi

r:hi hello how are you?
r:good day nice to talk to you
r:how are you doing this lovely day?

k:sad
k:lonely

r:well i'm here with you let's talk?
r:what's sitting on your mind?

k:bad day

r:it's just a feeling that will pass cheer up
r:it's just a bad day not a bad life...

d:go on i'l listening
d:i see
d:i think i can understand
d:can you explain more?

这是我尝试实现的代码:

40 REM PROGRAM INITIALIZATION
50 DIM K$(100),R$(100),D$(20): KCOUNT=0: RCOUNT=0: DCOUNT=0:FLINE$=""
60 DIM KCS(100),RCS(100),DCS(20),KCE(100),RCE(100)
70 DATAFILE$="DATABASE.TXT"
80 REM LOAD DATABASE
82 ISKEYWORD = 0: KEYWORDNUM = 1: REPLYNUM = 1
90 OPEN "I",#1,DATAFILE$
100 WHILE NOT EOF(1)
110 LINE INPUT #1,FLINE$
120 IF LEN(FLINE$)>0 THEN TAGP = INSTR(FLINE$,":")
130 IF TAGP>0 THEN TAG$=LEFT$(FLINE$,1) : STEXT$=MID$(FLINE$,TAGP+1)
140 REM
150 IF TAG$="k" AND ISKEYWORD = 0 THEN ISKEYWORD=1 : RCE(RCOUNT)= REPLYNUM : RCOUNT=RCOUNT+1 : RCS(RCOUNT) = REPLYNUM
160 IF TAG$="k" AND ISKEYWORD = 1 THEN K$(KEYWORDNUM)=" "+STEXT$+" " : KEYWORDNUM=KEYWORDNUM+1
165 IF TAG$="r" AND ISKEYWORD = 1 THEN ISKEYWORD=0 : KCE(KCOUNT)= KEYWORDNUM : KCOUNT=KCOUNT+1 : KCS(KCOUNT) = KEYWORDNUM
170 IF TAG$="r" AND ISKEYWORD = 0 THEN R$(REPLYNUM)=STEXT$ : REPLYNUM=REPLYNUM+1
175 IF TAG$="k" AND ISKEYWORD = 0 THEN ISKEYWORD=1 : RCE(RCOUNT)= REPLYNUM : RCOUNT=RCOUNT+1 : RCS(RCOUNT) = REPLYNUM
180 IF TAG$="d" THEN D$(DCOUNT)=STEXT$ : DCOUNT=DCOUNT+1
190 WEND
200 CLOSE #1

250 PRINT "Hello! How can I assist you today?"
260 INPUT "YOU: ", USERINPUT$
270 REM
280 found = 0
290 FOR I = 1 TO KCOUNT
300   FOR J = KCS(I) TO KCE(I)
310     IF INSTR(USERINPUT$, K$(J)) > 0 THEN PRINT "BOT: ";R$(RCS(I) + INT(RND * (RCE(I) - RCS(I) + 1))): found = 1
320       REM
330       REM
340     REM
350   NEXT J
360 NEXT I
370 IF found = 0 THEN PRINT D$(INT(RND * DCOUNT) + 1)
380 GOTO 260

代码有效,但不符合我的预期:对于第一个关键字 - 回复对中的第一个关键字,我从第二个或第三个关键字/回复对或默认回复或空字符串中获得回复。我怀疑我的代码中有几个错误。一些在“读取database.txt文件并加载数组”中,一些在聊天机器人输入处理循环中

database chatbot gw-basic
1个回答
0
投票

好吧,经过多次尝试,我决定简化数据库和代码 - 而不是多个关键字/回复对,数据库只包含一个关键字到三个回复对,并使用 2D 数组作为 R$ 回复数组 - 这就是什么我想出了,并且有效:

数据库.TXT

======== DATABASE GW CHATBOT 2 =============

=========ONE KEYWORD THREE REPLIES==========

======== TEST DRIVE ==============

k:hi

r:hello
r:hi there
r:how are you?

k:hello

r:hi hello how are you?
r:hi nice to meet you
r:hello how is your day coming along?

k:sad

r:don't be sad it will be alright
r:why are you sad?
r:whats wrong? you can tell me...

k:lonely day

r:yes we are all alone in the world
r:is that how you feel? just remember this too shell pass
r:i'm sorry you feel like that i wish i could help

k:bad day

r:i hope your day gets better
r:everyone has bad bays tomorrow will be better
r:hang on i'm sure tomorrow will be better

d:i see
d:go on please
d:i'm listening
d:i think i understand

以及聊天机器人代码:

40 REM PROGRAM INITIALIZATION
50 DIM K$(100),R$(100, 3),D$(20): DCOUNT=1:FLINE$="":TAG$="":STEXT$="":TAGP=0:KNUM=0
60 REM 
70 DATAFILE$="DATABASE.TXT": RANDOMIZE TIMER
80 REM LOAD DATABASE
82 KEYWORDNUM = 1: REPLYNUM = 1
90 OPEN "I",#1,DATAFILE$
100 WHILE NOT EOF(1)
110 LINE INPUT #1,FLINE$
120 IF LEN(FLINE$)>0 THEN TAGP = INSTR(FLINE$,":")
130 IF TAGP>0 THEN TAG$=LEFT$(FLINE$,1) : STEXT$=MID$(FLINE$,TAGP+1) ELSE TAG$=""
140 IF TAG$="k" THEN K$(KEYWORDNUM)=" "+ STEXT$+ " ": REPLYNUM = 1: KEYWORDNUM=KEYWORDNUM+1
150 IF TAG$="r" THEN R$(KEYWORDNUM - 1, REPLYNUM)=STEXT$: REPLYNUM=REPLYNUM+1
160 IF TAG$="d" THEN DCOUNT=DCOUNT+1: D$(DCOUNT)=STEXT$
170 WEND
180 CLOSE #1

190 REM MAIN LOOP
200 PRINT "============================="
210 INPUT "YOU: ", USERINPUT$
211 USERINPUT$ = " " + USERINPUT$ + " "
220 IF USERINPUT$ = " BYE " THEN GOTO 500
230 KFOUND = 0
240 FOR I = 1 TO KEYWORDNUM - 1
250   IF INSTR(USERINPUT$,K$(I)) > 0 THEN KFOUND = 1: KNUM = I: GOTO 300
260 NEXT I
270 IF KFOUND = 0 THEN GOTO 400

300 REM KEYWORD FOUND, SELECT A RANDOM REPLY
310 RNUM = INT(RND * 3) + 1
320 PRINT "BOT: " + R$(KNUM, RNUM)
390 GOTO 190


400 REM KEYWORD NOT FOUND, USE DEFAULT REPLY
410 DNUM = INT(RND * DCOUNT) + 1
420 PRINT "BOT: " + D$(DNUM)
430 GOTO 190

500 REM EXIT
510 PRINT "BOT: GOODBYE!"
520 END
© www.soinside.com 2019 - 2024. All rights reserved.