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


HSPTV!掲示板


未解決 解決 停止 削除要請

2011
1110
kanahironif命令の省略のしかたについて8解決


kanahiron

リンク

2011/11/10(Thu) 20:52:10|NO.42911

今とても簡単なゲームを作っていて、ifの当たり判定があります。
はじめはとても複雑で、段々と改良をしてきました。
今はたった1行になったのですが、もっと改良(省略)できそうで出来ません。
ソースはこうです
if (横 = 横2 | 横 = y10_2 | 横 = y20_2 | y10_ = 横2 | y10_ = y10_2 | y10_ = y20_2 |y20_ = 横2 | y20_ = y10_2 | y20_ = y20_2) and (縦 = 縦2 | 縦 = t10_2 | 縦 = t20_2 | t10_ = 縦2 | t10_ = t10_2 | t10_ = t20_2 | t20_ = 縦2 | t20_ = t10_2 | t20_ = t20_2):goto *atari

省略できそうと思ったのは、(A = BB | A = CC | A = DD | B = BB | B = CC | B = DD …)と、 orで区切っているものに同じ物が出てきているからです。 でも、(A = (BB | CC | DD)) など色々と試したのですが、うまくできませんでした。 これ以上は省略することはできないのでしょうか? できるなら、簡単な表現でいいので、省略したソースを載せて下さい。 よろしくお願いします。



この記事に返信する


kanahiron

リンク

2011/11/10(Thu) 20:53:01|NO.42912

改行失敗して観づらくなってしまいました…
すみません



ひらまる

リンク

2011/11/10(Thu) 20:57:04|NO.42913

横2やt10_2やt20_2が何を表わしているのかよくわからないので、どうとも言えません…
そもそもこれは何と何の当たり判定なのでしょうか…?



れみはる

リンク

2011/11/10(Thu) 21:20:03|NO.42914

配列変数を応用するとか?



kanahiron

リンク

2011/11/10(Thu) 21:33:15|NO.42915

ひらまる様、すみません

このゲームはキーボードで自キャラを操作して、敵のキャラから逃げながら宝を取るゲームです。
横、縦は自キャラの座標、y○○_、t○○_ は自キャラの座標に○○の数を足した変数、
横2、縦2は敵の座標、y○○_2、t○○_2 は敵の座標に○○の数を足した変数です

randomize buffer 1:picload "cell.bmp" buffer 2:picload "cell2.bmp" screen 0,900,700 gosub *reset *ループ ターン = ターン + 1 color 255,200,155 boxf 0,0,900,650 color stick key,1+2+4+8 if key=1:横=横-10 if key=3:横=横-10:縦=縦-10 if key=2:縦=縦-10 if key=6:横=横+10:縦=縦-10 if key=4:横=横+10 if key=12:横=横+10:縦=縦+10 if key=8:縦=縦+10 if key=9:横=横-10:縦=縦+10 if key=15:横 = rnd(88) * 10:縦 = rnd(63) * 10 if 横 < 0:横 = 0 if 縦 < 0:縦 = 0 if 横 > 880:横 = 880 if 縦 > 630:縦 = 630 y10_ = 横 + 10 y20_ = 横 + 20 t10_ = 縦 + 10 t20_ = 縦 + 20 redraw 1 pos 横,縦 gcopy 2,0,0,20,20 pos 横2,縦2 gcopy 1,0,0,20,20 redraw 2 //当たり判定 Ver5 if (横 = 横2 | 横 = y10_2 | 横 = y20_2 | y10_ = 横2 | y10_ = y10_2 | y10_ = y20_2 |y20_ = 横2 | y20_ = y10_2 | y20_ = y20_2) and (縦 = 縦2 | 縦 = t10_2 | 縦 = t20_2 | t10_ = 縦2 | t10_ = t10_2 | t10_ = t20_2 | t20_ = 縦2 | t20_ = t10_2 | t20_ = t20_2):goto *hit //当たり判定 Ver5 end /////// 敵AI if ターン \ 7 ! 0{ if t10_ < 縦2 :縦2 = 縦2 - 10 if t10_ > t20_2 :縦2 = 縦2 + 10 if y10_ < 横2 :横2 = 横2 - 10 if y10_ > y20_2 :横2 = 横2 + 10 } y10_2 = 横2 + 10 y20_2 = 横2 + 20 t10_2 = 縦2 + 10 t20_2 = 縦2 + 20 redraw 1 pos 横,縦 gcopy 2,0,0,20,20 pos 横2,縦2 gcopy 1,0,0,20,20 redraw 2 //当たり判定 Ver5 if (横 = 横2 | 横 = y10_2 | 横 = y20_2 | y10_ = 横2 | y10_ = y10_2 | y10_ = y20_2 |y20_ = 横2 | y20_ = y10_2 | y20_ = y20_2) and (縦 = 縦2 | 縦 = t10_2 | 縦 = t20_2 | t10_ = 縦2 | t10_ = t10_2 | t10_ = t20_2 | t20_ = 縦2 | t20_ = t10_2 | t20_ = t20_2):goto *hit //当たり判定 Ver5 end wait 10 goto *ループ *hit dialog "当たりました" gosub *reset goto *ループ *reset 横 = 440 縦 = 40 横2 = 440 縦2 = 590 y10_ = 横 + 10 y20_ = 横 + 20 t10_ = 縦 + 10 t20_ = 縦 + 20 y10_2 = 横2 + 10 y20_2 = 横2 + 20 t10_2 = 縦2 + 10 t20_2 = 縦2 + 20 return
短くしたソースです。
キャラ、敵の表示は面倒を掛けますが、20x20pxのbmpを"cell.bmp" "cell2.bmp"と改名して、
同じフォルダに入れてください。

よろしくお願いします



たんす

リンク

2011/11/10(Thu) 21:50:11|NO.42916

これでどうでしょう。
if (abs(横-横2)<=20)and(abs(縦-縦2)<=20):goto *atari




kanahiron

リンク

2011/11/10(Thu) 22:12:10|NO.42918

たんす様、ありがとうございます!
調べたところ、absは整数を絶対値に変換ですか
abs(横-横2)は横から横2を引いた数になるのでしょうか…?
だとすると、abs(-20)でも同じはずですが、ダメでした
(abs(横-横2)<=20)は横から横2を引いた数を絶対値に変換し、20以下なら正ですよね?
横-横2=-20、-20の絶対値は20だから最終的には(20<=20)になってしまいます
うーん、理解できませんでした…
でも、質問の内容は解決させてもらったので、解決にします。
ひらまる様、れみはる様、ご回答有難うございました
そして、たんす様、有難うございました



Cookies

リンク

2011/11/10(Thu) 22:25:53|NO.42919

>abs(横-横2)は横から横2を引いた数になるのでしょうか…?
>だとすると、abs(-20)でも同じはずですが、ダメでした
>(abs(横-横2)<=20)は横から横2を引いた数を絶対値に変換し、20以下なら正ですよね?
>横-横2=-20、-20の絶対値は20だから最終的には(20<=20)になってしまいます

一行目について
abs(横-横2)は「横」と「横2」の大きい方から小さい方を引いた値と等しくなります。

一行目の仮定から、二行目の結論が得られる過程が全く分かりません。。。
「横-横2」が「-20」になるとなぜ断言できるのでしょうか。
実際試してみると、横-横2は0になったり10になったり-20になったりします。



kanahiron

リンク

2011/11/10(Thu) 22:38:38|NO.42920

Cookies様
うわぁ!完全にぼけていました
確かに変わりますね!



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