## ## ## ## ## ## ## ## ## ########## ## ## .#####. ## ## ### ## .#####, #### ### ##. ## #### # ## ## # ##### ########## ## ## ## `#####. ## # ### ## ## ## ## # ## `####' '#######' `####' ## ####' `########' by __________ _ _ _ _ __________ (__________| | | | ___ | | __| | ___ _ __ |__________) (_________| |_| |/ __|| |/ _ |/ __|| '__||_________) (_______| _ | >_ | | |_| | >_ | | |_______) (____|_| |_|\___||_|\__,_|\___||_| |____) For CASIO FX850P/880P Qualquer bom aluno desta universidade (ou um bom cabula!) que se preze deve ter uma CASIO FX850P/880P. Como a vida nao e' so' estudo e cabulas, que tal dar outra vida `a calculadora! Pois e', proponho um jogo. Vamos a isso, e' ler com atencao as instrucoes e depois sim, o divertimento! Este programa foi totalmente escrito em BASIC para a calculadora CASIO FX-850P/880P Personal Computer. Claro que com pequenas adaptacoes qualquer outro computador podera correr este jogo. Para uma melhor compreensao da estrutura de todo o programa foram introduzidas grandes separacoes entre as palavras. Esses espacos poderao ser eliminados nos casos em que nao originem erro. Deste modo poderao ser poupados uns bons bytes. O numero de espacos em branco entre " " deve ser respeitado para uma correcta apresentacao no ecran. Todas as mensagens REM podem ser omitidas aquando da sua introducao na maquina, sao so' comentarios. | O programa mantera' ainda actualizada no a maior pontuacao | |obtida, assim como o nome do autor da mesma. Para que o acesso a memoria | |ocorra sem erro, e' MUITO IMPORTANTE inserir no memo um registo com a | |seguinte informacao: LETRIS, 0, NINGUEM. Isto so' e' necessario uma vez, | |a partir desse momento o programa actualizara' sempre a pontuacao e o | |nome, se for caso disso. Note bem que deve haver sempre um registo com | |este tipo de valores, caso contrario o programa assinalara' um erro e nao | |se executa. O OBJECTIVO do jogo sera' de anular as letras que vao aparecendo, umas com as outras de modo a que o ecran nao fique cheio, altura em que chega o jogo ao fim. Para a movimentacao das letras durante o seu percurso, estas podem ser guiadas pela tecla <7> que obriga a uma mudanca de pista e pela tecla <4> que acelera o processo de queda da letra (Ver no codigo como se podem personalizar estas teclas). As letras anulam-se duas a duas se forem seguidas no alfabeto, tanto podem anular-se na vertical, como na horizontal, ou ainda nas duas direccoes simultaneamente. A tecla permite ainda desligar ou ligar o som durante o jogo. A indicacao de som pode ser visto pelo ON ou OFF escrito constantemente no lado direito do ecran. Devido ao programa nao estar constantemente a ler o teclado (o que nao e' possivel nesta maquina), nao se deverao dar pancadas nas teclas (ate' porque isso as estraga!) mas sim pressionar continuamente ate' que a accao pretendida seja realizada, pedendo entao deixar de pressionar a mesma. Se seguir estes conselhos podera', obter melhores resultados e prolongar a vida do teclado da sua maquina. Na inspiracao deste jogo esteve o famoso TETRIS, dai que, e por ser totalmente realizado por letras, o tenha baptizado de LETRIS. Deste modo a calculadora passou a ser muito mais usada, quer por mim, quer pelos colegas. O problema foi depois quando as pilhas se cansaram de jogar... Eis o codigo a introduzir em qualquer um dos programas disponiveis na CASIO FX850P/880P. Cuidado com a memoria livre, nao sei quanto ocupa, mas ainda ocupa um bocado. Cada caracter ocupa um byte, agora e' so' contar e poupar onde se puder. -- ----- -------- 1 REM -= LETRIS =- 2 REM Por Helder Antonio Vaz Bernardo 3 REM Universidade de Aveiro 4 REM E-Mail - helder@ua.pt 5 CLEAR : DEFCHR$(255)="62949890ff" : CLS 10 LOCATE 12,0 : PRINT "LET";CHR$(255);"IS" 11 A$="*********** LET"+CHR$(255)+"IS **********"+CHR$(13)+ "***************************HAVB"+CHR$(11) : PRINT A$ 12 DIM M$(1,28) : DIM P(1) : N=10 : W=1 13 LOCATE 1,1: PRINT CHR$(5); 15 O$="0F9ABADF90" : F$="C47ADA7450" 30 REM N e' o intervalo de letras que irao sair, neste caso com N=10 as letras irao de A a J, e' claro que pode modifica-lo a seu gosto. W refere-se ao metodo de eliminacao, W=1 elimina letras seguidas e W=0 elimina letras iguais. 40 LOCATE 0,1: INPUT "SOM";S$ : IF S$="N" THEN S=0 ELSE S=1 45 PO=0 : RESTORE# : RESTORE#"LETRIS",0,1500:READ# H$: READ# P: READ# H$ 50 CLS 51 PRINT" Actual Pontuacao";CHR$(13);TAB(12-INT(LEN(H$)/2);P;" ";H$; 55 FOR I=0 TO 1 : FOR J=1 TO 28 : M$(I,J)=" ": NEXT J : NEXT I 60 CLS : LOCATE 26,0 : PRINT CHR$(135);"<===0"; : LOCATE 26,1 : PRINT CHR$(135);"<";CHR$(255);"==="; 65 IF S THEN DEFCHR$(255)=O$ ELSE DEFCHR$(255)=F$ 70 Y=1 : P(0)=25 : P(1)=25 80 I=1 : Y=ABS(Y-1) : J=Y : H=J : L$=CHR$((RAN#*N)+65) 85 IF INKEY$="4" THEN GOTO 150 90 LOCATE I,J : PRINT L$; 110 IF INKEY$="7" AND M$(ABS(J-1),I)=" " THEN H=ABS(J-1) 111 REM "7" indica que atecla para mudar de linha e' a tecla <7>, assim como "4" indica que e' a tecla <4> que faz acelerar a queda da letra. Uma simples mudanca destes valores permite uma escolha pessoal das teclas a usar. 115 IF INKEY$="S" THEN S=ABS(S-1):IF S THEN DEFCHR$(255)=O$ ELSE DEFCHR$(255)=F$ 120 LOCATE I,J : PRINT " "; : J=H 130 IF I=24 THEN GOTO 150 ELSE IF M$(J,I+1)=" " THEN I=I+1: GOTO 85 150 LOCATE P(J),J: PRINT L$; : M$(J,P(J))=L$ : P(J)=P(J)-1 160 GOSUB 200 170 IF P(J)=2 THEN LOCATE 0,3: GOTO 1000 175 IF P(J)=25 AND P(ABS(J-1))=25 THEN PO=PO+2 : IF S THEN BEEP 1 180 S$=STR$(PO) : LOCATE 33-LEN(S$),0 : A$=RIGHT$(S$,LEN(S$)-1):PRINT A$; 190 GOTO 80 200 L=P(J) : VE=0 : HO=0 240 GOSUB 710 250 IF (A=B-W OR A=B+W) AND A<>32 THEN GOSUB 400 260 IF (C=B-W OR C=B+W) AND C<>32 THEN GOSUB 290 270 IF VE=1 THEN P(J)=P(J)+2 275 IF HO THEN GOTO 500 280 RETURN 290 IF VE=0 THEN M$(J,P(J)+1)=" " : LOCATE P(J)+1,J : PRINT " "; 295 IF S THEN BEEP 300 FOR K=P(J)+1 TO P(ABS(J-1))-2 STEP-1 310 M$(ABS(J-1),K)=M$(ABS(J-1),K-1):LOCATE K,ABS(J-1):PRINT M$(ABS(J-1),K); 320 NEXT K 330 IF VE=0 THEN P(J)=P(J)+1 340 P(ABS(J-1))=P(ABS(J-1))+1 : PO=PO+1 350 HO=1 : RETURN 400 LOCATE P(J)+1,J : PRINT " ";: M$(J,P(J)+1)=" " : M$(J,P(J)+2)=" " 420 VE=1 : IF S THEN BEEP 425 PO=PO+1 430 RETURN 500 IF VE=1 THEN R=-2 ELSE R=-1 510 L=P(J)+R : J=ABS(J-1) 520 GOSUB 710 530 IF (A=B-W OR A=B+W) AND A<>32 THEN GOTO 550 540 RETURN 550 IF S THEN BEEP 560 FOR K=L+2 TO P(J)-3 STEP-1 570 M$(J,K)=M$(J,K-2): LOCATE K,J : PRINT M$(J,K); 580 NEXT K : PO=PO+1 585 P(J)=P(J)+2 : L=L+1 : GOTO 520 710 A=ASC(M$(J,L+2)) 720 B=ASC(M$(J,L+1)) 730 C=ASC(M$(ABS(J-1),L+1)) 740 RETURN 1000 IF PO>P THEN PRINT " Obteve novo recorde,";PO;" pontos, introduza o seu nome";: INPUT N$ : RESTORE#: RESTORE#"LETRIS",0,15000: READ# H$: WRITE# PO: WRITE# N$ 1010 IF P=PO THEN PRINT "Obteve";PO;"pontos, igualando o recorde pertencente a ";H$ 1020 IF P