TRON game

Post Reply
User avatar
phase
Posts: 17
Joined: Thu Dec 20, 2012 6:16 pm
Location: Хабаровск

TRON game

Post by phase »

Привет всем.
Игра TRON. Катание на светоциклах. По правилам нужно поставить стену перед вражеским светоциклом чтобы он в неё врезался, ещё можно загнать в ловушку чтобы он сам в себя врезался.

Code: Select all

// tron 0.3.9 for pixilang3.4.7 
rand_seed(get_ticks())
h=WINDOW_YSIZE 
w=WINDOW_XSIZE
gamedelay=0 
logpix=new(w,h,PIXEL)
set_key_color(logpix,0)
traces=new(w,h,PIXEL)//result
set_key_color(traces,0)
key=0 maxcount=4 count=maxcount
strn=0 str=" " fps=""
trace=new(count)
x=new(count,INT) 
y=new(count,INT) 
fi=new(count,INT) 
c=new(count,INT) 
v=new(count,INT) 
n=0 while(n!=count){
v[n]=1 trace[n] =new(w,h)
set_key_color(trace[n],0)
n+1} n=0
c[0]=RED
c[1]=BLUE
c[2]=GREEN
c[3]=YELLOW  
dfi=90    //degrees //0 deg - left
x[0]=w/4 y[0]=h/4
x[1]=-w/4 y[1]=-h/4
x[2]=-w/4 y[2]=h/4
x[3]=w/4 y[3]=-h/4
fi[0]=270 fi[1]=90
fi[2]=270 fi[3]=90


fn lightcycle_player()
{
n=0
if get_event()&& EVT[ EVT_TYPE ] == EVT_BUTTONDOWN 
{ key = EVT[ EVT_KEY ] set_dir(key, n) } 
 engine (n)
}

fn lightcycle($n)
{
ai($n)
engine($n)
}

run:
lightcycle_player()
lightcycle(1)
lightcycle(2)
lightcycle(3)
set_screen(traces)
clear(0)
box(-w/2,-h/2+get_text_ysize(str)*maxcount,w-1,h-get_text_ysize(str)*maxcount-1, WHITE)//границы
n=0 while(n!=maxcount){pixi(trace[n]) n+1}
set_screen(0)
transp(32)
clear(BLACK)
transp(256)
pixi(traces)
pixi(logpix)
sprintf( fps, "FPS:%u", FPS )
print( fps, w/2, -h/2, WHITE, TOP | RIGHT )
frame(gamedelay)
if count==1
{n=0 while (v[n]!=1){n+1} cn=c[n]
 str="" sprintf(str,"#%x win! n=%d",cn,n) 
 print(str,-w/2,-h/2+get_text_ysize(str)*strn,c[n] ,TOP | LEFT )
 frame(-1)}
if EVT[ EVT_TYPE ] == EVT_QUIT { halt }
goto run

fn proection($dir,$n)
{
_dx=r*cos(($dir*M_PI*2)/360)
_dy=r*sin(($dir*M_PI*2)/360)
_x=x[$n]+_dx
_y=y[$n]+_dy
}


fn set_dir( $key,$n )  
{
if $key==KEY_RIGHT //turn right
 {fi[$n]=fi[$n]+dfi}
else {
if $key==KEY_LEFT //turn left
 {fi[$n]=fi[$n]-dfi}}
if fi[$n]<0 {fi[$n]=360-dfi}
if fi[$n]>360 {fi[$n]=dfi} 
}

fn engine( $n ) 
{
if v[$n]>0 {
set_screen(traces)
dx=v[$n]*cos((fi[$n]*M_PI*2)/360)
dy=v[$n]*sin((fi[$n]*M_PI*2)/360)
x[$n]=x[$n]+dx
y[$n]=y[$n]+dy
if get_dot(x[$n],y[$n])==0
{set_screen(trace[$n]) 
 dot(x[$n],y[$n],c[$n])}
else
{remove(trace[$n])
v[$n]=0 count-1 cn=c[$n]
set_screen(logpix) str=""
sprintf(str,"#%x stoped n=%d count=%d", cn,$n,count)
print(str,-w/2,-h/2+get_text_ysize(str)*strn,c[$n],TOP | LEFT ) strn+1}
}
}

fn ai($n)
{
_x=0 _y=0
//attack($n)
avoid($n)
}

fn attack($n)
{
}

fn avoid( $n)
{
set_screen(traces)
r=2 dir=fi[$n]
proection (fi[$n] ,$n )
_a=get_dot(_x,_y)//спереди
// если впереди препятствие...
if _a!=0 {
dir=fi[$n]+dfi proection(dir,$n)
_b=get_dot(_x,_y)//справа
dir=fi[$n]-dfi proection(dir,$n)
_c=get_dot(_x,_y)//слева
if _b!=0 {key=KEY_LEFT set_dir(key,$n) }//turn left
if _c!=0 {key=KEY_RIGHT set_dir(key,$n) }//turn right
if (_b+_c)==0 {key=KEY_LEFT+(rand()&1) set_dir(key,$n) } 
 }
//... то повернуть, если возможно
}
Над интеллектом пока работаю.
User avatar
NightRadio
Site Admin
Posts: 3941
Joined: Fri Jan 23, 2004 12:28 am
Location: Ekaterinburg. Russia
Contact:

Re: TRON game

Post by NightRadio »

Вот еще бы в 3D сделать, было бы совсем круто
User avatar
phase
Posts: 17
Joined: Thu Dec 20, 2012 6:16 pm
Location: Хабаровск

Re: TRON game

Post by phase »

3D? Интересно :roll: .
needhash
Posts: 14
Joined: Sun May 27, 2012 9:14 pm

Re: TRON game

Post by needhash »

Кстати, насчёт 3d, сделай, пожалуйста, функции для работы с массивами вершин, а то каждый кадр загружать данные в видеопамять медленно, 3d программы неудобно писать.
User avatar
NightRadio
Site Admin
Posts: 3941
Joined: Fri Jan 23, 2004 12:28 am
Location: Ekaterinburg. Russia
Contact:

Re: TRON game

Post by NightRadio »

Кстати, насчёт 3d, сделай, пожалуйста, функции для работы с массивами вершин
Такие функции уже есть. Это triangles3d() для софтового режима и gl_draw_arrays() для OpenGL режима.
Post Reply