Name:  vehiculo.JPG
Views: 917
Size:  137.7 KB


'************************************************* ***************
'* Name : AUTOS2 .BAS *
'* Author : Leonardo Castillo *
'* Notice : Copyright (c) 2011 [select VIEW...EDITOR OPTIONS] *
'* : All Rights Reserved *
'* Date : 17/04/2011 *
'* Version : 4.0 *
'* Notes :tiene algoritmo para generar la pista en base a un *
'* :generador de numeros al asar que sirven para elegir*
'* :la forma de el camino de la pista. Ademas de poder *
'* :controlar la direccion y la velocidad del vehiculo *
'* :se ha implementado la deteccion de colicion de el *
'* :carro con la pista *
'* :se emplea almacenamiento de tramos de pista en me- *
'* :moria *
'* :Nota2ara reducir el parpadeo de las imagenes se *
'* :movio la instruccion de borrado de la pantalla al *
'* :inicio de la rutina de inicializacion de posicion *
'* :y ya no interviene dentro de la rutina o ciclo de *
'* :juego.
'************************************************* ***************
'lcd Nokia 1100 con driver PCF 8814 65x96 pixeles.
' 0 0 <CARRO DE JUEGO 0 0 0 0
' 0 0 0 0 0 0
' 0 0 0 0 0 0 0 0 0 0
' 0 0 0 0 CAMPO DE JUEGO>
' 0 0 0 0 0 0 0 0 0 0
' 0 0 0 0 0 0 0 0
' 0 0 0 0 0 0 0 0 0 0 $E1
' 0 0 0 0
' 0 0 0 0 $C3
' $66,$FF,$3D,$CF,$CF,$3D,$FF,$66
' 0 0 0 0 $87
' 0 1 2 3 4 5 6 7
INCLUDE "modedefs.bas"
asm
__CONFIG _CONFIG1, _CP_OFF & _CCP1_RB3 & _DEBUG_OFF & _WRT_PROTECT_OFF & _CPD_OFF & _LVP_OFF & _BODEN_OFF & _MCLR_ON & _PWRTE_OFF & _WDT_ON & _INTRC_IO
__CONFIG _CONFIG2, _IESO_OFF & _FCMEN_OFF
endasm
define OSC 8
Longitud con 96
MiNumero VAR WORD
MiValor1 var byte
MiValor2 var byte
prado var byte
pista var byte[longitud]
Velocidad var byte
Posicion var byte
Trayecto var byte
m var byte
n var byte
o var byte
i var byte
j var byte
mascara var byte
x var byte
y var byte
xc var byte
yc var byte
p var byte
LcdReg var byte
PosX var byte
PosY var byte
Lcd_sda var Portb.1 'DATO AL LCD
Lcd_Clk var Portb.2 'CLOCK DEL LCD
Lcd_rst var Portb.0 'RESET DEL LCD
Izquierda var mascara.6
Derecha var mascara.7
Acelerar var mascara.5
Desacelerar var mascara.4
AltoPantalla con 65
AnchoPantalla con 96
Cubo data $FF,$99,$99,$FF,$FF,$99,$99,$FF
Blanco data $00,$00,$00,$00,$00,$00,$00,$00
Carro data $66,$FF,$3D,$CF,$CF,$3D,$FF,$66
goto Inicio
;LCD RUTINAS
Lcd_Init:
Low Lcd_RST
pause 10 ' Reset minimo de 5mS recomendado
High Lcd_RST

'inicia escritura en modo comando
LcdReg=$20:Gosub Lcd_SentControl' escribe Vop
LcdReg=$90:Gosub Lcd_SentControl
LcdReg=$aa:gosub Lcd_SentControl' modo de direcccionamiento de escritura horizontal (aa=0)-vertical(ab=1)
LcdReg=$a4:GOSUB Lcd_SentControl' DAL=0
LcdReg=$a6:GOSUB Lcd_SentControl' E=0 // normal display (non inverted)
LcdReg=$af:GOSUB Lcd_SentControl' DON=1
lcdreg=$a9:gosub Lcd_Sentcontrol' DOR (ordenamiento de datos MSB-LSB/DOR=1($a9);LSB-MSB/DOR=0 ($a8))
LcdReg=$d0:gosub Lcd_SentControl' parcial display 1:65
LcdReg=$2F:Gosub Lcd_SentControl' Power control set(charge pump on/off)
LcdReg=$40:Gosub Lcd_SentControl' set start row address = 5
LcdReg=$b0:Gosub Lcd_SentControl' set Y-address = 0
LcdReg=$10:Gosub Lcd_SentControl' set X-address, upper 3 bits
LcdReg=$00:Gosub Lcd_SentControl' set X-address, lower 4 bits
LcdReg=$C0:Gosub Lcd_SentControl' mirror Y axis (about X axis)
LcdReg=$ac:Gosub Lcd_SentControl' set initial row (R0) of the display
LcdReg=$00:Gosub Lcd_SentControl' inicia en la linea 8 (se incrementa de 8 en 8 por cada bit del registro)
GOSUB Lcd_clear
Return

Lcd_Home:
PosX=0:PosY=0:Gosub Lcd_GotoXY
Return
Lcd_Clear:
Gosub Lcd_Home
For i=1 to 195
Lcdreg=0:Gosub Lcd_SentDato
Lcdreg=0:Gosub Lcd_SentDato
Lcdreg=0:Gosub Lcd_SentDato
Lcdreg=0:Gosub Lcd_SentDato
Next i
Return
Lcd_GotoXY:
LcdReg=%10110000 | PosY :Gosub Lcd_SentControl ' Y
LcdReg=%00001111 & PosX :Gosub Lcd_SentControl ' X parte baja
LcdReg=%00010000 | ($07&(posx>>4)) :gosub Lcd_SentControl ' X parte alta
Return
Lcd_SentControl:
lcd_sda=0 ' envia control poniendo D/C a 0
Lcd_SentDato: ' envia dato con D/C a 1
lcd_clk=1
lcd_clk=0
j=0
repeat
lcd_sda = lcdreg.7
LcdReg = LcdReg << 1
lcd_ClK = 1
lcd_ClK = 0
j=j+1
until j>7
lcd_sda=1 ' pone D/C a 1
return
EnviaFig:
Posx=x*8
posy=y
gosub Lcd_GotoXY
for i=0 to 7
read p+i,LcdReg
gosub Lcd_SentDato
next i
return
'****************************
Inicio:
OSCCON= %11111110
CMCON = 7
ANSEL = 0
TRISA = %00000000
TRISB = %11110000
OPTION_REG.7=0 'habilita pull-up
gosub Lcd_Init

'rutina random
'Programa para generar un numero pseudo-random
'Modificado para generar numeros entre 1 y 3 (para el dado)
pista[0]=%10000001
pista[1]=%11000011
pista[2]=%11000011
pista[2]=%11000011

for n=4 to longitud-1 step 4
Dado1:
For I = 1 to MiNumero
Random MiNumero
next I

mivalor1 = MiNumero // 10
if (mivalor1 = 0) or (mivalor1 > 3) or (mivalor1=trayecto) then goto Dado1
trayecto=mivalor1
Dado2:
For I = 1 to MiNumero
Random MiNumero
next I

Mivalor2 = MiNumero // 10
if (Mivalor2 = 0) or (Mivalor2 > 5) then goto Dado2

AlmacenaPista:
if Mivalor2=3 then
Prado=%00011000
elseif mivalor2=5 then
Prado=%00100100
else
prado=%00000000
endif

if mivalor1=1 then
pista[n]=%11110000<<1|%00000001
pista[n+1]=((pista[n]|Prado>>3)<<1)|%00000001
pista[n+2]=(pista[n+1]<<1)|%00000001
pista[n+3]=%10000111
elseif mivalor1=2 then
pista[n]=%10000001
pista[n+1]=%10000001 | prado
pista[n+2]=%10000001 | prado
pista[n+3]=%10000001
elseif mivalor1=3 then
pista[n]=%10000111>>1|%10000000
pista[n+1]=((pista[n]|Prado<<3)>>1)|%10000000
pista[n+2]=(pista[n+1]>>1)|%10000000
pista[n+3]=%11100001
endif
next n
IniciaJuego:
gosub Lcd_Clear
velocidad=1
xc=3 'Inicializa coordenadas
yc=7
m=0
PintaPista:
for n=m to 7+m
y=7+m-n
for o=0 to 7
p=pista[n]<<o
if p.7=1 then
p=cubo
else
p=blanco
endif
x=o
gosub Enviafig
next o
next n
m=m+1
if m=longitud-1 then m=0

Boton:
mascara=PORTB
if izquierda=0 then xc=(xc-1)
if derecha=0 then xc=(xc+1)
if Acelerar=0 then Velocidad=(Velocidad+1)min 5
if Desacelerar=0 then velocidad=(velocidad-1)max 1
x=xc
y=6
p=Carro
gosub Enviafig
select case Velocidad
case 1
pause 500
case 2
pause 400
case 3
pause 300
case 4
pause 200
case 5
pause 150
end select
Colision:
posicion=%10000000
posicion=posicion>>xc
if (pista[m] & posicion)<>0 then Choque 'Ocurre un choque y reinicia carrera
goto PintaPista 'No hay choque y sigue
Choque:
xc=4
for m=0 to 3
gosub Lcd_Clear
x=xc+m
y=6-m
p=Carro
gosub Enviafig
pause 300
next m
for m=0 to 3
gosub Lcd_Clear
x=xc-(m+1)
y=3-m
p=Carro
gosub Enviafig
pause 300
next m
gosub IniciaJuego
end