Code: Select all
SCREEN 640,480
Global sh,sw
sw=ScreenWidth()
sh=ScreenHeight()
Type flow
Field x#
Field y#
Field ang#
Field voima
Field sx#
Field sY#
Field väri#
Field angplus#
End Type
Const PAKSUUS = 10
Dim pala(2,4) As Float
pala(2,1)=10
pala(1,1)=SH-10-PAKSUUS
Dim pallo(3) As Float '0x 1y 2sx 3sy
Global pisteetcom, pisteethuman
Global comspeed As Float
Global gamepause, setupvalinta, setuptila
comspeed=1.00
Const laattoja = 5
Const PALANOPEUS = 7
Const VOIMAKERROIN =0.7
Const pallobufferkoko = 20
Dim pallobuffer(pallobufferkoko,2) As Float
Global flowmäärä, maksimiflowmäärä
maksimiflowmäärä=200
StartNewGame()
Repeat
SetWindow "Cool Pong - Tietokone: "+pisteetcom+" Pelaaja: "+pisteethuman
UpdatePalat()
UpdateFlow()
UpdatePallo()
Setup()
DrawScreen
Forever
Function StartNewGame()
pallo(0)=SW/2
pallo(1)=SH/2
pallo(2)=0
pallo(3)=0
DeleteFlow()
pala(1,2)=11
pala(2,2)=11
pala(2,3)=100
pala(1,3)=100
pala(1,4)=0.0
pala(2,4)=0.0
pallobuffer(0,0)=pallo(0)
pallobuffer(0,1)=pallo(1)
For i=1 To pallobufferkoko
pallobuffer(i,0)=pallo(0)
pallobuffer(i,1)=pallo(1)
Next i
End Function
Function Scoring(_voitto)
Repeat
Color 64,64,64
Box 100,100,SW-200,100,0
Color 96,96,96
Box 102,102,SW-204,96,0
Color cbwhite
If _voitto>0 Then
Text 130,125,"Onneksi olkoon. Sinä voitit tämän erän."
Else
Text 130,125,"Valitettavasti tietokone voitti tämän erän."
EndIf
If pisteetcom>pisteethuman Then
Text 130,165,"Tilanne on nyt "+pisteetcom+":"+pisteethuman+ " tietokoneen hyväksi."
ElseIf pisteetcom=pisteethuman Then
Text 130,165,"Tilanne on nyt "+pisteethuman+":"+pisteetcom+ " tasapeli."
Else
Text 130,165,"Tilanne on nyt "+pisteethuman+":"+pisteetcom+ " sinun hyväksesi."
EndIf
DrawScreen
Until KeyHit(cbkeyReturn)
StartNewGame()
End Function
Function UpdatePallo()
If Not gamepause Then
If pallo(1)>SH-5 Then
pisteetcom=pisteetcom+1
Scoring(-1)
ElseIf pallo(1)<5 Then
pisteethuman=pisteethuman+1
Scoring(1)
EndIf
If pallo(0)>SW-15 Then pallo(0)=SW-15 : pallo(2)=-pallo(2)
If pallo(0)<5 Then pallo(0)=5 : pallo(2)=-pallo(2)
pallo(0)=pallo(0)+pallo(2)
pallo(1)=pallo(1)+pallo(3)
If pallo(2) Or pallo(3) Then
For i=0 To pallobufferkoko
vx#=tx#
vy#=ty#
If i=0 Then
tx#=pallobuffer(i,0)
ty#=pallobuffer(i,1)
pallobuffer(i,0)=pallo(0)
pallobuffer(i,1)=pallo(1)
Else
i2=(i-1)
tx2#=pallobuffer(i,0)
ty2#=pallobuffer(i,1)
pallobuffer(i,0)=tx#
pallobuffer(i,1)=ty#
tx#=tx2#
ty#=ty2#
EndIf
Next i
EndIf
EndIf
i=pallobufferkoko
While i>-1
If i=0 Then
Color 255,Rnd(0.2,0.4)*255,0
Else
väri#=max(Min( ( 255-((255/pallobufferkoko)*i)+Rand(20,-20) ) ,255.0),0.0)
Color väri#,Int(väri#*Rnd(0.4,0.6)),0
EndIf
Circle pallobuffer(i,0)+4,pallobuffer(i,1),8-(i/3),1
i-1
Wend
End Function
Function UpdatePalat()
spread=30
For i=1 To 2
seis=0
If i=1 Then
If Not gamepause Then
If KeyDown(cbkeyup) And pala(i,4)=<1.0 And pala(i,4)=>0.0 Then
AddFlow(pala(i,0)+pala(i,3)/2,pala(i,1)-PAKSUUS,Rand(90-spread,90+spread))
pala(i,4)=pala(i,4)+0.01
seis=1
EndIf
pala(i,2)=( KeyDown(cbkeyright)-KeyDown(cbkeyleft) )
EndIf
If pala(i,4)=>0.0 Then
Color Min(pala(i,4)*255,255),Max(Min(255-pala(i,4)*255,255),0),0
Else
Color 0,max(Min(255+pala(i,4)*255,255),0),Max(Min(-pala(i,4)*255,255),0)
EndIf
Else
If Not gamepause Then
If pala(i,0)+(pala(i,3)/2)<pallo(0) Then
pala(i,2)=comspeed
ElseIf pala(i,0)+(pala(i,3)/2)>pallo(0) Then
pala(i,2)=-comspeed
EndIf
If pala(i,4)=<1.0 And pala(i,4)=>0.0 Then
AddFlow(pala(i,0)+pala(i,3)/2,pala(i,1)+PAKSUUS,Rand(270-spread,270+spread))
pala(i,4)=pala(i,4)+0.01
seis=1
EndIf
EndIf
Color 255,0,0
EndIf
If Not gamepause Then
If pala(i,4)>1.0 Then Pala(i,4)=-pala(i,4)*2 : seis=1
If pala(i,4)<0.0 Then
Pala(i,4)=Min(pala(i,4)+0.007,0.0)
ElseIf seis=0 And pala(i,4)>0.0 Then
pala(i,4)=Max(pala(i,4)-0.0050,0.0)
EndIf
If pala(i,0)<0 Then
pala(i,0)=0
ElseIf pala(i,0)>(SW-pala(i,3)) Then
pala(i,0)=SW-pala(i,3)
EndIf
If abs((pala(2,0)+pala(2,3)/2)-pallo(0))<COMSPEED*2 Then pala(2,2)=0.0
pala(i,0)=pala(i,0)+(PALANOPEUS*pala(i,2))
x=pallo(0)
y=pallo(1)
If x>pala(i,0) And x<(pala(i,0)+pala(i,3)) And Abs(y-pala(i,1))=<PAKSUUS Then
If pallo(3)>0 Then
pallo(1)=pala(i,1)-15
Else
pallo(1)=pala(i,1)+PAKSUUS+5
EndIf
pallo(3)=-pallo(3)
pallo(2)=pallo(2)+pala(i,2)*2
EndIf
EndIf
Box pala(i,0),pala(i,1),pala(i,3),PAKSUUS,1
Next i
End Function
Function AddFlow(_x#,_y#,_angle#,_speed#=5.0)
'If flowmäärä<maksimiflowmäärä Then
f.flow=New(flow)
f\x=_x#
f\y=_y#
f\ang=WrapAngle(_angle#)
f\sx=Cos(f\ang)*_speed#
f\sy=-Sin(f\ang)*_speed#
f\voima=1
flowmäärä+1
'EndIf
End Function
Function DeleteFlow()
For f.flow = Each flow
Delete f
Next f
flowmäärä=0
End Function
Function Setup()
If KeyHit(cbkeyspace) Then gamepause=Not gamepause
If gamepause Then
setupvalinta=setupvalinta-KeyHit(cbkeyleft)+KeyHit(cbkeyright)
If setupvalinta=1 Then
leveys=SW-200
korkeus=60
comspeed=Min(Max(comspeed+(UpKey()-DownKey())*0.01,0.25),5.0)
Color cbwhite
Box 110,110,10,10,1
Text 110,130,"Tietokoneen mailan nopeus: "+Float(comspeed*100)+" %."
Color 128,128,128
Box 130,110,10,10,1
Box 150,110,10,10,1
ElseIf setupvalinta=2 Then
leveys=SW-200
korkeus=60
Color cbwhite
Box 130,110,10,10,1
Text 110,130,"Ohjeet"
Color 128,128,128
Box 110,110,10,10,1
Box 150,110,10,10,1
If KeyHit(cbkeyreturn) Then setuptila=1 : ClearKeys
If setuptila=1 Then
If KeyHit(cbkeyreturn) Then setuptila=0 : ClearKeys
leveys=SW-200
korkeus=SH-300
Color cbwhite
Text 110,170,"Ohjaa palava meteoroidi punaisen mailan taakse."
Text 110,190,"Voit käyttää hiukkassuihkua ylöspäin näppäimestä."
Text 110,210,"Varo hiukkassuihkun ylikuumentumista."
Text 110,230,"Mailasi liikkuu sivusuunnassa nuolinäppäimistä."
Text 110,250,"Voit säätää vaikeusastetta valikosta."
EndIf
ElseIf setupvalinta=3 Then
Leveys=SW-200
korkeus=60
Color cbwhite
Box 150,110,10,10,1
Text 110,130,"Lopeta"
Color 128,128,128
Box 110,110,10,10,1
Box 130,110,10,10,1
If KeyHit(cbkeyreturn) Then End
ElseIf setupvalinta<1 Then
setupvalinta=1
ElseIf setupvalinta>3 Then
setupvalinta=3
EndIf
Color 64,64,64
Box 100,100,leveys,korkeus,0
Color 96,96,96
Box 102,102,leveys-4,korkeus-4,0
EndIf
End Function
Function UpdateFlow()
For f.flow = Each flow
If Not gamepause Then
f2.flow=First(flow)
f2 = After(f)
'vang#=f\ang
While f2<>NULL
etä#=Distance(f\x,f\y,f2\x,f2\y)
maxetä#=40.0
If etä<maxetä Then
f\ang=Curveangle2(f2\ang,f\ang,70.0)
f\sx=(f\sx+Cos(f\ang))*0.8
f\sy=(f\sy-Sin(f\ang))*0.8
If abs(f\ang-f2\ang)<5.0 And etä<20.0 Then
f\voima=f\voima+1
Delete f2
flowmäärä=flowmäärä-1
EndIf
EndIf
f2 = After(f2)
Wend
'f\angplus=f\ang-vang
f\x=f\x+(f\sx#/1.5)
f\y=f\y+(f\sy#/1.5)
'f\ang=f\ang+f\angplus
EndIf
poisto=0
If f\x<sw And f\x>0 And f\y<sh And f\y>0 Then
f\väri=-Sin(f\ang)
If f\väri<-0.75 Then Color 0,255,0
If f\väri<-0.4 Then Color 128,255,0
If f\väri>-0.4 Then Color 255,255,0
If f\väri>0.4 Then Color 255,128,0
If f\väri>0.75 Then Color 255,0,0
kerroin3#=2.0
kerroin4#=(1+(f\voima*VOIMAKERROIN))*kerroin3#
Line f\x,f\y,f\x+f\sx*kerroin4#,f\y+f\sy*kerroin4#
Else
'If f\x>sw Or f\x<0 Then
' f\sx#=-f\sx#
' f\x=Max(0,Min(sw,f\x))
'EndIf
'If f\y>sh Or f\y<0 Then
' f\sy#=-f\sy#
' f\y=Max(0,Min(sh,f\y))
'EndIf
poisto=1
EndIf
If Not gamepause Then
If poisto Then
Delete f
flowmäärä=flowmäärä-1
ElseIf Distance(pallo(0),pallo(1),f\x,f\y)<10 Then
pallo(2)=Max(Min( pallo(2)+(f\sx*(VOIMAKERROIN*f\voima)/7),12),-12)
pallo(3)=Max(Min( pallo(3)+(f\sy*(VOIMAKERROIN*f\voima)/7),12),-12)
EndIf
EndIf
Next f
End Function
Function CurveAngle2(targetangle#,oldangle#,incre#) 'Curves "oldangle" to "targetangle" by "incre" (e.g.homing missile)
targetangle = WrapAngle(targetangle) : oldangle = WrapAngle(oldangle)
If (oldangle + 360) - targetangle < targetangle - oldangle Then oldangle = 360 + oldangle
If (targetangle + 360) - oldangle < oldangle - targetangle Then targetangle = 360 + targetangle
oldangle = oldangle - (oldangle-targetangle) / incre
Return oldangle
End Function