凄く中途半端だけど「パイプドリーム」を再現した

なお,HSP.ソースと素材を公開します.

f:id:enthirt:20170407001347p:plain

 >||

#pack "pipe.png"
#packopt name "pipe dream"
randomize
buffer 1
picload "pipe.png"
screen 0,320,320

*set
tl = 32
curx = 0
cury = 0
imnxt = rnd(7)+1
hand = 0
tips = 0
dir = 0
counter = 1
speed = 320
score = 0
combo = 0
penaltya = 0
penaltyb = 0
tc = 0
dim board ,10,8
dim subboard ,10,8
dim cross ,10,8
repeat 10
C = cnt
repeat 8
board(C,cnt) = 0
subboard(C,cnt) = 0
cross(C,cnt)=0
loop
loop
sx = rnd(8)+1
sy = rnd(6)+1
if (sx+sy<7){
if (rnd(2)=0){
board(sx,sy) = 10
}else{
board(sx,sy) = 11
}
}else{
if (rnd(2)=0){
board(sx,sy) = 8
}else{
board(sx,sy) = 9
}
}
waterx = sx
watery = sy
tips = board(sx,sy)
subboard(sx,sy) = 0
if (tips=8):dir=0;l
if (tips=9):dir=1;u
if (tips=10):dir=2;r
if (tips=11):dir=3;d
dim nxt ,10
repeat 10
nxt(cnt) = rnd(7)+1
loop
gsel 0
gmode 2

*start
stick KEY
if (KEY=32)||(KEY=16):goto *main
redraw 0
color 32,32,32:boxf
color 255,255,255
pos 65,160
mes "PUSH SPACE KEY TO START"
redraw 1
await 16
goto *start

*main
time ++
tc ++
if (time>1500):counter ++
gosub *control
if (counter\speed=0): gosub *water
gosub *draw
await 16
goto *main

*control
stick KEY
if (KEY=1){
if (curx>0):curx--
};l
if (KEY=2){
if (cury>0):cury--
};u
if (KEY=4){
if (curx<9):curx++
};r
if (KEY=8){
if (cury<7):cury++
};d
if (KEY=16)||(KEY=32){
if (board(curx,cury)<8)&&(subboard(curx,cury)<2){
if *1:return
if (board(curx,cury)>0):penaltyb++
board(curx,cury)=imnxt
imnxt = nxt(hand\10)
nxt(hand\10)=rnd(7)+1
hand++
subboard(curx,cury)=1
}
}
if (KEY=64):time=2000:speed = 64
return

*water
tips = board(waterx,watery)
subboard(waterx,watery)++
gosub *comboandpenalty
gosub *compare
gosub *setdir
return

*comboandpenalty
combo = 0
penaltya = 0
repeat 10
C = cnt
repeat 8
if (board(C,cnt)=3):combo++
if (board(C,cnt)=1):penaltya++
loop
loop
return

*setdir
if (tips=3){
if (dir=0):dir=1
if (dir=3):dir=2
}
if (tips=4){
if (dir=0):dir=3
if (dir=1):dir=2
}
if (tips=5){
if (dir=2):dir=1
if (dir=3):dir=0
}
if (tips=6){
if (dir=1):dir=0
if (dir=2):dir=3
}
if (tips=8):dir=0;l
if (tips=9):dir=1;u
if (tips=10):dir=2;r
if (tips=11):dir=3;d
return

*initips
if (ptips=0):rgt=0:lft=0:up=0:dwn=0
if (ptips=1):rgt=1:lft=1:up=0:dwn=0
if (ptips=2):rgt=0:lft=0:up=1:dwn=1
if (ptips=3):rgt=1:lft=0:up=1:dwn=0
if (ptips=4):rgt=1:lft=0:up=0:dwn=1
if (ptips=5):rgt=0:lft=1:up=1:dwn=0
if (ptips=6):rgt=0:lft=1:up=0:dwn=1
if (ptips=7):rgt=1:lft=1:up=1:dwn=1
if (ptips=8):rgt=0:lft=1:up=0:dwn=0
if (ptips=9):rgt=0:lft=0:up=1:dwn=0
if (ptips=10):rgt=1:lft=0:up=0:dwn=0
if (ptips=11):rgt=0:lft=0:up=0:dwn=1
return

*compare
if (tips=1){
if (dir=0){
if (waterx-1>=0){
ptips = board(waterx-1,watery)
}else{
goto *gameover
}
gosub *initips
if (rgt=1){
score+100
waterx--
return
}else{
goto *gameover
}
}else{
if (waterx+1<10){
ptips = board(waterx+1,watery)
}else{
goto *gameover
}
gosub *initips
if (lft=1){
score+100
waterx++
return
}else{
goto *gameover
}
}
}
if (tips=2){
if (dir=1){
if (watery-1>=0){
ptips = board(waterx,watery-1)
}else{
goto *gameover
}
gosub *initips
if (dwn=1){
score+100
watery--
return
}else{
goto *gameover
}
}else{
if (watery+1<8){
ptips = board(waterx,watery+1)
}else{
goto *gameover
}
gosub *initips
if (up=1){
score+100
watery++
return
}else{
goto *gameover
}
}
}
if (tips=3){
if (dir=0){
if (watery-1>=0){
ptips = board(waterx,watery-1)
}else{
goto *gameover
}
gosub *initips
if (dwn=1){
score+100
watery--
return
}else{
goto *gameover
}
}else{
if (waterx+1<10){
ptips = board(waterx+1,watery)
}else{
goto *gameover
}
gosub *initips
if (lft=1){
score+100
waterx++
return
}else{
goto *gameover
}
}
}
if (tips=4){
if (dir=0){
if (watery+1<8){
ptips = board(waterx,watery+1)
}else{
goto *gameover
}
gosub *initips
if (up=1){
score+100
watery++
return
}else{
goto *gameover
}
}else{
if (waterx+1<10){
ptips = board(waterx+1,watery)
}else{
goto *gameover
}
gosub *initips
if (lft=1){
score+100
waterx++
return
}else{
goto *gameover
}
}
}
if (tips=5){
if (dir=2){
if (watery-1>=0){
ptips = board(waterx,watery-1)
}else{
goto *gameover
}
gosub *initips
if (dwn=1){
score+100
watery--
return
}else{
goto *gameover
}
}else{
if (waterx-1>=0){
ptips = board(waterx-1,watery)
}else{
goto *gameover
}
gosub *initips
if (rgt=1){
score+100
waterx--
return
}else{
goto *gameover
}
}
}
if (tips=6){
if (dir=2){
if (watery+1<8){
ptips = board(waterx,watery+1)
}else{
goto *gameover
}
gosub *initips
if (up=1){
score+100
watery++
return
}else{
goto *gameover
}
}else{
if (waterx-1>=0){
ptips = board(waterx-1,watery)
}else{
goto *gameover
}
gosub *initips
if (rgt=1){
score+100
waterx--
return
}else{
goto *gameover
}
}
}
if (tips=7){
if (dir=0){
if (waterx-1>=0){
ptips = board(waterx-1,watery)
}else{
goto *gameover
}
gosub *initips
if (rgt=1){
if (subboard(waterx,watery)<3){
score+100
}else{
score+(combo*combo)*1000
}
waterx--
return
}else{
goto *gameover
}
}
if (dir=1){
if (watery-1>=0){
ptips = board(waterx,watery-1)
}else{
goto *gameover
}
gosub *initips
if (dwn=1){
if (subboard(waterx,watery)<3){
score+100
}else{
score+(combo*combo)*1000
}
cross(waterx,watery)++
watery--
return
}else{
goto *gameover
}
}
if(dir=2){
if (waterx+1<10){
ptips = board(waterx+1,watery)
}else{
goto *gameover
}
gosub *initips
if (lft=1){
if (subboard(waterx,watery)<3){
score+100
}else{
score+(combo*combo)*1000
}
waterx++
return
}else{
goto *gameover
}
}
if(dir=3){
if (watery+1<8){
ptips = board(waterx,watery+1)
}else{
goto *gameover
}
gosub *initips
if (up=1){
if (subboard(waterx,watery)<3){
score+100
}else{
score+(combo*combo)*1000
}
cross(waterx,watery)++
watery++
return
}else{
goto *gameover
}
}
}
if (tips=8){
ptips = board(waterx-1,watery)
gosub *initips
if (rgt=1){
waterx--
return
}else{
goto *gameover
}
}
if (tips=9){
ptips = board(waterx,watery-1)
gosub *initips
if (dwn=1){
watery--
return
}else{
goto *gameover
}
}
if (tips=10){
ptips = board(waterx+1,watery)
gosub *initips
if (lft=1){
waterx++
return
}else{
goto *gameover
}
}
if (tips=11){
ptips = board(waterx,watery+1)
gosub *initips
if (up=1){
watery++
return
}else{
goto *gameover
}
}
return

*draw
redraw 0
color 32,32,32:boxf
repeat 10
pos cnt*tl,tl
gcopy 1,tl*nxt*2:gosub *drawa
if *3:gosub *drawb
return

*drawa
if (counter\10=0):fltm++
if (fltm>32):fltm = 0
if (dir=0){
gcopy 1,board(C,cnt)+(tl-fltm),tl,fltm,tl
}
if (dir=1){
gcopy 1,board(C,cnt),tl+(tl-fltm),tl,fltm
}
if (dir=2){
gcopy 1,board(C,cnt),tl,fltm,tl
}
if (dir=3){
gcopy 1,board(C,cnt),tl,tl,fltm
}
return
*drawb
return
*/
*gameover
color 32,32,32:boxf
color 255,255,255
pos 100,140
mes "POINTS:"+score
pos 100,160
mes "PENALTY:"+(penaltya+penaltyb)
fscore = score - (penaltya+penaltyb)*100
pos 100,180
mes "SCORE:"+ fscore

||<

*1:curx=waterx)&&(cury=watery

*2:hand\10+cnt)\10),64,tl,tl
pos 0,32
gcopy 1,256,64,tl,tl
loop
repeat 10
C = cnt
repeat 8
pos C*tl,64+cnt*tl
if (subboard(C,cnt)<2){
gcopy 1,board(C,cnt)*tl,0,tl,tl
}else: if (subboard(C,cnt)=3){
gcopy 1,288,tl,tl,tl
}else{
if (cross(C,cnt)=0){
gcopy 1,board(C,cnt)*tl,tl,tl,tl
}else{
gcopy 1,256,tl,tl,tl
}
}
if (C=waterx)&&(cnt=watery){
gcopy 1,256,64,tl,tl
}
;: gosub *drawwater
loop
loop
pos curx*tl,64+cury*tl
gcopy 1,tl*imnxt,64,tl,tl
color 255,255,255
pos 0,0
mes "TIME:"+tc/60
pos 100,0
mes "SCORE:"+score
redraw 1
return
/*
*drawwater
if ((board(waterx,watery)<3)||(board(waterx,watery)>6

*3:board(waterx,watery)>2)&&(board(waterx,watery)<7

こころぴょんぴょんゲームを作った

あぁ^~心がぴょんぴょんするんじゃぁ^~とは (アァーココロガピョンピョンスルンジャァーとは) [単語記事] - ニコニコ大百科

始まりはこのニコニコ大百科ページである。この記事の中には、いろんな言語で書かれた「あ^~こころがぴょんぴょんするんじゃぁ^~」が集められている。中でも、HSPを用いた物はその完成度の高さが際立っており、私はこのソースを使てゲームの一つでも作れないかと思案した。

 

その結果が以下のコードである。

簡単に操作方法を書いておこう。スペースキーがブーストで、後は左右の方向キーで操作する。以上だ。20ステージある。難易度は敵が出てくる以外、そう変わらない。

 

 ```
randomize
buffer 1  
screen 0,500,200
y=-9
x=0
hole = rnd(400)
enem = rnd(400)
bst=0
stg=1
bstnw = 0

enapp = 0

*main

title "stage:"+str(stg)+" "+"boost:" + str(5-bst)

gosub *A

gosub *B

gosub *C

gosub *E

bstnw = 0

stick K ,21

if (K = 1) :x=x-5

if (K = 4) :x=x+5

if (K = 16)&&(bst<5) :x=x+50 :bst++ :bstnw++

await 30

goto *main

*A
cls
line 0,100,500,100
boxf hole,100,hole+100,120
y++
pos x,y*y
mes "心"
gosub *D
if y=9{y=-y}:wait 5
return

*B
if (x > hole)&&(x < hole+100)&&(y=8){
cls
pos 220,100
mes "ouch!!!"
stop
}
return

*C
if x>500{
y=-9
x=0
hole = rnd(400)
enem = rnd(400)
enapp = 0
bst=bst-5
stg++
}
return

*D
if (stg>4)&&(enapp=0){
pos enem,y*y
mes "敵"
if (x>enem-20)&&(x<enem)&&(bstnw=0):gosub *B
if (x>enem-20)&&(x<enem)&&(bstnw!=0):enapp++ :bst = bst - 10
}
return

*E
if (stg=21){
cls
pos 200,100
mes "GAME CLEAR!!!"
if (bst > 40) : pos 200,120 : mes "goodjob!"
if (bst < 40)&&(bst > 30) : pos 200,120 : mes "soso"
if (bst < 30)&&(bst > 0) : pos 200,120 : mes "try again"
stop
}
return

 

 ```

 

 

hspで作ったゲームのソースコードver1

この度hspという言語を使ってゲームらしきものを作ったので公開しようと思う

 

randomize
buffer 1
picload "img.bmp"
buffer 2
picload "img.bmp"
mmload "attack.wav",0
mmload "glow.wav",1
mmload "bgm.wav",2,1
mmload "cit.wav",3
mmload "bgm2.wav",4,1
mmload "bgm3.wav",5,1
screen 0,512,512

mapx = 8
mapy = 8
bglen = 64
cpx = 8
cpy = 8
catx = 8
caty = 8

grass = 0
forest = 1
town = 2
city = 4

enecon = 0
bgmdo = 0
ovg = 0
stsr = 0
point = 0
clock = 0

 

dim map, mapx, mapy
 repeat mapy
  C = cnt
  repeat mapx
   stgr = 0
   stp = rnd( 40 ) + 1
   if (stp > 20) : stgr + 1
   map( cnt, C ) = stgr
  loop
 loop
 
 
dim compost, cpx, cpy
 repeat cpy
  C = cnt
  repeat cpx
   cpp = 0
   cpq = map( cnt , C )
   if cpq = grass{
    cpp = rnd( 30 )
   }else{
    if cpq = forest{
     cpp = 40
    }
   }
   compost( cnt, C ) = cpp
  loop
 loop
 
 
dim cit, catx, caty
 repeat caty
  C = cnt
  repeat catx
   cit( cnt, C ) = 0
  loop
 loop
 

;game start

*start
 cls
 clrobj
 pos 200,200
 mes "CONQUEST GAME"
 pos 220,300
 button "start", *stage
 pos 220,330
 button "nobgmstart", *nobgm
 pos 220,360
 button "bgmselect", *prbgmch
 stop

*stage
 cls
 clrobj
 pos 120,200
 mes "STAGE SELECT"
 pos 120,300
 button "stage1", *st1
 pos 240,300
 button "stage2", *st2
 pos 360,300
 button "FLEE PLAY", *main
 pos 120,400
 button "back", *start
 stop
 
*st1
 cls
 clrobj
 stsr + 1
 pos 180,200
 mes "[MISSION]YOU MUST MAKE 5 CITIES!"
 pos 200,300
 button "ready", *main
 stop
 
*st2
 cls
 clrobj
 stsr + 2
 pos 100,200
 mes "[MISSION]YOU MUST MAKE 10 CITIES AND 20 TOWNS!"
 pos 200,300
 button "ready", *main
 stop

;main
 
*main
 clrobj
 clock + 1
 redraw 0
 if bgmdo = 0{
  gosub *bgmadmin
 }
 gosub *drawmap
 gosub *mpcnt
 gosub *controll
 gosub *canspawn
 if enecon = 0{
  gosub *enespawn
  }else{
   if enecon = 1{
    gosub *eneadmin
   }
  }
 if ovg = 1{
  goto *gameover
 }
 redraw 1
 await 60
 goto *main
 

;bgm sec

*nobgm
 cls
 bgmdo + 3
 goto *stage

*prbgmch
 cls
 goto *bgmch

*bgmch
 mmstop
 pos 150,200
 mes "YOU CAN CHOOSE 3BGMS"
 pos 200,300
 button "bgm1", *prbgm1
 pos 200,330
 button "bgm2", *prbgm2
 pos 200,360
 button "bgm3", *prbgm3
 pos 200,390
 button "back", *prst
 stop
 
*prst
 cls
 mmstop
 goto *start
 
*prbgm1
 mmplay 2
 goto *bgm1
 
*prbgm2
 mmplay 4
 bgmdo + 1
 goto *bgm1
 
*prbgm3
 mmplay 5
 bgmdo + 2
 goto *bgm1
 
*bgm1
 pos 150,250
 button "stop", *bgmch
 pos 250,250
 button "select" , *stage
 stop
 
*bgm2
 pos 150,250
 button "back", *bgmch
 pos 250,250
 button "select",  *stage
 stop
 
*bgm3
 pos 150,250
 button "back", *bgmch
 pos 250,250
 button "select" , *stage
 stop
 
*bgmadmin
 if (bgmdo = 0){
 mmplay 2
 bgmdo + 3
}else{
 if (bgmdo = 1){
  mmplay 4
  bgmdo + 3
 }else{
  if (bgmdo = 2){
   mmplay 5
   bgmdo + 3
  }
 }
}
return

;map drawing sec
 
*drawmap
 color 255,255,255:boxf
 repeat mapy
  C = cnt
  repeat mapx
   pos cnt * bglen, C * bglen
   gcopy 1, map( cnt, C ) * 64, 128, bglen, bglen
  loop
 loop
 return


;mouse point counter sec

*mpcnt
 X = mousex / bglen
 Y = mousey / bglen
 color 0, 0, 0
 title str( X ) + "," + str( Y ) + "," + compost(X , Y) + "time" + clock
 return


;player controll sec

*controll
 stick key
 if key = 256{
  psx = mousex / bglen
  psy = mousey / bglen
  if (psx = spawnx && psy = spawny){
   gosub *attack
  }else{
   if map(psx,psy) == forest{
    mmplay 1
    map(psx,psy) + 1
   }else{
    map(psx,psy) + 0
   }
  }
  if ( 0 < psx && psx < 7 && 0 < psy && psy < 7 ) {
   if (map(psx,psy) == town) & (map(psx,psy-1) == town) & (map(psx-1,psy) == town) & (map(psx+1,psy) == town) & (map(psx,psy+1) = town){
    mmplay 3
    map(psx,psy) + 2
    cit(psx,psy) + 1
    cit(psx-1,psy) + 1
    cit(psx+1,psy) + 1
    cit(psx,psy-1) + 1
    cit(psx,psy+1) + 1
    }else
    map(psx,psy) + 0
    }
    }
  return
 
*attack
 mmplay 0
 enecon - 1
 compost(psx , psy)  + 40
 if compost(psx , psy) > 39 && map(psx , psy) = grass{
  map(psx , psy) + 1
 }
 return


;enemy section

*enespawn
 spawnx = rnd(8)
 spawny = rnd(8)
 if map(spawnx, spawny) == forest{
  pos spawnx * bglen, spawny * bglen
  gmode 2
  gcopy 2, 128, 256, bglen, bglen
  enecon + 1
 }else{
  enecon + 0
 }
 return


*eneadmin
 if enecon = 1{
  pos spawnx * bglen, spawny * bglen
  gmode 2
  gcopy 2, 128, 256, bglen, bglen
  gosub *enemove
  gosub *eneattack
 }
 return

*enemove
 move = rnd(60)
 move = move - 1
 if move = 0{
  if spawnx > 0{
   spawnx - 1
  }
 }else : if move = 10{
  if spawnx < 7{
   spawnx + 1
  }
 }else : if move = 20{
  if spawny > 0{
   spawny - 1
  }
 }else : if move = 30{
  if spawny < 7{
   spawny + 1
  }
 }
return
 

*eneattack
  if (map(spawnx , spawny) == town) & (cit(spawnx , spawny) = 0){
   map(spawnx , spawny) - 2
   compost(spawnx , spawny) = 0
  }
return


*canspawn
 F = 0
 S = 0
 T = 0
 repeat length(map)
  C = cnt
  repeat length2(map)
   if map(C,cnt) = forest{
    F = 1
    }
   if map(C,cnt) = city{
    S + 1
    }
   if map(C,cnt) = town{
    T + 1
    }
   if (stsr = 1) && (S > 4){
    goto *gameclear
    }
   if (stsr = 2) && (S > 9) && (T > 19){
    goto *gameclear
    }
  loop
 loop
 if (F = 0){
  goto *gameover
 }
 return
   
*gameover
 cls
 repeat length(map)
  C = cnt
  repeat length2(map)
  if map(C,cnt) = forest{
   point + 10
  }else{
   if map(C,cnt) = town{
    point + 100
   }else{
    if map(C,cnt) = city{
     point + 1000
    }
   }
  }
  loop
 loop
 tp = 5000 - clock
 score = point + tp
 pos 200,200
 mes "GAME OVER"
 pos 200,250
 mes "SCORE" + " " + score
 pos 100,300
 mes "[RESULT]" +"  " + "YOU MADE " + S + " CITIES AND " + T + " TOWNS"
 stop
 
*gameclear
 cls
 repeat length(map)
  C = cnt
  repeat length2(map)
  if map(C,cnt) = forest{
   point + 20
  }else{
   if map(C,cnt) = town{
    point + 200
   }else{
    if map(C,cnt) = city{
     point + 2000
    }
   }
  }
  loop
 loop
 tp = 5000 - clock
 score = point + tp + 100000
 pos 200,200
 mes "gameclear!"
 pos 200,250
 mes "SCORE" + " " + score
 s