|
|
2009/11/28(Sat) 01:34:24|NO.29024
私は今オセロゲームをつくろーと思うのですが
マウスがある一定の範囲に入ったときにオセロを決まった座標に表示するには
どうすればいいんでしょうか?
|
|
2009/11/28(Sat) 10:19:24|NO.29028
質問がちょっと分かりにくいのですが・・・
こういう事なんでしょうか?
buffer 2
color 200,200,200
;境目のライン
repeat 9,1
line 0,cnt*32,320,cnt*32
line cnt*32,0,cnt*32,320
loop
buffer 3
;●
circle 0,0,31,31
screen 0,320,320
*メインループ
x=mousex/32 : x*=32
y=mousey/32 : y*=32
redraw 0
pos 0,0 : gcopy 2,0,0,320,320
pos x+1,y+1 : gcopy 3,0,0,31,31
redraw 1
wait 1
goto *メインループ
|
|
2009/11/28(Sat) 11:20:02|NO.29029
説明わかりぬくくてすみませんでした^^;
これでいいのですが
x=mousex/32 : x*=32
y=mousey/32 : y*=32
はどういう意味ですか
|
|
2009/11/28(Sat) 11:24:59|NO.29030
|
|
2009/11/28(Sat) 12:31:16|NO.29034
なるほど
わかりました
ここでもう1つ質問なんですが
オセロをクリックで置くとそこの座標にコピーされるようにしますよね
そして次のターンがくるとき
またいったんboxfなどの命令で画面を塗りつぶすことになり前のオセロが消えてしまうんですが
そこはどうすればいいでしょう
|
|
2009/11/28(Sat) 15:41:41|NO.29041
GRID_X = 20//縦のマスの数
GRID_Y = 20//縦のマスの数
SIZE_X = 20//縦のマスのサイズ
SIZE_Y = 20//縦のマスのサイズ
screen 0,SIZE_X*GRID_X-1,SIZE_Y*GRID_Y-1
WHITE = 0
BLACK = 1
dim CLICK,GRID_X,GRID_Y
repeat GRID_X+GRID_Y
line SIZE_X*(cnt+1),0,SIZE_X*(cnt+1),SIZE_Y*GRID_Y
line 0,SIZE_Y*(cnt+1),SIZE_X*GRID_X,SIZE_Y*(cnt+1)
loop
*main
wait 1
redraw 0
stick key
if key = 256{
Ox = mousex/SIZE_X
Oy = mousey/SIZE_Y
title ""+Ox+" "+Oy
if CLICK(Ox,Oy) == BLACK:CLICK(Ox,Oy) = WHITE:else:CLICK(Ox,Oy) = BLACK
}
cntx = 0
cnty = -1
repeat GRID_X*GRID_Y
cntx = cnt\GRID_X
if cntx == 0:cnty ++
if CLICK(cntx,cnty) == BLACK:color 0,0,0:else:color 255,255,255
boxf cntx*SIZE_X+1,cnty*SIZE_Y+1,(cntx+1)*SIZE_X-1,(cnty+1)*SIZE_Y-1
loop
redraw 1
goto *main
解説はナシなんで自分で一つ一つ調べてみてください。
アルゴリズムは自分で考えましょう。
|
|
2009/11/28(Sat) 21:04:48|NO.29051
お2人ともありがとうございました
すみません、またここで問題が起きました
同じところにオセロを置かないようにするスプリクトを作ったんですが
どうしても詰まってしまいました
自分で解決したほうがいいんでしょうか?
悩んだ末質問したのですが
cls
a=1
dim b,100
dim e,100
screen 0,500,500
celload "しろ.gif",1
celload "黒.gif",2
celload"板.GIF",3
celput 3
gmode 4,40,40,256
color 255,255,255
*ループ
kaunto=0
x=mousex/50 : x*=50
y=mousey/50 : y*=50
pos x+5,y+5
getkey key,1
getkey key2,2
if key=1 : goto*描画
if key2=1 : goto*描画2
await 10
goto *ループ
*描画
repeat a
if b.cnt=x : kaunto=kaunto+1
loop
repeat a
if e.cnt=y : kaunto=kaunto+1
loop
if kaunto>10 : goto*ループ
b.c=x
e.c=y
c=c+1
a=a+1
pos x+5,y+5
gcopy 2
goto*ループ
stop
*描画2
repeat a
if b.cnt=x : kaunto=kaunto+1
loop
repeat a
if e.cnt=y : kaunto=kaunto+1
loop
if kaunto>10 : goto*ループ
c=c+1
b.c=x
e.c=y
a=a+1
pos x+5,y+5
gcopy 1
goto*ループ
|
|
2009/11/28(Sat) 21:13:26|NO.29052
質問する際、スクリプトを載せるときは
すぐに再現できるようにしたほうがいいです。
dsfrsさんのPCじゃF5押せば起動することができますが、
自分のPCじゃ画像がないので再現できません。
あと、配列変数は
変数名(配列番号、配列番号・・・)
と書きます。
変数名.配列番号
という書き方はHSP2までの書き方なので
()を使った書き方のほうがいいです。
|
|
2009/11/28(Sat) 22:32:40|NO.29055
すみません、自作の素材にあわせて作ってありました^^;
これでどうでしょう?
こんなかんじです
a=1
dim b,100
dim e,100
buffer 1
circle 0,0,40,40
buffer 2
color 200,200,200
circle 0,0,40,40
screen 0,500,500
repeat 10
color 0,0,0
line 0,cnt*50,500,cnt*50
line cnt*50,0,cnt*50,500
loop
gmode 4,40,40,256
color 255,255,255
*ループ
kaunto=0
x=mousex/50 : x*=50
y=mousey/50 : y*=50
pos x+5,y+5
getkey key,1
getkey key2,2
if key=1 : goto*描画
if key2=1 : goto*描画2
await 10
goto *ループ
*描画
repeat a
if b(cnt)=x : kaunto=kaunto+1
loop
repeat a
if e(cnt)=y : kaunto=kaunto+1
loop
if kaunto>10 : goto*ループ
b(c)=x
e(c)=y
c=c+1
a=a+1
pos x+5,y+5
gcopy 2
goto*ループ
stop
*描画2
repeat a
if b(cnt)=x : kaunto=kaunto+1
loop
repeat a
if e(cnt)=y : kaunto=kaunto+1
loop
if kaunto ●ここに何を入れればいいか● : goto*ループ
c=c+1
b(c)=x
e(c)=y
a=a+1
pos x+5,y+5
gcopy 1
goto*ループ
|
|
2009/11/28(Sat) 22:47:56|NO.29056
>どうしても詰まってしまいました
どこがどう詰まったんですか?
こうしてもこうならない、
なぜかこうなってしまう
など書かないとどこがダメなのか分かりません。
それに自分だけで開発してる分にはいいですが、
人に見せるときはスクリプトにコメント(//や;でコメントをつけれる)
や
変数の名前を意味のあるものにしましょう。
aやbなどではなんの変数なのか分かりません。
あと
a=a+1 は
a+=1
または
a++
とも描けます。
|
|
2009/11/29(Sun) 10:05:25|NO.29060
何回もすみません
すみません少々急ぎすぎてしまって
こんかいはきちんと書きます
えっとまずオセロを100,100のところに置くとしますよね
それをもう一度100,100のところに置こうとしても置けないようにしたいんです
そこで考えたのがxとyの座標を配列変数に1つずつ代入し
それを今度置いた座標と照合し重なっていればkauntを1プラスして最終的に
kauntがある一定以上になったらそれは前にオセロを置いたところなので一番最初に戻る
というふうにしたいのですが
kauntがこの数字以上なら重なっていると絶対にいえる
といううその数字に一定性が見つけ出せません
動作確認は右クリックで●左クリックで○を描写しますから
同じところに右クリックと左クリックをすることで上書きされているか確認できるようにしています
スクリプトの中のこの変数をこう変えれば一定の数字になるなどのことも考えていますが
いまだ見つけれません
まだ説明が足りない部分がありましたら参考になります
repeatkaunt=1
dim xzahyou,100;変数領域確保
dim yzyahyou,100;同じく
buffer 1
circle 0,0,40,40 ;●を空想画面に描写
buffer 2
color 200,200,200
circle 0,0,40,40 ;○を仮想画面に描写
screen 0,500,500
repeat 10 ;10×10マスを描写
color 0,0,0
line 0,cnt*50,500,cnt*50
line cnt*50,0,cnt*50,500
loop
gmode 4,40,40,256 ;コピー方法設定
color 255,255,255
*ループ
kaunto=0 ;カウントリセット
x=mousex/50 : x*=50 ;x座標を調べ座標に応じてコピーする座標を決める
y=mousey/50 : y*=50 ;同じく
pos x+5,y+5
getkey key,1 ;左クリックを押したかどうか調べる
getkey key2,2 ;右クリックを押したかどうか調べる
if key=1 : goto*描画
if key2=1 : goto*描画2
await 10
goto *ループ
*描画
repeat repeatkaunt
if xzahyou(cnt)=x : kaunto++ ;過去のオセロのx座標と今回の座標を照合
loop
repeat repeatkaunt
if yzahyou(cnt)=y : kaunto++ ;過去のオセロのy座標と今回の座標を照合
loop
if kaunto ●ここに何を入れればいいか●: goto*ループ ;カウントが●●のとき描写されずループへ
xzahyou(youso)=x ;今回のx座標を配列変数に代入
yzahyou(youso)=y ;今回のy座標を配列変数に代入
youso++
repeatkaisu++
pos x+5,y+5
gcopy 2 ;○をコピー
goto*ループ
stop
*描画2
repeat repeatkaunt
if xzahyou(cnt)=x : kaunto=kaunto+1
loop
repeat repeatkaunt
if yzahyou(cnt)=y : kaunto=kaunto+1
loop
if kaunto ●ここに何を入れればいいか● : goto*ループ
youso++
xzahyou(youso)=x
yzahyou(youso)=y
repeatkaisu++
pos x+5,y+5
gcopy 1
goto*ループ
| |
|
2009/11/29(Sun) 13:38:12|NO.29064
違った考え方になりますが
masu(x,y)という配列を用意しておき、例えばx=10,y=5が黒であれば
masu(10,5)=1
白であれば
masu(10,5)=2
なにもなければ
masu(10,5)=0
のようにしてやれば、クリックした座標を(x1,y1)としたときに
if(key==1 && masu(x1,y1)==0){masu(x1,y1)=1}
のようにシンプルに書いてやれるかと思います
もし見当違いでしたらすいません;;
|
|
2009/11/29(Sun) 14:47:35|NO.29065
だんだん質問の仕方が上達してきましたね。
処理に無駄な部分が多かったりしたので、
大幅に改定しました。
まずは、
x=mousex/50 : x*=50 ;x座標を調べ座標に応じてコピーする座標を決める
y=mousey/50 : y*=50 ;同じく
pos x+5,y+5
は右クリックか左クリックが押された場合のみ決めればいいです。
次に
処理を
キー入力待ち
↓
押されたら、配列変数座標に白か黒か記憶
↓
描画
します。
この時
配列変数座標には
なし=0、白=1、黒=2
とし
if 配列変数座標が0ならコマをおけるといった風にします。
次に
待機にawaitを使っていますが、
waitでおkです。
awaitはリアルタイム処理が求められるゲームなどで使用しましょう。
そして配列変数はlilithさんが言うように二次元配列を使いましょう。
xzahyou(x)
yzahyou(y)
ではなく
zahyou(x,y)
でおkです。
以下書き直したスクリプトです。
repeatkaunt=1
dim zahyou,10,10
buffer 1
circle 0,0,40,40 ;●を空想画面に描写
buffer 2
color 200,200,200
circle 0,0,40,40 ;○を仮想画面に描写
screen 0,500,500
repeat 10 ;10×10マスを描写
color 0,0,0
line 0,cnt*50,500,cnt*50
line cnt*50,0,cnt*50,500
loop
gmode 0,40,40
color 255,255,255
NO = 0
WHITE = 1
BLACK = 2
goto*ループ//////ここから
#deffunc b_getkey var keypush,int tokey//キーコード、押されてるか
getkey key,tokey
if key == 1:keycode(tokey)++:else:keycode(tokey) = 0
if keycode(tokey) == 1:keypush = 1:else:keypush = 0
return///////ここまでは気にしなくていいです
*ループ
wait 1
b_getkey 右クリック,1//押された瞬間だけ1になる
b_getkey 左クリック,2
if 右クリック = 1:マス = BLACK:goto*クリック処理//マスに色を渡し、描画処理へ
if 左クリック = 1:マス = WHITE:goto*クリック処理
goto*ループ
*クリック処理
x = mousex/50
y = mousey/50
if zahyou(x,y)==NO{//もしなにも置かれてなければ
zahyou(x,y)=マス
pos x*50+5,y*50+5
gcopy マス ;○をコピー
}
goto*ループ
getkey命令は押されているあいだ1になるので
押しっぱなしにしたときコマが置かれてしまうので
押した瞬間だけ1になる命令を定義しました。
ここらへんはまだ覚えなくていいです。
goto*ループ//////ここから
#deffunc b_getkey var keypush,int tokey//キーコード、押されてるか
getkey key,tokey
if key == 1:keycode(tokey)++:else:keycode(tokey) = 0
if keycode(tokey) == 1:keypush = 1:else:keypush = 0
return///////ここまでは気にしなくていいです
| |
|
2009/11/29(Sun) 14:49:51|NO.29066
なるほど〜〜
2つに分けるからややこしかったんですね
しかも、配列変数に保存するのではなく
配列変数の要素に代入し識別用に数字を代入したと
考え付きませんでしたありがとうございました^^
いちおう私はこんな風にしました
dim zahyou,500,500
buffer 1
circle 0,0,40,40
buffer 2
color 200,200,200
circle 0,0,40,40
screen 0,500,500
repeat 10
color 0,0,0
line 0,cnt*50,500,cnt*50
line cnt*50,0,cnt*50,500
loop
gmode 4,40,40,256
color 255,255,255
*ループ
kaunto=0
x=mousex/50 : x*=50
y=mousey/50 : y*=50
pos x+5,y+5
getkey key,1
getkey key2,2
if key=1 : goto*描画
if key2=1 : goto*描画2
await 10
goto *ループ
*描画
repeat kazu,1
if zahyou(x,y)=cnt : kaunto++
loop
if kaunto!0 : goto*ループ
kazu++
zahyou(x,y)=kazu
pos x+5,y+5
gcopy 2
goto*ループ
stop
*描画2
repeat kazu,1
if zahyou(x,y)=cnt : kaunto++
loop
if kaunto!0 : goto*ループ
kazu++
zahyou(x,y)=kazu
pos x+5,y+5
gcopy 1
goto*ループ
stop
これはすぐ実行できるように書いたので
私の用意している素材を使えばもっとすっきりしたのになりました
ありがとうございました
|
|
2009/11/29(Sun) 15:00:02|NO.29067
足利超神さん
すみません、お礼かいてるうちに投稿されていました
わたしの質問にここまで答えてくださりありがとうございます
>だんだん質問の仕方が上達してきましたね。
ありがとうございます、今回ご指摘されたことはとても参考になりました
>処理に無駄な部分が多かったりしたので、
>大幅に改定しました。
わざわざすみません^^;
こんな仕方もできたんですね
やっぱり、ちゃんと思い通りうごいたのはとってもうれしかったですv
回答してくださった皆さんもありがとうございました
screen 0,700,700,,0,0
pos 350,350
input a,100,20
button"ok",*描写
stop
*描写
color 0,0,0
boxf
color 255,255,255
b=700/a
c=10+a
repeat b
await c
line cnt*a,0,700,cnt*a
line 0,700-cnt*a,700-cnt*a,700
line 0,700-cnt*a,cnt*a,0
line 700,cnt*a,700-cnt*a,700
loop
|
|
2009/11/29(Sun) 15:01:42|NO.29068
すみません↑のスクリプトはline命令の練習で作ったやつです間違って貼り付けてしまってました
気にしないでください
ちなみに使うなら10あたりがきれいですよ
|
|