ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»
º
ɻ˻ɻɻ˻ɻÉ˻ɻɻËɻɻÉ
ɻ˻ɻɻËÉ»
º
º
̼̹ººº»Ì¹Ì¹ºÊºÌ¹º ºººººº
ººÌ¹Ì¹È»ºº
º
º Ê
ÊÈȼȼÊÈÊÊÊ ÊÊÊȼÊȼ¼È¼
ȹʼÊÊȼÊȼ
º
ÌÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍËÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ͹
º É˻ɻ˻»ÉË É»
É» º
º
º ºÊºººººººº ºº
¹ º
PROGRAMACION ESTRUCTURADA º
º Ê Êȼʼȼȼȼ
ȼ º
º
ÌÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÊÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ͹
º
º
º
EN ESTA LECCION APRENDERAS...
º
º
º
º ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ º
º ³
³ º
º ³ þ C¢mo la Programaci¢n
Estructurada
³ º
º ³ facilita el mantenimiento
de los programas ..... 2 ³ º
º ³ þ C¢mo centralizar
textos ........................
2 ³ º
º ³ þ La sintaxis para la
sentencia LOCATE ...........
4 ³ º
º ³ þ La sintaxis para la
sentencia SUB...............
5 ³ º
º ³ þ C¢mo a¤adir color
..............................
6 ³ º
º ³ þ La sintaxis para la
sentencia COLOR ............
7 ³ º
º ³ þ C¢mo a¤adir sonido
.............................
9 ³ º
º ³ þ La sintaxis para la
sentencia SOUND ............
9 ³ º
º ³
³ º
º ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ º
º
º
ÌÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍËÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ͹
º É»Ë»Ë É»É» ɻɻɻ
º
º
º ººÌ¹º Ì º
¹ººÈ¹ º MEJORANDO EL PROGRAMA
ADIVINA UN NUMERO º
º ȹʼȼȼȼ ȼȼȼ
º
º
ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÊÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ
ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍËÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»
º É»Ë»Ë É»É» ɻɻɻ
º º
º ººÌ¹º Ì º
¹ººÈ¹ º MEJORANDO EL PROGRAMA
ADIVINA UN NUMERO º
º ȹʼȼȼȼ ȼȼȼ
º
º
ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÊÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ
C¢MO LA PROGRAMACI¢N ESTRUCTURADA
----------------------------------
FACILITA EL MANTENIMIENTO DE LOS PROGRAMAS
------------------------------------------
Como habr s notado, el programa de ADIVINA UN N£MERO, es un
programa bien estructurado. Los bloques de que est compuesto
facilitan su lectura y su mantenimiento, de modo que
es tarea
f cil el mejorarlo.
Y eso es lo que nos proponemos hacer ahora.
Por ejemplo, ¨qu‚ tal si centralizamos los textos de
otra
forma que no sea a¤adiendo espacios en
blanco a los mismos?
Empecemos con la subrutina PresentaPrg...
SUB PresentaPrg
'--------------
CLS
PRINT : PRINT :
PRINT
PRINT "
QSoft
PRESENTA"
PRINT "
EL JUEGO DE ADIVINA UN NUMERO"
PRINT
PRINT "
Un programa escrito en QBasic"
PRINT "
por Reinaldo Acevedo"
PRINT "
para las computadoras IBM y compatibles."
PRINT : PRINT
PRINT "
DERECHOS RESERVADOS 1995"
PRINT : PRINT :
PRINT
PRINT "
PRESIONA ENTER PARA CONTINUAR."
LET e$ = INPUT$(1)
END SUB
COMO CENTRALIZAR TEXTOS
-----------------------
Para aprender como centralizar textos sin tener que a¤adir
espacios a los mismos, tomemos el siguiente texto...
EL JUEGO DE ADIVINA UN NUMERO
...para centralizar en pantalla. Podemos
proceder de la
siguiente forma:
ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
³ QB309 MEJORANDO EL PROGRAMA ADIVINA UN NUMERO 3 ³
ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
Primero, contamos el n£mero de caracteres que
tiene el
texto...
EL JUEGO DE ADIVINA UN NUMERO
ÀÄÄÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
³
29 caracteres
Segundo, si el ancho de pantalla (width) es 80, le a¤adimos
uno (despu‚s ver s por qu‚) y le
restamos a ese n£mero, los
caracteres que tiene el texto, as¡...
81 - 29 = 52
...52 es el n£mero de caracteres que faltan para llenar la
l¡nea en pantalla.
Tercero, dividimos la diferencia, o sea, 52
entre dos,
as¡...
52 / 2 = 26
...este n£mero 26, indica el lugar en la l¡nea que debemos
empezar imprimir (PRINT) la l¡nea de caracteres...
EL JUEGO DE ADIVINA UN NUMERO
ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ>26
...para que quede centralizado.
Lo que acamos de hacer, se resumir¡a de la siguiente forma:
(ancho
de pantalla + 1 - largo del texto) / 2
(
80 +1 - 29
) / 2
ÀÄÄÄÄÄÂÄÄÄÄÄÙ
(
81
- 29
) / 2
(81 - 29) / 2 = 26
Ahora bien, para imprimir un texto en una fila (row) y
en
una columna (column) en la pantalla del
monitor, existe una
sentencia llamada LOCATE (localiza) que lleva a cabo
esta tarea
f cilmente. Su
sintaxis es...
LOCATE [row%] [,[column%] [,[cursor%] [,start%
[,stop%]]]]
ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
³ QB309 MEJORANDO EL PROGRAMA ADIVINA UN NUMERO 4 ³
ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
...pero
s¢lo considraremos aqu¡, la sintaxis simple...
ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
³ LOCATE [row%]
[,[column%] ³
ÀÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÙ
fila
columna
ÚÄÄÄÄÄÄÄÄÄÙ ³
³ ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
LOCATE 4, 1: PRINT "CARAMBA, ADIVINASTE!"
...y, luego en una lecci¢n posterior, los dem s par metros
de esta sentencia.
Una cosa que hay que aclarar es, que los par metros
row y
column, no pueden ser 0. Tienen que ser uno o m s,
de lo
contrario, la sentencia LOCATE no funcionar¡a. Esta es la raz¢n
por la que a¤adimos un 1 al ancho de pantalla de 80. Si el row
fuera uno y el largo del texto fuera 80, entonces 80 - 80
= 0.
Es decir la columna donde se empezar¡a a imprimir el texto
es 0,
y si utilizas LOCATE para imprimirlo tendr¡as...
LOCATE 1, 0
...y como puedes ver, esto no funciona, deteni‚ndose
el
programa con un aviso de error.
Utilizando esta sentencia, podemos desarrollar una f¢rmula
general para centralizar
textos. Pues
esta es la que
desarrollamos...
LOCATE row, INT(81 - LEN(txt$)) / 2
ÀÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÙ
column
Observa, c¢mo en esta f¢rmula, el par metro
column est
sustituido por la f¢rmula de centralizaci¢n
que acabamos de
explicar. Lo
£nico es que est generalizada.
En vez del largo
del texto, escribimos LEN(txt$); y el
ancho de la l¡nea, lo
representamos con el n£mero 81. Adem s para indicar que s¢lo
queremos un n£mero ¡ntegro (entero) incluimos
la funci¢n INT
estudiada en una lecci¢n anterior.
Pues bien, esta f¢rmula general podemos incluirla en
una
subrutina, de modo que siempre que queramos centralizar un
texto,
recurramos a ella.
Pues esta es la subrutina de que hablamos...
ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
³ QB309 MEJORANDO EL PROGRAMA ADIVINA UN NUMERO 5 ³
ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
'Esta subrutina centraliza el texto cuando
'la pantalla tiene un ancho de 80 chrs.
'
SUB Ctr80txt (row, txt$)
'-----------------------
LOCATE row, INT(81
- LEN(txt$)) / 2
PRINT txt$;
END SUB
Observa cu n particular es esta subrutina. Nota los dos
par metros que le siguen al nombre: row y txt$. Decid¡ llamarla
Ctr80txt (centraliza texto en
ancho de pantalla de 80
caracteres), porque tambi‚n hice una rutina similar, para
usarse
cuando el ancho de pantalla es de 40 caracteres (width=40)
y que
llam‚ Ctr40txt...
'Esta subrutina centraliza el texto cuando
'la pantalla tiene un ancho de 40 chrs.
'
SUB Ctr40txt (row, txt$)
'-----------------------
LOCATE row, INT(41
- LEN(txt$)) / 2
PRINT txt$;
END SUB
Nota, adem s, que a¤ad¡ antes de las subrutinas,
l¡neas
REM'S en forma de comillas que las explican. Cuando guardas
(save) el programa, la subrutinas quedan definidas delante
de la
rutina principal de la siguiente forma:
DECLARE SUB Ctr40txt (row!, txt$)
DECLARE SUB Ctr80txt (row!, txt$)
La sintaxis completa para SUB es la siguiente:
Variables a ser
pasadas a la subrutina cuando es llamada
ÚÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ³\
³ ÚÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÅÄÄ\ÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ permite a
³ ³ SUB name[(parameterlist)]
[STATIC] ÅÄ variables
Nombre de la³ [statementblock] ³
³ locales
subrutina ³ END SUB
³
³ retener su
³ ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ valor entre
ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
³
llamadas
\³/ \³/
SUB Ctr80txt (row, txt$)
'-----------------------
LOCATE row, INT(41 - LEN(txt$)) / 2
PRINT txt$;
END
SUB
ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
³ QB309 MEJORANDO EL PROGRAMA ADIVINA UN NUMERO 6 ³
ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
Ejemplo
de c¢mo se llama la subrutina anterior:
Ctr80txt 4, "QSoft PRESENTA"
³ ÀÄÄÄÄÄÄÂÄÄÄÄÄÄÙ
row
txt$
Ahora,
observa, c¢mo la subrutina Ctr80txt, es llamada en la
subrutina...
SUB PresentaPrg
'--------------
CLS
Ctr80txt 4,
"QSoft PRESENTA"
Ctr80txt 6,
"EL JUEGO DE ADIVINA UN NUMERO"
Ctr80txt 8,
"Un programa escrito en QBasic"
Ctr80txt 9,
"por Reinaldo Acevedo"
Ctr80txt 10,
"para las computadoras IBM y compatibles."
Ctr80txt 12,
"DERECHOS RESERVADOS 1995"
Ctr80txt 17,
"PRESIONA ENTER PARA CONTINUAR."
LET e$ = INPUT$(1)
END SUB
Puedes ver c¢mo el par metro row (fila) ha sido sustituido
por el valor actual de la fila y el par metro txt$, por la
cadena
actual del texto que se quiere centralizar. Como puedes ver,
usando las subrutinas Ctr80txt y
Ctr40txt no tienes que
preocuparte en calcular el lugar donde
el texto tiene que
comenzar para que se centralize. Lo £nico que tienes que hacer,
es indicar la fila en que quieres imprimir el texto as¡
como el
texto mismo.
A¥ADIENDO COLOR
---------------
Otra forma de mejorar el programa ADIVINA UN N£MERO,
es
a¤adi‚ndole color al mismo. Estudia la subrutina siguiente, para
que veas c¢mo le a¤adimos color a los textos de la misma...
SUB PresentaPrg
'--------------
CLS
COLOR 12, 0
Ctr80txt 4,
"QSoft PRESENTA"
COLOR 11, 0
Ctr80txt 6,
"EL JUEGO DE ADIVINA UN NUMERO"
COLOR 2, 0
Ctr80txt 8,
"Un programa escrito en QBasic"
Ctr80txt 9,
"por Reinaldo Acevedo"
Ctr80txt 10,
"para las computadoras IBM y compatibles."
ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
³ QB309 MEJORANDO EL PROGRAMA ADIVINA UN NUMERO 7 ³
ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
COLOR 12, 0
Ctr80txt 12,
"DERECHOS RESERVADOS 1995"
COLOR 3, 0
Ctr80txt 17,
"PRESIONA ENTER PARA CONTINUAR."
LET e$ = INPUT$(1)
END SUB
Por supuesto, que se
necesita un monitor a color para que
esto sea posible.
La sentencia sensilla que se usa para dar
color en el MODO DE PANTALLA 0 (SCREEN 0, para texto
solamente)
es...
frente de la fondo
de la
pantalla Ú pantalla
ÚÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄ¿
³ COLOR [foreground%] [,[background%] ³
ÀÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÙ
ÀÄÄ¿ ÚÄÄÄÄÄÄÄÄÄÄÙ
³ ³
COLOR 2, 0
³ ³
verde <ÄÙ ÀÄ> negro
Si tienes un monitor monocr¢mico, despu‚s de establecer la
pantalla en SCREEN 0, los siguientes colores son para el frente:
0 Negro
1 caracter
subrayado en fondo blanco
2-6 Formas de gris
7 Blanco
Si a¤ades 8 al n£mero del color seleccionado, los caracteres
estar n en alta intensidad. Si quieres que tus
caracteres
pesta¤een, a¤adele 16 al n£mero del color
seleccionado. He aqu¡
un ejemplo:
CLS:SCREEN 0:WIDTH 80
COLOR 23,0
PRINT
"BLINk"
COLOR 7,0
COLOR 15,0
PRINT "HIGH
INTENSITY"
COLOR 7,0
ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
³ QB309 MEJORANDO EL PROGRAMA ADIVINA UN NUMERO 8 ³
ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
Si tienes un monitor a color, los siguientes colores
son
tanto para el frente como el fondo:
0 Negro
8 Gris
Nota aqu¡ que, al
1 Azul ÄÄÄ> 9 Azul Claro
a¤adir 8 al n£mero
2 Verde ÄÄÄ> 10 Verde Claro
del color selec-
3 Cyan ÄÄÄ> 11 Cyan Claro
cionado, obtendr s
4 Rojo ÄÄÄ> 12 Rojo Claro
el color en alta
5 Magenta ÄÄÄ> 13 Magenta Claro
intensidad
6 Marr¢n ÄÄÄ> 14 Amarillo
³
7 Blanco ÄÄÄ> 15 Blanco de Alta-Intensidad ÄÄÄÄÄÙ
En otras lecciones, cuando tratemos el modo
gr fico de
pantalla, veremos las otras formas de esta
sintaxis. Ahora,
veamos un peque¤o programa que
ilustra la sentencia COLOR.
Dig¡talo y ejec£talo. Si quieres, puedes
experimentar cambiando
los par metros del mismo.
10 CLS : SCREEN 0: WIDTH 40
20 COLOR 7, 0
30
PRINT " SCREEN 0: WIDTH
40"
40 PRINT
100 COLOR 1: PRINT "COLOR 1,0 AZUL SOBRE NEGRO"
110 COLOR 2: PRINT "COLOR 2,0 VERDE SOBRE NEGRO"
120 COLOR 3: PRINT "COLOR 3,0 CYAN SOBRE NEGRO"
130 COLOR 4: PRINT "COLOR 4,0 ROJO SOBRE NEGRO"
140 COLOR 5: PRINT "COLOR 5,0 MAGENTA SOBRE NEGRO"
150 COLOR 6: PRINT "COLOR 6,0 MARRON SOBRE NEGRO"
160 COLOR 7: PRINT "COLOR 7,0 BLANCO SOBRE NEGRO"
170 COLOR 8: PRINT "COLOR 8,0 GRIS SOBRE NEGRO"
180 COLOR 9: PRINT "COLOR 9,0 AZUL CLARO SOBRE NEGRO"
190 COLOR 10: PRINT "COLOR 10,0 VERDE CLARO SOBRE NEGRO"
200 COLOR 11: PRINT "COLOR 11,0 CYAN CLARO SOBRE NEGRO"
210 COLOR 12: PRINT "COLOR 12,0 ROJO CLARO SOBRE NEGRO"
220 COLOR 13: PRINT "COLOR 13,0 MAGENTA CLARO SOBRE NEGRO"
230 COLOR 14: PRINT "COLOR 14,0 AMARILLO SOBRE NEGRO"
240 COLOR 15: PRINT "COLOR 15,0 BLANCO CLARO SOBRE NEGRO"
Al final de esta lecci¢n, tendr s el programa ADIVINA
UN
N£MERO ya mejorado. Estudia detenidamente c¢mo se
us¢ la
sentencia COLOR para darle color al mismo. Te recomiendo que
hagas los cambios correspodientes para a¤adirle color al
que ya
digitaste anteriormente.
Es mejor que lo hagas subrutina por
subrutina, de modo que veas la diferencia entre ellas, a
medida
que las vayas cambiando. Lo mismo te recomiendo cuando le
a¤adas sonido. Este
es nuestro pr¢ximo asunto a considerar.
ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
³ QB309 MEJORANDO EL PROGRAMA ADIVINA UN NUMERO 9 ³
ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
A¥ADIENDO SONIDO
----------------
Otra cosa que podemos hacer para mejorar el
programa es
a¤adirle sonido.
Nota c¢mo en la subrutina PresentaPrg que vimos
anteriormente, se llama a
una nueva subrutina denominada
TocaMusica, y que reproducimos aqu¡...
SUB TocaMusica
'-------------
RepiteMusica:
RANDOMIZE TIMER
SOUND RND * 1000 +
37, 2
k$ = INKEY$
IF k$ =
"" THEN GOTO RepiteMusica
EndRepiteMusica:
END SUB
F¡jate en el sentencia SOUND, que explicaremos ahora, pero
que en una lecci¢n posterior abundaremos con
m s detalles. Su
sintaxis es...
duraci¢n del sonido
Es el n£mero de ticks del
relog del sistema que dura
37 to 32767
del sonido.
frecuencia del sonido <Ä¿ Va de 0 a
65,535
en Hertz ³ un segundo =
18.2 ticks
va de 37 a
32767 ³
³
³ ÚÄÄÄÄÄÄÙ
ÚÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄ¿
³ SOUND frequency, duration ³
ÀÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÙ
ÀÄÄ¿ ÚÄÄÄÙ
SOUND 880,32
Ahora encotrar s el programa ADIVINA UN N£MERO
con las
mejoras hechas hasta el momento. Busca el que
cargaste
anteriormente, y hazle las mejoras que ves en este.
En la pr¢xima lecci¢n mejorearemos el programa
a£n m s
convirtiendo los bloques estructurales que
aparecen en esta
versi¢n del programa a las estructuras de bucles y de
ramas que
usa el QBasic.
Hasta entonces, pues!
ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
³ QB309 MEJORANDO EL PROGRAMA ADIVINA UN NUMERO 10 ³
ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
DECLARE SUB TocaMusica ()
DECLARE SUB Ctr40txt (row!, txt$)
DECLARE SUB Ctr80txt (row!, txt$)
DECLARE SUB DiSiAdivinaste ()
DECLARE SUB DaOrejita ()
DECLARE SUB DiIntentalo ()
DECLARE SUB DiQueAdivinaste ()
DECLARE SUB DiQueNoAdivinaste ()
DECLARE SUB HazPausa ()
DECLARE SUB Despidete ()
DECLARE SUB RepiteJuego ()
DECLARE SUB Adivinalo ()
DECLARE SUB PiensaNumero ()
DECLARE SUB DaInstrucciones ()
DECLARE SUB PresentaPrg ()
'Variables compartidas.
DIM SHARED turno
DIM SHARED
numero.pensado
DIM SHARED
tu.numero
DIM SHARED numero$
REM Juego de Adivina un N£mero
REM --------------------------
CLS : SCREEN 0: WIDTH 80
PresentaPrg
DaInstrucciones
PiensaNumero
Adivinalo
DiSiAdivinaste
RepiteJuego
Despidete
END
SUB Adivinalo
'------------
CLS : SCREEN 0: WIDTH 40
LET turno = 1
RepiteTurno:
CLS
COLOR 10, 0:
LOCATE 1, 15: PRINT "LLEVAS";
COLOR 13, 0: PRINT
turno;
COLOR 10, 0: PRINT
"TURNOS DE ";
COLOR 13, 0: PRINT
"10"
PRINT : PRINT
COLOR 12, 0: LINE
INPUT "¨QUE NUMERO PENSE "; numero$
LET tu.numero = VAL(numero$)
ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
³ QB309 MEJORANDO EL PROGRAMA ADIVINA UN NUMERO 11 ³
ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
IF
tu.numero = numero.pensado OR turno = 10 THEN
GOTO TerminaTurno
END IF
DaOrejita
LET turno = turno
+ 1
GOTO RepiteTurno
TerminaTurno:
END SUB
'Esta subrutina centraliza el texto cuando
'la pantalla tiene un ancho de 40 chrs.
'
SUB Ctr40txt (row, txt$)
'-----------------------
LOCATE row, INT(41
- LEN(txt$)) / 2
PRINT txt$;
END SUB
'Esta subrutina centraliza el texto cuando
'la pantalla tiene un ancho de 80 chrs.
'
SUB Ctr80txt (row, txt$)
'-----------------------
LOCATE row, INT(81
- LEN(txt$)) / 2
PRINT txt$;
END SUB
SUB DaInstrucciones
'------------------
CLS
COLOR 12, 0
Ctr80txt 4,
"*** INSTRUCCIONES ***"
COLOR 10, 0
Ctr80txt 7,
"LA COMPUTADORA TE PEDIRA "
Ctr80txt 9,
"QUE ADVINES UN NUMERO DEL 1 AL 100."
Ctr80txt 11,
"TIENES DIEZ OPORTUNIDADES"
Ctr80txt 13,
"PARA ADIVINARLO,"
Ctr80txt 15,
"AL CABO DE LAS CUALES"
Ctr80txt 17,
"TE DIRA SI LO ADIVINASTE O NO."
COLOR 12, 0
Ctr80txt 20,
"PRESIONA ENTER PARA CONTINUAR."
LET e$ = INPUT$(1)
END SUB
SUB DaOrejita
'------------
PRINT
ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
³ QB309 MEJORANDO EL PROGRAMA ADIVINA UN NUMERO 12 ³
ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
IF tu.numero <
numero.pensado THEN
GOTO
DiNumeroEsMayor
END IF
DiNumeroEsMenor:
COLOR 13, 0: PRINT
"NO, EL NUMERO ES MENOR QUE";
COLOR 12, 0: PRINT
tu.numero
GOTO
TerminaOrejita
DiNumeroEsMayor:
COLOR 13, 0: PRINT
"NO, EL NUMERO ES MAYOR QUE";
COLOR 12, 0: PRINT
tu.numero
TerminaOrejita:
PRINT : COLOR 27,
0: PRINT "INTENTALO OTRA VEZ"
PRINT : PRINT :
PRINT : PRINT : PRINT
COLOR 10, 0: PRINT "PRESIONA ENTER PARA CONTINUAR."
LET e$ = INPUT$(1)
END SUB
SUB Despidete
'------------
CLS
COLOR 10, 0:
Ctr40txt 5, "ESPERO QUE TE HAYAS DIVERTIDO"
COLOR 12, 0:
Ctr40txt 7, "HASTA LUEGO!"
END SUB
SUB DiQueAdivinaste
'------------------
COLOR 12, 0
LOCATE 4, 1: PRINT
"CARAMBA, ADIVINASTE!"
COLOR 13, 0
LOCATE 7, 3: PRINT
"EL NUMERO ES"; numero.pensado
LOCATE 9, 3: PRINT
"LO ADIVINASTE EN"; turno; "TURNOS DE"; 10
LOCATE 11, 3: PRINT
"O EN UN"; INT((turno / 10) * 100);
PRINT "%
"; "DE LOS TURNOS"
END SUB
SUB DiQueNoAdivinaste
'--------------------
COLOR 11, 0
LOCATE 4, 1: PRINT
"LO SIENTO, NO LO ADIVINASTE."
COLOR 15, 0
LOCATE 6, 1: PRINT
"EL NUMERO PENSADO ES ";
COLOR 12, 0
PRINT
numero.pensado
END SUB
ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
³ QB309 MEJORANDO EL PROGRAMA ADIVINA UN NUMERO 13 ³
ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
SUB DiSiAdivinaste
'-----------------
CLS
IF tu.numero =
numero.pensado THEN
GOTO Adivinaste
END IF
NoAdivinaste:
DiQueNoAdivinaste
GOTO
TerminaMensaje
Adivinaste:
DiQueAdivinaste
TerminaMensaje:
END SUB
SUB HazPausa
'-----------
LET Pausa = 0
RepitePausa:
LET Pausa = Pausa
+ 1
IF Pausa = 6000
THEN GOTO TerminaPausa
GOTO RepitePausa
TerminaPausa:
END SUB
SUB PiensaNumero
'---------------
CLS : SCREEN 0: WIDTH 40
RANDOMIZE TIMER
LET
numero.pensado = INT(RND * 100) + 1
COLOR 11, 0
Ctr40txt 3,
"ESTOY PENSANDO EN UN"
Ctr40txt 5,
"NUMERO DEL 1 AL 100."
COLOR 13, 0
Ctr40txt 7,
"POR FAVOR, ESPERA UN POCO..."
HazPausa
COLOR 10, 0
Ctr40txt 10,
"YA LO PENSE!"
COLOR 11, 0
Ctr40txt 13,
"PRESIONA ENTER PARA CONTINUAR."
LET e$ = INPUT$(1)
END SUB
SUB PresentaPrg
'--------------
CLS
COLOR 12, 0
Ctr80txt 4,
"QSoft PRESENTA"
ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
³ QB309 MEJORANDO EL PROGRAMA ADIVINA UN NUMERO 14 ³
ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
COLOR 11, 0
Ctr80txt 6,
"EL JUEGO DE ADIVINA UN NUMERO"
COLOR 2, 0
Ctr80txt 8,
"Un programa escrito en QBasic"
Ctr80txt 9, "por
Reinaldo Acevedo"
Ctr80txt 10,
"para las computadoras IBM y compatibles."
COLOR 12, 0
Ctr80txt 12,
"DERECHOS RESERVADOS 1995"
COLOR 3, 0
Ctr80txt 17,
"PRESIONA ENTER PARA CONTINUAR."
TocaMusica
END SUB
SUB RepiteJuego
'--------------
Decidete:
COLOR 10, 0
LOCATE 14, 1: PRINT
STRING$(40, " ")
LOCATE 14, 1: LINE
INPUT "QUIERES JUGAR OTRA VEZ (S/N)"; decision$
IF decision$
= "S" OR decision$ = "s" THEN RUN 'Juego otra vez.
IF decision$
= "N" OR decision$ = "n" THEN GOTO TerminaDecision
GOTO Decidete 'otra
vez.
TerminaDecision:
END SUB
SUB TocaMusica
'-------------
RepiteMusica:
RANDOMIZE TIMER
SOUND RND * 1000 +
37, 2
k$ = INKEY$
IF k$ =
"" THEN GOTO RepiteMusica
EndRepiteMusica:
END SUB