HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2009
1128
nedfオセロゲームの描画の仕方16解決


nedf

リンク

2009/11/28(Sat) 01:34:24|NO.29024

私は今オセロゲームをつくろーと思うのですが
マウスがある一定の範囲に入ったときにオセロを決まった座標に表示するには
どうすればいいんでしょうか?



この記事に返信する


Ve

リンク

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 *メインループ



nedf

リンク

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

ここを見るとわかるかも
http://masudahp.web.fc2.com/hsp3/kiso/hspk025.html#h4



nedf

リンク

2009/11/28(Sat) 12:31:16|NO.29034

なるほど
わかりました
ここでもう1つ質問なんですが
オセロをクリックで置くとそこの座標にコピーされるようにしますよね
そして次のターンがくるとき
またいったんboxfなどの命令で画面を塗りつぶすことになり前のオセロが消えてしまうんですが
そこはどうすればいいでしょう



アンドロ井戸

リンク

2009/11/28(Sat) 14:40:50|NO.29037

後は調べまくるしかないですよね。
プログラミングは=調べる
無から有を産み出す作業、産みの苦しみを乗り越えて創造する喜びを味わうのが
プログラミングの醍醐味でしょう
頑張ってください


http://lhsp.s206.xrea.com/links.html



足利超神

リンク

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
解説はナシなんで自分で一つ一つ調べてみてください。
アルゴリズムは自分で考えましょう。



dsfrs

リンク

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までの書き方なので
()を使った書き方のほうがいいです。



dsfrs

リンク

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*ループ



lilith

リンク

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あたりがきれいですよ



ONION software Copyright 1997-2023(c) All rights reserved.