Deducir 4.0v
Descripción del contenido de la página
Herramienta de inteligencia artificial para ZX Spectrum (versión 4.0v).
Esta versión 4.0v de Deducir es una variante de la versión 4.0 que añade voz al programa, mediante un sintetizador de voz escrito por Óscar Domingo, que fue publicado en el número 23 de Microhobby y en el número 1 de Microhobby Cassette, junto con una serie de interesantes artículos sobre el tema (todo ello disponible actualmente en microhobby.org). Las instrucciones generales del programa Deducir son las mismas que las en el resto de versiones 4.x.
Pantallazo
Código fuente
10 REM Deducir 4.0v
20 REM Copyright © 1987,2015 Marcos Cruz (programandala.net)
30 REM Licenca/Permesilo/License: http://programandala.net/lp
40 REM Autor del sintetizador de voz: Qscar Domingo (Microhobby 23 y Microhobby Cassete 1).
50:
60 DEF FN D(A)=DATOS+3*(A-1): DEF FN O(A)=OBJETI+4*(A-1)
70:
80 LET X=1: FOR C=1 TO 3: FOR N=X TO LEN O$: IF O$(N)<>" " THEN NEXT N
90 LET I$(C)=O$(X TO N-1): LET X=N+1: NEXT C
100 FOR C=0 TO 2: POKE BUFFER+C,0: FOR N=1 TO CO: IF I$(C+1)=C$(N) THEN POKE BUFFER+C,N: GO TO 130
110 NEXT N: IF CO=TC THEN BEEP 2,-30: FOR N=C TO 2: POKE BUFFER+N,2: NEXT N: RETURN
120 LET CO=CO+1: LET C$(CO)=I$(C+1): POKE BUFFER+C,CO
130 NEXT C: RETURN
140:
150 FOR C=0 TO 2: IF DA THEN LET X= PEEK ( FN D(DA)+C)
160 IF OB THEN LET X= PEEK ( FN O(OB)+C)
170 LET I$(C+1)=C$(X): NEXT C: LET DA=0: LET OB=0
180 LET A$="": FOR C=1 TO 3: FOR L=LC TO 1 STEP -1: IF I$(C,L)=" " THEN NEXT L
190 LET A$=A$+I$(C, TO L)+" ": NEXT C: LET B$=A$: GO SUB 860: RETURN
200:
210 POKE 23658,8: POKE 23692,255: LET O$="": LET LO=0: PRINT " > ";
220 LET LO= LEN O$: LET C= CODE INKEY$
230 IF C=13 THEN PRINT : BEEP .1,30: RETURN
240 IF C=12 AND LO THEN PRINT CHR$ 8;" "; CHR$ 8;: LET O$=O$( TO LO-1): GO TO 280
250 IF C<32 OR C>122 THEN GO TO 220
260 IF C=32 THEN IF LO THEN IF O$(LO)=" " THEN GO TO 220
270 LET O$=O$+ CHR$ C: PRINT CHR$ C;
280 BEEP .04,5: GO TO 220
290:
300 GO SUB 80: LET RESP= USR DEDUCE
310 IF RESP=FALSO THEN LET A$="NO HAY FORMA DE DEMOSTRARLO.": LET B$="NO AI FORMA DE DEMOSTRARLO": GO SUB 860: GO TO 750
320 LET A$="PUESTO QUE": LET B$="PUESTO KE": GO SUB 860
330 FOR S=1 TO PEEK NOBJET: LET D= PEEK ( FN O(S)+3): IF NOT D THEN GO TO 360
340 IF D=EVIDEN THEN LET OB=S: GO SUB 150: GO TO 360
350 LET DA=D: GO SUB 150:
360 NEXT S: LET OB=1: LET A$="ENTONCES ": LET B$=A$: GO SUB 860: GO SUB 150: GO TO 750
370:
380 IF PEEK NDATOS=TD THEN BEEP 2,-30: GO TO 750
390 GO SUB 80: LET RESP= USR DEDUCE
400 IF RESP=CIERTO THEN LET A$="YA LO SE"+(", PUEDO DEDUCIRLO" AND PEEK NOBJET>1)+".": LET B$=A$: GO SUB 860: GO TO 750
410 IF RESP=EVIDEN THEN LET A$="NO HACE FALTA QUE ME LO DIGAS.": LET B$="NO ACE FALTA KE ME LO DIGAS": GO SUB 860: GO TO 750
420 IF PEEK NDATOS=TD THEN BEEP 2,-30: GO TO 750
430 POKE NDATOS, PEEK NDATOS+1: LET D= FN D( PEEK NDATOS)
440 POKE D, PEEK BUFF2: POKE D+1, PEEK (BUFF2+1): POKE D+2, PEEK (BUFF2+2): GO TO 740
450:
460 GO SUB 80: IF PEEK (BUFFER+1)<>2 THEN GO TO 530
470:
480 LET I$(1)=O$: LET O$=I$(1): FOR N=1 TO CO: IF C$(N)<>O$ THEN NEXT N
490 IF N<3 THEN LET A$="NO PUEDO HACER ESO.": LET B$="NO PUEDO ACER ESO": GO SUB 860: GO TO 750
500 FOR X=N TO CO-1: LET C$(X)=C$(X+1): NEXT X: LET CO=CO-1
510 POKE BUFFER,N: RANDOMIZE USR OLVCON: GO TO 740
520:
530 LET RESP= USR DEDUCE
540 IF RESP=CIERTO AND PEEK NOBJET=1 THEN RANDOMIZE USR OLVDAT: GO TO 740
550 IF RESP=EVIDEN THEN LET A$="NO CREO QUE PUEDA HACERLO.": LET B$="NO KREO KE PUEDA ACERLO": GO SUB 860: GO TO 750
560 IF RESP=FALSO THEN LET A$="NO CONOZCO ESE DATO.": LET B$="NO KONOZKO ESE DATO": GO SUB 860: GO TO 750
570 LET A$="ESE DATO SE DEDUCE DE LOS OTROS,POR LO QUE NO PUEDO OLVIDARLO.": LET B$="ESE DATO SE DEDUCE DE LOS OTROS POR LO KE NO PUEDO OLVIDARLO": GO SUB 860: GO TO 750
580:
590 IF NOT PEEK NDATOS THEN LET A$="NO CONOZCO NINGUN DATO": LET B$="NO KONOZKO NINGUN DATO": GO SUB 860: GO TO 750
600 FOR N=1 TO PEEK NDATOS: LET DA=N: GO SUB 150: NEXT N: GO TO 740
610:
620 CLEAR 46999: LOAD "DED40.BIN" CODE 47000,760
630 LOAD "VOZ.BIN" CODE 63000,2180
640 LET FALSO=0: LET CIERTO=1: LET EVIDEN=255: LET SER=1: LET TD=100
650 LET DEDUCE=47000: LET OLVDAT=47612: LET OLVCON=47675
660 LET NDATOS=47755: LET NOBJET=NDATOS+2: LET DATOS=NOBJET+2: LET BUFFER=DATOS+TD*3+250*3: LET BUFF2=BUFFER+4: LET OBJETI=BUFF2+3
670 LET LC=12: LET TC=100
680 DIM C$(TC,LC): DIM I$(3,LC)
690 LET CO=2: LET C$(SER)="SER": LET C$(2)=""
700 POKE NDATOS,0: LET DA=0: LET OB=0
710:
720 CLS : INK 7: PAPER 1: BORDER 1: CLS : PRINT "Deducir 4.0v"'"Copyright ©1987,2015 Marcos Cruz"'"(programandala.net)"'"Licencia/Permesilo/License:"'"http://programandala.net/lp"'"Sintetizador de voz escrito por"'"Qscar Domingo y publicado en"'"Microhobby (n.23 y Cassette 1)"'': GO TO 750
730:
740 LET A$="OK": LET B$="O KEI": GO SUB 860
750 GO SUB 210: IF NOT LO THEN GO TO 740
760 IF O$(LO)="?" THEN LET O$=O$( TO LO-1): GO TO 300
770 IF O$(LO)="." THEN LET O$=O$( TO LO-1): GO TO 380
780 IF O$="RESET" THEN RUN 640
790 IF LO>7 THEN IF O$( TO 7)="OLVIDA " THEN LET O$=O$(8 TO ): GO TO 460
800 IF O$="PANTALLA" THEN CLOSE # 2: GO TO 740
810 IF O$="IMPRESORA" THEN OPEN # 2,"P": GO TO 720
820 IF O$="DATOS" THEN GO TO 590
830 IF O$="CONCEPTOS" THEN FOR C=1 TO CO: LET A$=C$(C): LET B$=A$: GO SUB 860: NEXT C: GO TO 740
840 LET A$="NO ENTIENDO": LET B$=A$: GO SUB 860: GO TO 750
850:
860 REM Voz
870 REM Entrada:
880 REM A$=mensaje visible
890 REM B$=mensaje audible
900:
910 PRINT A$
920 FOR W=1 TO LEN B$
930 POKE 60000, CODE B$(W)
940 RANDOMIZE USR 63000
950 NEXT W
960 OUT 254,1
970 RETURN
980:
990 CLEAR : SAVE "DED40V.BAS" LINE 620: RUN 620