Challenge: 
Winner?: 
No
Code Snippet: 
set display mode 1024,768,32
set camera range 1,5000
backdrop on
color backdrop 0
hide mouse
sync rate 60
sync on
paddle=1
table=2
net=3
ball=4
paddle2=5
score_comp=6
score_player=7
paddle_texture=1
table_texture=2
net_texture=3
ball_texture=4
score1=5
score2=6
paddle_rim=1
paddle_handle=2
net_post=3
paddlex#=0.0
paddley#=0.0
paddlez#=605.0
pad2x#=50.0
pad2y#=0.0
pad2z#=-605.0
pad2xv#=0.0
pad2yv#=0.0
pad2xm#=3.0
pad2ym#=3.0
border#=350.0
gravity#=0.05
friction#=0.9
table_height=-45
play=0
make_play=0
dim score(2)
dim ballhit(2)
ballhit(1)=0
ballhit(2)=0
servedir=1
make light 1
position light 1,0,250,1050
position light 0,0,500,0
set image colorkey 0,0,0
gosub make_paddle
instance object paddle2,paddle
gosub make_table
position object table,0,table_height-5,0
gosub make_net
position object net,0,table_height+25,0
gosub make_ball
gosub make_scoreboard
yrotate object score_comp,270
yrotate object score_player,270
position object score_comp,400,0,50
position object score_player,400,0,550
position camera 0,250,1050
point camera 0,0,0
while not escapekey()
  gosub move_paddle
  gosub move_camera
  if play=0
    ink rgb(255,255,255),0
    if servedir=1
      box 665,325,805,345
      set cursor 670,327
    else
      box 850,640,990,660
      set cursor 855,642
    endif
    ink 0,0
    set text font "arial"
    set text size 16
    print "SPACEBAR to serve"
  endif
  if spacekey()
    if play=0 then play=1
  endif
  if not spacekey()
    if play=1
      play=2
      gosub ball_serve
    endif
  endif
  if play=2
    ballyv#=ballyv#-gravity#
    ballx#=ballx#+ballxv#
    bally#=bally#+ballyv#
    ballz#=ballz#+ballzv#
    if bally#<table_height+10
      if ballx#>=-400 and ballx#<=400 and ballz#>=-600 and ballz#<=600
        ballyv#=-ballyv#*friction#
        bally#=bally#+ballyv#
        if ballz#<0 then inc ballhit(2)
        if ballz#>0 then inc ballhit(1)
      endif
    endif
    if ballz#<-605 then gosub computer
    if ballz#>605 and ballz#<615 then gosub player
    if ballz#>-10 and ballz#<10 then gosub net
    if bally#<table_height then gosub ball_stop
    if abs(ballz#)>700 then gosub ball_stop
    position object ball,ballx#,bally#,ballz#
    xrotate object ball,object angle x(ball)+6.0
    if makeplay>0
      if ballhit(3-makeplay)=1 and ballhit(makeplay)=0 then gosub ball_stop
    endif
  endif
  sync
endwhile
end
update_score:
  set current bitmap score1
  ink rgb(0,255,255),0
  box 0,0,50,50
  ink rgb(0,0,128),0
  set cursor 10,10
  set text font "arial"
  set text size 20
  print score(1)
  get image score1,0,0,50,50
  set current bitmap score2
  ink rgb(0,255,255),0
  box 0,0,50,50
  ink rgb(0,0,128),0
  set cursor 10,10
  print score(2)
  get image score2,0,0,50,50
  set current bitmap 0
  texture object score_comp,score1
  texture object score_player,score2
return
move_camera:
  if upkey()
    pitch camera up 90.0
    move camera 1
    point camera 0,0,0
  endif
  if downkey()
    pitch camera down 90.0
    move camera 1
    point camera 0,0,0
  endif
return
move_paddle:
  xmove=mousemovex()
  ymove=mousemovey()
  swing=mouseclick()
  paddlex#=paddlex#-xmove
  paddley#=paddley#-ymove
  if paddlex#<-border# or paddlex#>border# then paddlex#=paddlex#+xmove
  if paddley#<-border# or paddley#>border# then paddley#=paddley#+ymove
  if swing>0 and swinging=0 then swinging=1
  if swinging=1
    paddle_swing#=paddle_swing#+3.0
    if paddle_swing#>30.0
      paddle_swing#=30.0
      if swing=0 then swinging=2
    endif
  endif
  if swinging=2
    paddle_swing#=paddle_swing#-3.0
    if paddle_swing#<0 then swinging=0:paddle_swing#=0.0
  endif
  yrotate object paddle,180+paddle_swing#
  position object paddle,paddlex#,paddley#,paddlez#
  if ballz#>0
    pad2xv#=pad2xv#-(pad2x#-50.0)/100.0
    if abs(pad2xv#)>pad2xm# then pad2xv#=pad2xv#+(pad2x#-50.0)/100.0
    pad2yv#=pad2yv#-(pad2y#-50.0)/100.0
    if abs(pad2yv#)>pad2ym# then pad2yv#=pad2yv#+(pad2y#-50.0)/100.0
  endif
  if ballz#<0
    pad2xv#=pad2xv#-(pad2x#-ballx#)/50.0
    if abs(pad2xv#)>pad2xm# then pad2xv#=sgn(pad2xv#)*pad2xm#
    pad2yv#=pad2yv#-(pad2y#-bally#)/50.0
    if abs(pad2yv#)>pad2ym# then pad2yv#=sgn(pad2yv#)*pad2ym#
  endif
  pad2x#=pad2x#+pad2xv#
  if pad2y#>400.0 then pad2y#=400.0
  pad2y#=pad2y#+pad2yv#
  if pad2y#<0.0 then pad2y#=0.0
  position object paddle2,pad2x#,pad2y#,pad2z#
  if ballhit(1)>1 or ballhit(2)>1 or (ballhit(1)=1 and ballhit(2)=1)
    gosub ball_stop
  endif
return
net:
  if bally#<table_height+50
    ballzv#=sgn(ballz#)*2.0
    ballyv#=0.0
  endif
return
return
player:
loc=sqrt((paddlex#-ballx#)^2+(paddley#-bally#)^2)
if loc<=50
  ballzv#=-ballzv#*friction#
  if swinging>0
    ballzv#=ballzv#*(1.0+paddle_swing#/60.0)
    ballyv#=ballyv#+1.0-ymove/100.0
    if ballyv#<0.0 then balyv#=1.0
    ballxv#=ballxv#-xmove/2.0
  endif
  ballz#=ballz#+ballzv#
  make_play=2
  ballhit(1)=0:ballhit(2)=0
endif
return
computer:
loc=sqrt((pad2x#-ballx#)^2+(pad2y#-bally#)^2)
if loc<=100
  ballzv#=-ballzv#*friction#
  ballzv#=ballzv#*(1.0+paddle_swing#/60.0)
  ballyv#=ballyv#+1.0
  if ballyv#<0.0 then ballyv#=1.0
  ballxv#=-sgn(ballx#)
  ballz#=ballz#+ballzv#
  make_play=1
  ballhit(1)=0:ballhit(2)=0
endif
return
return
ball_stop:
  if ballhit(make_play)>0 and ballhit(3-make_play)=0
    inc score(make_play)
  else
    inc score(3-make_play)
  endif
  play=0
  ballx#=50.0
  bally#=50.0
  ballz#=-600.0
  ballhit(1)=0
  ballhit(2)=0
  hide object ball
  gosub update_score
return
ball_serve:
  if servedir=1
    ballx#=pad2x#
    bally#=pad2y#
    ballz#=-600.0
    ballxv#=-sgn(pad2x#)
    ballyv#=3.0
    ballzv#=8.0
    make_play=1
  else
    ballx#=paddlex#
    bally#=paddley#
    ballz#=600.0
    ballxv#=-sgn(paddlex#)
    ballyv#=3.0
    ballzv#=-8.0
    make_play=2
  endif
  show object ball
  servedir=3-servedir
return
make_ball:
create bitmap 1,20,20
ink rgb(255,255,255),0
box 0,0,20,20
ink rgb(128,128,128),0
for x=0 to 20 step 2
  for y=0 to 20 step 2
    dot x,y
  next y
next x
get image ball_texture,0,0,20,20
delete bitmap 1
make object sphere ball,20
texture object ball,ball_texture
set shadow shading on ball
position object ball,0,0,2000
return
make_paddle:
create bitmap 1,200,200
ink 0,0
line 0,0,200,200
ink rgb(0,0,255),0
for x=1 to 98
  circle 100,100,x
next x
get image paddle_texture,0,0,200,200
delete bitmap 1
set current bitmap 0
make object plain paddle,100,100
texture object paddle,1
set object transparency paddle,1
make object cylinder paddle+1,100
scale object paddle+1,100,5,100
xrotate object paddle+1,90.0
make mesh from object paddle_rim,paddle+1
delete object paddle+1
add limb paddle,1,paddle_rim
color limb paddle,paddle_rim,rgb(0,0,255)
texture limb paddle,paddle_rim,paddle_texture
offset limb paddle,paddle_rim,0,0,2.5
make object box paddle+1,40,15,8
zrotate object paddle+1,-45.0
make mesh from object paddle+1,paddle_handle
delete object paddle+1
add limb paddle,2,paddle_handle
color limb paddle,paddle_handle,rgb(64,64,64)
offset limb paddle,paddle_handle,45.0,-45.0,2.5
ghost object on paddle
fade object paddle,150
return
make_table:
create bitmap 1,400,600
ink rgb(0,255,0),0
box 0,0,400,600
ink rgb(255,255,255),0
box 5,5,390,10
box 5,5,10,595
box 390,5,395,595
box 5,590,395,595
box 198,5,202,595
get image table_texture,0,0,400,600
delete bitmap 1
set current bitmap 0
make object box table,800,10,1200
texture object table,table_texture
return
make_net:
create bitmap 1,800,50
ink 0,0
box 0,0,800,50
ink rgb(128,128,128),0
for x=-50 to 850 step 8
  line x,0,x+50,50
  line x,50,x+50,0
next x
line 0,0,800,0
get image net_texture,0,0,800,50
delete bitmap 1
make object plain net,800,50
texture object net,net_texture
set object transparency net,1
make object cylinder net+1,50
scale object net+1,10,100,10
make mesh from object net_post,net+1
delete object net+1
add limb net,1,net_post
offset limb net,1,-400,0,0
color limb net,1,rgb(128,255,255)
add limb net,2,net_post
offset limb net,2,400,0,0
color limb net,2,rgb(128,255,255)
return
make_scoreboard:
make object plain score_comp,100,100
make object plain score_player,100,100
ink rgb(0,255,255),0
create bitmap score1,100,100
box 0,0,100,100
get image score1,0,0,100,100
create bitmap score2,100,100
box 0,0,100,100
get image score2,0,0,100,100
set current bitmap 0
texture object score_comp,score1
texture object score_player,score2
return
function sgn(x#)
  if x#<0 then value=-1
  if x#>0 then value=1
  if x#=0 then value=0
endfunction value