goo blog サービス終了のお知らせ 

おたくな実験集

おたくで実験好きな御宅菜プロ太の
ブログです
(内容は信用ならないかも・・・)
このページはリンクフリーです

プログラムレッスン~座標指定~

2007-04-05 13:53:39 | プログラム
さて今回は座標を指定してみましょう
座標って難しく言葉を使っているだけです
とりあえず下記スクリプトを入力してください

x=100:y=100:c=0
repeat
if c=0:x=x+5:if x>=500:c=1
if c=1:y=y+5:if y>=400:c=2
if c=2:x=x-5:if x<=100:c=3
if c=3:y=y-5:if y<=100:c=0
pos x,y
mes "○"
wait 5
loop
です
実行すると○が長方形を描くように自動で進みます
この処理を文字で書くとこうなります

画面を消す
指定された位置に丸を書く
座標が代入された変数に増減を行う
少し待つ
繰り返し

と言うものです
とりあえず説明をしましょう
repeatはP1を指定しないと永久に繰り返します
これを無限ループと言います

このとき必ずwaitを入れてくださいwait命令はP1で指定された時間(100=一秒)待ちます
これを入れないとパソコンがクラッシュします

pos 命令が今回の本題です
pos 命令は座標を指定するものでこの命令はmes,picload命令に有効です
パラメータはx,y座標ですがこれを言い換えると
左右の位置,上下の位置と言うものです
この命令で言う座標は
左上を0,0として右下に行くほど大きくなるものです
数字加減も最初は分からないと思いますが
これも慣れですがんばってください
END

プログラムレッスン~色の指定~

2007-04-04 09:42:15 | プログラム
さて今日は色の指定です
とりあえず
「赤パジャマ
 青パジャマ
 黄パジャマ」

表示させてください
でもなんか表現に欠けますね
こういうときはこうします
color 255,0,0
mes "赤パジャマ"
color 0,0,255
mes "青パジャマ"
color 255,255,0
mes "黄パジャマ"
として実行するとこうなります
赤パジャマ
青パジャマ
黄パジャマ
となります
color命令は現在指定されている色を指定する命令です
color命令を紹介するのが面倒だったので
mes命令のときに言いませんでしたが"内の文字を現在指定されている色で出しますこのほかにもline(線分を描く)やboxf(四角形を描く)などが
あげられます

色の指定の仕方ですが
パラメーター1・・・R(赤)の量((最小)0~255(最大))
パラメーター2・・・G(緑)     〃
パラメーター3・・・B(青)     〃
です分かる人は分かりますが分からない人は

これだけでも覚えてください
赤・・・255,0,0
緑・・・0,255,0
青・・・0,0,255
黄・・・255,255,0
紫・・・255,0,255
水色・・・0,255,255
黒・・・0,0,0
白・・・255,255,255
END

Let's do it!

2007-04-03 13:23:04 | プログラム
このプログラムを実行すると
こんなものができます
プログラムはこちら
screen 0,320,240
title"A LOT OF LINE"
cls 4
randomize
color 255,255,255
font"",40
pos 30,70
mes"A LOT OF LINE"
wait 300

repeat
cls 4
hon=rnd(200):hon+=200
ax=rnd(160):ax+=80
ay=rnd(120):ay+=60
repeat hon
r=rnd(255):g=rnd(255):b=rnd(255)
x=rnd(320):y=rnd(240)
xa=rnd(320):ya=rnd(240)
color r,g,b
line ax,ay,x,y
wait 5
loop
loop
です
今回のはよく見ればわかるかも・・・
END

プログラムレッスン

2007-04-02 14:45:03 | プログラム
今回からpartはやめてプログラムレッスンに統一します
さて今回はcntについてです
たとえば
a(0)
a(1)


・(7回)
と言うようにしたければ
repeat 7
mes "a("+cnt+")"
loop
と言うように使います
このcntはrepeat~loop内で使うものでloopで1増えると言う代物で
普通0始まりです
しかしrepeatの二つ目のパラメーターで開始値が指定できます
このようにHSPシステムが勝手に代入してくれるものをシステム変数と言います
またシステム変数はcnt=5のように代入できません
しかしct=0:ct=cntは可能ですわかっていただけましたでしょうか
END

プログラムNO.5

2007-03-31 17:08:00 | プログラム
さて教習を始めるとしますかね
今回はとりあえず
御宅菜プロ太と15回表示してください
今までなら
mes "御宅菜プロ太"
mes "御宅菜プロ太"
mes "御宅菜プロ太"
mes "御宅菜プロ太"
mes "御宅菜プロ太"
     ・
     ・
     ・
     ・
としますよね
それか
c=0
*a
mes "御宅菜プロ太"
c=c+1
if c=15:stop
goto *a
ですねでも長いですね
それを簡略化しましょう
repeat 15
mes "御宅菜プロ太"
loop
です
repeatは繰り返しの基点を示すもの
loopは終点を示すものです
repeatはパラメータ1が繰り返す数 2もありますが
あさってぐらいに説明します
つまり
repeat~loop間をrepeatのP1の回数だけ繰り返すものです
まあつまりはこういうことです
END

プログラムテスト

2007-03-23 17:12:23 | プログラム
さてここで
HSPプログラムテストを行います
作るのはこれ
「占いゲーム」です
詳細は
まず
ボタンを押して と表示して
押してと書かれたボタンを出します
そしてボタンを押すと
大吉

中吉
末吉

のいずれかがランダムで表示されるものを作ってください
いまから4/1AM0:00までです
コメントよりスクリプトを公開してください
END

ソースA

2007-03-20 16:06:52 | プログラム
僕の作ったソースの公開です
上記の絵を格闘.bmpと言う名前でスクリプトと同フォルダに保存してください
では行きますソースとは・・・

#pack "格闘.bmp"
#packopt name "簡単格ゲー"
*tit
title "簡単格ゲー"
buffer 1
picload "格闘.bmp"
gsel 0,0
screen 0
font"",50
mes "簡単格ゲー"
button "一人",*sets
button "二人",*set
button"アイテム",*atim
button "終了",*e
stop
*e
end
*set
cls
font "",20
mes "このゲームは二人用だn操作は簡単n"
mes "一人目の操作方法は"
mes "移動・・・カーソルキー左右"
mes "攻撃・・・マウス左クリック"
mes "ジャンプ・・・マウス右クリックn"
mes "二人目は"
mes "移動・・・Z,Xキー"
mes "攻撃・・・Ctrlキー"
mes "ジャンプ・・・スペースキーnだ"
button "戦闘開始",*start
button "ハンデ戦闘",*hann
stop
*start

boxf

p1x=100
p1y=240
p2x=300
p2y=240
if hannde=0:hp1=100:hp2=100:else:hp1=hp1save:hp2=hp2save
nv1=0
nv2=0
*rs
screen 0,400,300
randomize

repeat

hpz1=hp1:hpz2=hp2
if hpz1>100:hpz1=100
if hpz2>100:hpz2=100
redraw 0
color 0,0,0
boxf
nnv1=300-nv1*5
nnv2=300-nv2*5
if nv1!0:nv1+1:pos 130,0:color 255,255,255:mes "残り"+nnv1+"(金縛り2P)":if nv1=60:nv1=0
if nv2!0:nv2+1:pos 130,25:color 255,255,255:mes "残り"+nnv2+"(金縛り1P)":if nv2=60:nv2=0

ffm1=300-fm1*5
ffm2=300-fm2*5
if fm1!0:fm1+1:pos 130,50:color 255,255,255:mes "残り"+ffm1+"(FM1P)":if fm1=60:fm1=0
if fm2!0:fm2+1:pos 130,75:color 255,255,255:mes "残り"+ffm2+"(FM2P)":if fm2=60:fm2=0
if hp1>=150:hp1=150
if hp2>=150:hp2=150
c=c+1
counte=counte+1
dam=rnd(20)
dam=dam+1
color 255,255,0
line 0,280,400,280
pos p1x,p1y
gmode 2
gcopy 1,0,p1m*40,40,40
pos p2x,p2y
gmode 2
gcopy 1,40,p2m*40,40,40

color 255,0,0
pos 0,0
boxf 0,0,100,20
color 0,255,0
pos 0,0
boxf 0,0,hpz1,20
pos 0,35
color 255,255,255
mes"HP(1)"+hp1


color 255,0,0
boxf 300,0,400,20
color 0,0,255
boxf 300,0,hpz2+300,20
pos 0,35
color 255,255,255
pos 300,35
mes"HP(2)"+hp2

stick ky,5
if nv2=0:if ky&1:p1x=p1x-8:p1m=1:if fm1!0:p1x-5
if nv2=0:if ky&4:p1x=p1x+8:p1m=0:if fm1!0:p1x+5
p1x=limitf (p1x,0,360)
if nv2=0:if ky&256:if ((abs(p1x-p2x)<=30)&p1y=p2y):pos p2x,p2y:gcopy 1,80,0,40,40:wait 50:hp2-dam
if nv2=0:if ky&512:p1y=100:c=0
if c=25:p1y=240
if hp2<=0:make2+1:dialog "2Pさん,負けましたn",,"2P負け"+make2+"回目です":goto *chk

if ky&64:if ((abs(p1x-p2x)<=30)&p1y=p2y):pos p1x,p1y:gcopy 1,80,0,40,40:wait 50:hp1-dam
if ky&16:counte=0:p2y=100
if counte=25:p2y=240

getkey k,90
if nv1=0:if k=1:p2x-8:p2m=0:if fm2!0:p2x-5

getkey k,88
if nv1=0:if k=1:p2x+8:p2m=1:if fm2!0:p2x+5
p2x=limitf (p2x,0,360)
if hp1<=0:make1+1:dialog "1Pさん,負けましたn",,"1P負け"+make1+"回目です":goto *chk


if kkb=0|bbm=0|ques=0|kbb=0|fmb=0:a=rnd(80)
if kkb=0|bbm=0|ques=0|kbb=0:hl=rnd(2)
if kkb=0:kyu=rnd(340)
if bbm=0:bx=rnd(340)
if ques=0:qx=rnd(340):pmp=rnd(21):pmp-=10
if kbb=0:kbx=rnd(340)

if a=0 {
if hl=0:pos kyu,240:kky=240:else:pos kyu,100:kky=100
kyunl=kyu
gcopy 1,120,0,40,40
kkb=1
}
if kkb=1 {
pos kyunl,kky
gcopy 1,120,0,40,40
}
if ((abs(p1y-kky)<=40)&(abs(p1x-kyunl)<=40)):hp1=hp1+30:kkb=0:kyu=0:kky=0
if ((abs(p2y-kky)<=40)&(abs(p2x-kyunl)<=40)):hp2=hp2+30:kkb=0:kyu=0:kky=0


if a=1 {;qbh
if hl=0:pos bx,240:bby=240:else:pos bx,100:bby=100
byunl=bx
gcopy 1,120,40,40,40
bbb=1
}
if bbb=1 {
pos byunl,bby
gcopy 1,120,40,40,40
}
if ((abs(p1y-bby)<=40)&(abs(p1x-byunl)<=40)):hp1=hp1+pmp:bbb=0:bbu=0:bby=0
if ((abs(p2y-bby)<=40)&(abs(p2x-byunl)<=40)):hp2=hp2+pmp:bbb=0:bbu=0:bby=0


if a=2 {;qbh
if hl=0:pos qx,240:qqy=240:else:pos qx,100:qqy=100
qyunl=qx
gcopy 1,80,60,40,40
qqq=1
}
if qqq=1 {
pos qyunl,qqy
gcopy 1,80,40,40,40
}
if ((abs(p1y-qqy)<=40)&(abs(p1x-qyunl)<=40)):hp1=hp1-30:qqq=0:qqy=0
if ((abs(p2y-qqy)<=40)&(abs(p2x-qyunl)<=40)):hp2=hp2-30:qqq=0:qqy=0


if a=3 {;kbb
if hl=0:pos kbx,240:kby=240:else:pos kbx,100:kby=100
kbyunl=kbx
gcopy 1,200,0,40,40
kbb=1
}
if kbb=1 {
pos kbyunl,kby
gcopy 1,200,0,40,40
}
if ((abs(p1y-kby)<=40)&(abs(p1x-kbyunl)<=40)):nv1=1:kbb=0:kby=0
if ((abs(p2y-kby)<=40)&(abs(p2x-kbyunl)<=40)):nv2=1:kbb=0:kby=0


if a=4 {;kbb
if hl=0:pos fmx,240:fmy=240:else:pos fmx,100:fmy=100
fmxunl=fmx
gcopy 1,200,0,40,40
fmb=1
}
if fmb=1 {
pos fmxunl,fmy
gcopy 1,200,40,40,40
}
if ((abs(p1y-fmy)<=40)&(abs(p1x-fmxunl)<=40)):fm1=1:fmb=0:fmy=0
if ((abs(p2y-fmy)<=40)&(abs(p2x-fmxunl)<=40)):fm2=1:fmb=0:fmy=0

wait 5
redraw 1
loop
*chk

cls
button "もう一回",*start
button "終わる",*e
stop
*hann
hannde=1
cls
mes "1PのHPは?n(100まで)
input hp1,,,3
mes "2PのHPは?n(100まで)
input hp2,,,3
button "戦闘開始",*suuch
stop
*suuch
p1x=100
p1y=240
p2x=300
p2y=240
if hp1>=100:hp1=100
if hp2>=100:hp2=100
if hp1<=0:hp1=1
if hp2<=0:hp2=1
hp1save=hp1:hp2save=hp2
goto *rs




ですあとソースBも追加してください
著作権についてはこのブログに関する著作権
を参考にしてください

ソースB

2007-03-20 16:06:03 | プログラム
さてソースAに続いてソースBの公開です
ソースは・・・

*sets
cls
font"",20
mes "操作は簡単\n"
mes "操作方法は"
mes "移動・・・カーソルキー左右"
mes "攻撃・・・マウス左クリック"
mes "ジャンプ・・・マウス右クリック\nだ"
button "戦闘開始",*starts
stop
*starts
cls
mes "難易度を指定して下さい"
button"超簡単",*ve
button"簡単",*ea
button"普通",*usu
button"難関",*h
button"超難関",*vh
stop
*henn
boxf
hard=limit (hard,1,50)
hp1=100
hp2=100
p1x=100
p1y=240
p2x=300
p2y=240
nv1=0
nv2=0
*rss
screen 0,400,300
randomize
repeat
redraw 0
color 0,0,0
boxf
nnv1=300-nv1*5
nnv2=300-nv2*5
if nv1!0:nv1+1:pos 130,0:color 255,255,255:mes "残り"+nnv1+"(金縛りCPU)":if nv1=60:nv1=0
if nv2!0:nv2+1:pos 130,25:color 255,255,255:mes "残り"+nnv2+"(金縛り1P)":if nv2=60:nv2=0

ffm1=300-fm1*5
ffm2=300-fm2*5
if fm1!0:fm1+1::pos 130,50:color 255,255,255:mes "残り"+ffm1+"(FM1P)":if fm1=60:fm1=0
if fm2!0:fm2+1:pos 130,75:color 255,255,255:mes "残り"+ffm2+"(FMCPU)":if fm2=60:fm2=0

if hp1>=150:hp1=150
if hp2>=150:hp2=150
hpz1=hp1:hpz2=hp2
if hpz1>100:hpz1=100
if hpz2>100:hpz2=100
c=c+1
counte=counte+1
dam=rnd(20)
dam=dam+1
color 255,255,0
line 0,280,400,280
pos p1x,p1y
gmode 2
gmode 2:gcopy 1,0,p1m*40,40,40
pos p2x,p2y
gmode 2:gcopy 1,160,p2m*40,40,40

color 255,0,0
pos 0,0
boxf 0,0,100,20
color 0,255,0
pos 0,0
boxf 0,0,hpz1,20
pos 0,35
color 255,255,255
mes "YOUR HP"+hp1


color 255,0,0
boxf 300,0,400,20
color 0,0,255
boxf 300,0,hpz2+300,20
pos 0,35
color 255,255,255
pos 300,35
mes "CPU'S HP"+hp2

stick ky,5
if nv2=0:if ky&1:p1x=p1x-8:p1m=1:if fm1!0:p1x-5
if nv2=0:if ky&4:p1x=p1x+8:p1m=0:if fm1!0:p1x+5
p1x=limitf (p1x,0,360)
if nv2=0:if ky&256:if ((abs(p1x-p2x)<=30)&p1y=p2y):pos p2x,p2y:gmode 2:gcopy 1,80,0,40,40:wait 50:hp2-dam

if nv2=0:if ky&512:p1y=100:c=0
if c=25:p1y=240
if hp2<=0:make2+1:dialog "CPUさんの負けです\n",,"CPU負け"+make2+"回目です":goto *chks

jumpcode=rnd(20)
atackchk=rnd(hard)
movechk=rnd(10)
houkou=rnd(25)
if houkou=0:hkc+=1:if hkc=2:hkc=0
if p2y!240:jumpcode=1
if nv1=0:if atackchk=0:if ((abs(p1x-p2x)<=30)&p1y=p2y):pos p1x,p1y:gmode 2:gcopy 1,80,0,40,40:wait 50:hp1-dam;2P攻撃済み
if nv1=0:if jumpcode=0:counte=0:p2y=100;2Pジャンプ済み
if counte=25:p2y=240;2Pジャンプ終了済み

if nv1=0:if movechk!0&hkc=0&kkb=0&bbb=0:p2x-8:p2m=0:if fm2!0:p2x-5;左移動判断

if nv1=0:if movechk!0&hkc=1&kkb=0&bbb=0:p2x+8:p2m=1:if fm2!0:p2x+5;右移動判断

if nv1=0:if movechk!0&kyu<p2y&kkb=1:p2x-8:p2m=0:if fm2!0:p2x-5;左移動判断kkb有り if nv1=0:if movechk!0&kyu>p2y&kkb=1:p2x+8:p2m=1:if fm2!0:p2x+5;右移動判断kkb有り

if nv1=0:if movechk!0&kyu<p2y&bbb=1:p2x-8:p2m=0:if fm2!0:p2x-5;左移動判断bbb有り if nv1=0:if movechk!0&kyu>p2y&bbb=1:p2x+8:p2m=1:if fm2!0:p2x+5;右移動判断bbb有り

p2x=limitf (p2x,0,360);壁

if hp1<=0:make1+1:dialog "Playerさん,負けました\n",,"Player負け"+make1+"回目です":goto *chks


if kkb=0|bbm=0|ques=0|kbb=0|fmb=0:a=rnd(80)
if kkb=0|bbm=0|ques=0|kbb=0:hl=rnd(2)
if kkb=0:kyu=rnd(340)
if bbm=0:bx=rnd(340)
if ques=0:qx=rnd(340):pmp=rnd(21):pmp-=10
if kbb=0:kbx=rnd(340)


if a=0 {
if hl=0:pos kyu,240:kky=240:else:pos kyu,100:kky=100
kyunl=kyu
gmode 2:gcopy 1,120,0,40,40
kkb=1
}
if kkb=1 {
pos kyunl,kky
gmode 2:gcopy 1,120,0,40,40
}
if ((abs(p1y-kky)<=40)&(abs(p1x-kyunl)<=40)):hp1=hp1+30:kkb=0:kyu=0:kky=0
if ((abs(p2y-kky)<=40)&(abs(p2x-kyunl)<=40)):hp2=hp2+30:kkb=0:kyu=0:kky=0



if a=1 {
if hl=0:pos bx,240:bby=240:else:pos bx,100:bby=100
byunl=bx
gmode 2:gcopy 1,120,40,40,40
bbb=1
}
if bbb=1 {
pos byunl,bby
gmode 2:gcopy 1,120,40,40,40
}
if ((abs(p1y-bby)<=40)&(abs(p1x-byunl)<=40)):hp1=hp1+pmp:bbb=0:bbu=0:bby=0
if ((abs(p2y-bby)<=40)&(abs(p2x-byunl)<=40)):hp2=hp2+pmp:bbb=0:bbu=0:bby=0

if a=2 {;qbh
if hl=0:pos qx,240:qqy=240:else:pos qx,100:qqy=100
qxunl=qx
gcopy 1,80,40,40,40
qqq=1
}
if qqq=1 {
pos qxunl,qqy
gcopy 1,80,40,40,40
}
if ((abs(p1y-qqy)<=40)&(abs(p1x-qxunl)<=40)):hp1=hp1-30:qqq=0:qqy=0
if ((abs(p2y-qqy)<=40)&(abs(p2x-qxunl)<=40)):hp2=hp2-30:qqq=0:qqy=0

if a=3 {;kbb
if hl=0:pos kbx,240:kby=240:else:pos kbx,100:kby=100
kbyunl=kbx
gcopy 1,200,0,40,40
kbb=1
}
if kbb=1 {
pos kbyunl,kby
gcopy 1,200,0,40,40
}
if ((abs(p1y-kby)<=40)&(abs(p1x-kbyunl)<=40)):nv1=1:kbb=0:kby=0
if ((abs(p2y-kby)<=40)&(abs(p2x-kbyunl)<=40)):nv2=1:kbb=0:kby=0


if a=4 {;fmb
if hl=0:pos fmx,240:fmy=240:else:pos fmx,100:fmy=100
fmxunl=fmx
gcopy 1,200,0,40,40
fmb=1
}
if fmb=1 {
pos fmxunl,fmy
gcopy 1,200,40,40,40
}
if ((abs(p1y-fmy)<=40)&(abs(p1x-fmxunl)<=40)):fm1=1:fmb=0:fmy=0
if ((abs(p2y-fmy)<=40)&(abs(p2x-fmxunl)<=40)):fm2=1:fmb=0:fmy=0

wait 5
redraw 1
loop
*chks
cls
button "もう一回",*starts
button "終わる",*e
stop
*ve
hard=30
goto,*henn
*ea
hard=15
goto,*henn
*usu
hard=5
goto,*henn
*h
hard=3
goto,*henn
*vh
hard=1
goto,*henn
*atim
cls 4
font"",20
color 255,255,255
gcopy 1,120,0,40,40
pos 50,0
mes"救急箱・・・とるとHPが30回復"
pos 0,50
gcopy 1,120,40,40,40
pos 50,50
mes"?BOX・・・とるとHPが-10から+10までの間で増減する\n変わらないことも・・・"
pos 0,100
gcopy 1,80,40,40,40
pos 50,100
mes"爆弾・・・とるとHPが-30・・・"
pos 0,150
gcopy 1,200,0,40,40
pos 50,150
mes"金縛り・・・とると相手が3秒の金縛りにおそわれる\nとれば勝ったも同然?"
pos 0,200
gcopy 1,200,40,40,40
pos 50,200
mes"高速移動・・・とると3秒間高速移動ができる"
button"OK",*tit
stop

です
長いですね・・・
END

プログラムNO.6

2007-03-19 20:52:29 | プログラム
さてここまでで結構いろいろなゲームが作れますよね
でも今までの作業は決まった作業です
これを解決するのが乱数です
乱数とはHSPが勝手に作る数のことです
それを出すにはrnd関数を使います
関数と言うのは代入される変数=関数名(パラメーター)です
Exsel関数と同じです
(勝手に使っていいのかな?)
つまりこのことから
この関数はa=rnd(10)とすればaに0~9までがランダムに代入されます
いいですか10なら0~9,55なら0~54までです
注意してください
では次のスクリプトを打ってください

a=rnd(10)
mes a
stop
です
実行して画面の数字の記録をとっていくとわかりますが
毎回数が同じです
これを解決するのが
randomize命令ですこれは
一行目に打っておくことを勧告します
さてではさっきのヤツの一行目にrndomize命令を追加
してください
毎回数は違うはずです
ちょっと難しいですが大事なところです
しっかり覚えてください
END

プログラムNO.5

2007-03-16 19:34:20 | プログラム
さてプログラムNo.5の公開です
さて今回は画像を表示しましょう
画像はpicolod命令により行います
では仮にa.bmpと言うものを出してみましょう
picload "a.bmp"
stop
これで終わりです
つまりpicload
に続き"そして拡張子も含めファイル名を指定そして"

です
また
picload "a.bmp",1
とすると
現在の大きさのスクリーンのまま絵がが表示されます
(0にすると画像に合わせたサイズになり
省略するとこれになります)
またこの命令で出せるのは
スクリプトと同じフォルダにあるjpg,bmp,gif,icoファイルでアニメーションgifは扱えません
と言う代物です
END