プレイ日記
nobu divine-creator
カードの組み合わせによりできる役を設定しようと思ったら、入力の仕方が分からない…となってしまいました…! 1.全く同じカードが複数になった場合の役 2.特定のカードが2枚~5枚揃った場合の役 …というような組み合わせを見つけ出すには、どのような命令を使って判定するのが良いのでしょうか?
8そうだね
プレイ済み
返信[1]
親投稿
nobu divine-creator
各カードには、全て別の定義番号が付いているので、同じイラストのカードが5枚ずつ存在しています! なので、同じカードが複数揃った場合は、重複していない番号が並んでいる状態です! 特定のカードの組み合わせも同様に重複しない番号だから、複雑な組み合わせパターンになってしまっています…orz。 役の案は大体できているのですが、表現の仕方が分からず困っています…(>д<)。
0そうだね
プレイ済み
返信[2]
親投稿
あきと SideBurnsM
トランプと枚数が違うのでうまく当てはめてもらいたいのですが、まずは手札と別の役判定に使う配列を用意します。 これはこのゲームで使用できるカードの全種類分必要です。 デッキに50枚、手札は5枚だとしてもカードの種類が30種類なら配列の大きさを30とします。 次に手札5枚をFOR分で回してどの種類を「何枚持っているか」を数え上げます。 この配列を見れば同じカードを持っているなら2や3が入っているのでポーカーでいう2ペアや3カードは判定できます。 画面を見ると同じ顔をしてるけど浮かんでる宝珠(?)が違うカードがあるみたいなのでその種類でも数え上げる配列を作れば同じ種類の役も判定できます。 トランプでは数字を数える配列とマークを数える配列を作って判定しました。マークの配列に5が入っていればそれだけでフラッシュと判定できます。 お
0そうだね
プレイ済み
返信[3]
親投稿
スー thanks_0u0
全種類同じカードが5枚ずつで、同じカードが連続して並べてあるなら、番号 DIV 5、で種類番号が出ると思いますよー( ´ ▽ ` )ノ なので、手札を種類番号に直してから、各役をIFで判定していくと良いかもしれません(・u・)
0そうだね
プレイ済み
返信[4]
親投稿
配列を使う方法も良いけど、 SPCHR 管理番号 OUT 変数名 でSPの定義番号がわかるので、 単純にまず左のカードを基準にして、 最初にそのカードの定義番号を調べます。 次にその右のカードの定義番号を調べます。 そしてまた右のカードの定義番号を… と繰り返します。それが終わったら 基準にするSPを また右にずらします。 そしてそのカードの定義番号を調べます。 これを繰り返すと 多分出来ると思います。
0そうだね
プレイ済み
返信[5]
親投稿
nobu divine-creator
あきとさん&スーさん、回答ありがとうございます♪ 各カードの並べ方を変えて定義番号を整理しやすくすれば、比較的ラクに判定できるようになるのですか?! トランプとは異なるため、数字やマークは存在しなく、キャラカード13種とスペルカード13種の合計26種類という、種類的には少なくなっていますが、全く同じデザインのカードを5枚ずつに増やしているため、カードの総数は130枚になっています! そして、その中から5枚を選び出し、役を判定して勝負することになります! 配列の使い方がなかなか理解できないので、すぐには上手くいかないと思いますが、とりあえずカードの並べ替えから試してみます♪
0そうだね
プレイ済み
返信[6]
親投稿
nobu divine-creator
そういえば、やうしゅさんの配列を使わない方法を読んで思い出したのですけど、配列を使わないで同じカードを5枚表示するために、定義番号を5倍に増やしていたのですが、配列を正しく使えたら、定義番号を増やさずに同じカードを5枚並べることができるのでしょうか? それが可能なら、定義番号を少なくすることができて、役を判定する際に複雑にならずに済むのですけど、可能なのでしょうか?
0そうだね
プレイ済み
返信[7]
親投稿
Hanzo rzsense
私なら、スーさんご提案のとおり、カードAは0~5、カードBは6~9・・・カードZは125~129、のように、直列に番号を振った上で、TE[5]のような配列に5枚の手札の番号を格納したあと「SORT TE」で手札を昇順に並べかえます。 例えば次のようにして、同じ種類のカードが何枚あるかが分かります。 FOR I=0 TO 3:A=1:FOR J=I+1 TO 4 IF(TE[I] DIV 5)==(TE[J] DIV 5)THEN A=A+1 ELSE IF A>1 THEN ?TE[I] DIV 5,A BREAK ENDIF NEXT J:NEXT I 同じ種類のカードが5枚あることの判定は、とても簡単で、次の条件を満足するか確認するだけです。 (TE[0] MOD 5)==0 && TE[4]==(TE[0]+4)
0そうだね
プレイ済み
返信[8]
親投稿
あきと SideBurnsM
カードに数値が無いのであればソートする意味もそんなにないかも。ソートは手札を表示してる時に使った方が見映えが良くなるのでは。(同じ種類のカードが近づく・キャラとスペルが分かれる)
0そうだね
プレイ済み
返信[9]
親投稿
スー thanks_0u0
定義番号が整理されていれば、種類番号に簡単に直せるので、判定は楽になると思いますー。 例えばカードが3種類x5枚ずつだとして、定義番号0から、aaaaabbbbbccccc、って並んでるとすると、5で割ったときの整数部分がそのまま種類になるので、定義番号 DIV 5で種類が出ます。aは0番、bは1番、cは2番、です( ´ ω ` ) それでどの種類が何枚あるかとか、どんな組み合わせになってるか、を判断していけば良いと思います。 配列を使えば定義番号は増やさないでできると思いますよー。今は定義番号がデッキの通し番号になってると思うのですけれど、配列にするとDECK[〜]の「〜」の部分が通し番号になって、配列の中身が定義番号になる感じです(・ω・) でも上 定義番号を種類番号に直すパターンの方が多分改修が少なくて楽そうです。
0そうだね
プレイ済み
返信[10]
親投稿
nobu divine-creator
Hanzoさん、具体例まで示していただき、ありがとうございます♪ …ということは、やはり定義番号を全カード分設定して、それを基に判定するという方法が一番良いのですね! カードの並び方はバラバラでも構わないかな?と思っているのですが、普通は自動的に並び変わるほうが良いのでしょうか?
0そうだね
プレイ済み
返信[11]
親投稿
Hanzo rzsense
私は以前、麻雀牌を拾ってきて役を作るゲームを作ったことがありまして(私のプロフィールの中に公開キーがございますので、よろしければお試しください)麻雀牌の管理手法として、スーさんご推奨の方法を採用しているため、今回もスーさん方式を推しましたが、カードに数字がないのなら、あきとさんご推奨の方法の方が筋道かも知れません。いずれにしても、既にお気づきのとおり、カードに番号を付けて整理することがキモになります。 カードの並び方、こればかりは好みに依拠しますね。ボタンを押したら並べ換える、などできればよいと思います。
1そうだね
プレイ済み
返信[12]
親投稿
nobu divine-creator
昨夜はカードの並び替えとそれに伴う番号の変更を行って力尽きたので、今朝から昨日のアドバイスを再読して実行しようとしましたが、数学力の無さからか疑問がいっぱいで、簡単には理解ができませんでした…orz。 Hanzoさんが書かれた式のFOR I=0 TO 3は何故3なのでしょうか? そして、FOR J=I+1 TO 4も、+1とするのは何故でしょうか?(4は3+1だからというのは分かりますけど…。) Hanzoさん以外の方でも、解説が可能な方はコメントをよろしくお願いします!
0そうだね
プレイ済み
返信[13]
親投稿
Hanzo rzsense
説明不足、恐縮です。 まず、カードの番号付けはスーさん方式を採用し、5枚の手札はSORTで並べ換えられていることが前提です。 私の提案では、I番目のカードとJ番目のカードの種類が同じなら、枚数Aをインクリメント(1増やす)し、違っていれば、カードの種類と、今まで計数した枚数Aを表示します。 J=I+1とする理由は、上述のとおり、I番目とJ番目の手札を比較していることから、I==Jになると同じ手札を比較することになり、意味がないからです。 また、I==4だと、J=I+1すなわちJ==5となり、存在しない5番目(0~4番目と数えるので)の手札と比較することになるため、Iの変域を0~3としています。
0そうだね
プレイ済み
返信[14]
親投稿
nobu divine-creator
なるほど、そういう理由でしたか♪ 私の浅はかな予想では、5枚全てが同じになる場合を別式にしているため、上の式では4枚同じまでとしているのかと勘違いしていました(苦笑)!
0そうだね
プレイ済み
返信[15]
親投稿
nobu divine-creator
度々すみませんが、「配列に手札の番号を格納する」という方法が分かりません…。 TE[5]という配列に、5枚分のカード番号を入れるには、どのような書き方をすれば良いのでしょうか? ちなみに、カードをランダムで選ばせるために、M1=RND(130)という式を使い、M1~M5と繰り返すことで5枚のカードを選んでいます!
0そうだね
プレイ済み
返信[16]
親投稿
スー thanks_0u0
単純に、 FOR I=0TO 4 TE[I]=RND(130) NEXT で良いのではないでしょうかー( ´ ω ` ) でもこれだと同じカード番号が入ることがあるので、自分と相手の札で5枚以上同じカードが入ったりすると思います(・ω・)
0そうだね
プレイ済み
返信[17]
親投稿
nobu divine-creator
スーさん、なるほどFORを使って5回分繰り返せば良かったのですね♪ そうなんです!その方法だと同じ番号が選ばれてしまうことがあるので、その対策としてIF M5==M1~M4 THENを使って、同じ番号だったら選び直すという方式にしていました♪ スーさんが書いてくれたFORを使って繰り返す場合に、同じ番号だったら選び直しとすることも可能でしょうか? 可能な場合、どのような命令を追加したら良いのでしょうか?
0そうだね
プレイ済み
返信[18]
親投稿
スー thanks_0u0
FORの中にFORを入れる感じになると思いますー。内側のFORのカウンタ変数は外側のFORとは別の変数にしてください( ´ ω ` ) 内側を何回繰り返すかっていうと、Iが今の位置なので、被りを調べるのは0〜今-1までです。(I=0のときは0〜-1までになるので、自動で被りチェックは飛ばされます) 書くとしたら、FOR J=0TO I-1、みたいな感じです。 それで、もし被ったら外側のFORの同じ回をやり直します。外側のFORの回数を管理しているのはIなので、I=I-1、でもう一度同じ回をやり直せると思います( ´ ▽ ` )ノ
0そうだね
プレイ済み
返信[19]
親投稿
nobu divine-creator
他の人のトピックを読んでいたら、要素数についての話が書かれていて、配列の変数に直接数字を入れることもできる!とあり、それを参考に考えてみたら、TE[I]の代わりにTE[0]~TE[4]を使えば良いのかな?と思い付きました! これまでM1~M5としていた部分をそれに変更したら、カードを表示することは上手くいきましたが、同じカードが選ばれているのかを判定する時にも、それで大丈夫なのでしょうか? それとも、スーさんが書いてくれた二重のFORを使ったほうが良いのでしょうか?
0そうだね
プレイ済み
返信[20]
親投稿
スー thanks_0u0
どちらでも同じことをしてるのだと思うので大丈夫です!(・u・) ただ単に、IFや代入を沢山並べて書くのが面倒で読みにくいからFORでまとめる人が多いだけで、一つ一つ書いてもちゃんと動くと思いますよ(*´∨`*)ノ
0そうだね
プレイ済み
返信[21]
親投稿
nobu divine-creator
それで、並べ替えについてなのですが、SORT 0,5,TEと入力すれば良いのでしょうか? カードを選んだ後に、その文を入力すれば、昇順に並び替えが行われるわけですよね?
0そうだね
プレイ済み
返信[22]
親投稿
あきと SideBurnsM
nobuさんは手札5枚だけでカードを決めようとしていますが途中の説明で「カードは全部で130枚あり、26種類のカードが5枚ずつ存在」と説明しています。 最初の5枚の事だけ考えるとあと125枚とのチェックが大変になるので最初にすべて用意してしまった方が楽になります。 DIM ALLCARD[130] FOR I=0 TO 129 :ALLCARD[I]=I:NEXT FOR I=0 TO 129 SWAP CARDS[I],CARDS[RND(130)] NEXT これで0~129までの数字が重複なくバラバラの順番で格納されます。
0そうだね
プレイ済み
返信[23]
親投稿
あきと SideBurnsM
すいません。ALLCARDを途中からCARDSと書いてしまいました。 一回目のFOR文で順番に数字を一つずつ格納したあと2回目のFORでランダムに中身を入れ替えています。 (本当はもっといい方法がありますがここではシンプルにしました)
0そうだね
プレイ済み
返信[24]
親投稿
nobu divine-creator
あきとさん、ありがとうございます♪ 初心者の私にとっては、できるだけシンプルな方法のほうが理解しやすいので助かります♪ 難しい方法については、それが理解できるレベルになってから習得したいと思います!
0そうだね
プレイ済み
返信[25]
親投稿
Hanzo rzsense
申し訳ございません! 私が前回提示したプログラムは誤りがございました。 正しくは、添付10行目のとおりです。 なお、添付10行目以前の部分で、130枚のカードをシャッフルし、先頭の5枚をTE[]に格納しておりますので、併せてご参考ください。
0そうだね
プレイ済み
返信[26]
親投稿
nobu divine-creator
そういえば、あきとさんのコメントにより思い出しましたが、何度もカードを交換する必要があったのですね…! 役を判定することにばかり気を取られていたため、不要と思われるカードを選んで交換するという操作をできるようにしなければならないことを忘れていました…(苦笑)! でも、合計130枚としたのはカードの総数をそうしたかったからではなく、役を作るために同じカードを複数にしなければならなかったため、各カードを5枚くらいにしておけば良いかな?と考えただけなんですよね…。 実物のトランプなどとは違うので、カードの総数を制限しなくても問題ないので、カードの交換をする時に残りのカードから選ぶのでなくても良いと思っています♪ つまり、カードの定義上は26種130枚ですが、使えるカードの枚数は無限でも良いんですよね…。
0そうだね
プレイ済み
返信[27]
親投稿
あきと SideBurnsM
>使えるカードは無限でもいい カードはいくらでも交換できるから乱数で次のカードを決めれば良いという風に考えてるかもしれませんが…。 上の方法で130枚を先に決めておけば「必ず」130枚の中に5枚は同じカードが出ますが、その場の乱数で選ぶと「延々と」欲しいカードが出ないこともあるので注意が必要です。
0そうだね
プレイ済み
返信[28]
親投稿
nobu divine-creator
そうですね…。ランダムに選ばれることで、どのカードが出るかは完全な運次第になるため、ゲームバランスが問題になる可能性があるとは考えていました…。 実は、対戦相手のカードには複数のパターンを用意して、段々と強くなるようにしようと考えていました!プレイヤーは完全なランダムですけど、敵キャラは予め決まった弱い手と強い手から選ばれるという仕組みで、偶然に弱い手が選ばれた時はラッキーとなり、勝ちやすくなるという感じです♪ 後から出てくる敵のほうが弱いと変だと思うので、そういう感じに設定すれば良いと考えましたが、プレイヤーの役が揃わな過ぎると全く勝てない…となってしまうので、その場合はカードの総数を制限して揃いやすくしたほうが良いのかな?と考えています。 カードの総数を制限した場合のカード交換は、残りのカードから選ばれることになりますけど、それを効率良く設定するには、どのようにすれば良いのでしょうか?
0そうだね
プレイ済み
返信[29]
親投稿
あきと SideBurnsM
>対戦相手の難易度に段階を持たせたい nobuさんが考えているカードゲームがどういうプレイをするものなのか分からないので難易度に関してはまだ考えずにゲームのプレイの流れと判定をを作っていった方がいいのではないでしょうか。 カードが130枚あるゲームという事しか分からないので、まずは同一条件でプレイできるようになってから難易度を考えても遅くないと思います。
1そうだね
プレイ済み
返信[30]
親投稿
nobu divine-creator
そうですね♪役の判定をどうにかしたいと思っていましたが、まだ全体の流れが入力できていないので、一通り入力してみてから、細かい調整などを行うようにしようと思います! 大体の流れは考えてあるので、それを形にして問題点や疑問点を再び質問したいと思います♪
2そうだね
プレイ済み
返信[31]
親投稿
nobu divine-creator
カードの交換を可能にしたいと思っていますが、どのようにしたら良いのか?困ってしまいました…。 まず、カードの選択はタッチ操作が一番良いと思いますけど、TOUCH OUT TM,TX,TYという式でタッチした座標を取得できるのですか?(TM,TX,TYは数値でなく、このままで良いのですか?) 次に、タッチされたカードを交換となりますが、条件文でタッチされた範囲を指定することになるのでしょうか?その場合、IF 0>TX<64 AND 144>TY<240 という感じにすれば良いのでしょうか?(範囲指定を使ったことがないので、正しいのか分かりません…。) それとも、別の方法のほうが良いのでしょうか?
0そうだね
プレイ済み
返信[32]
親投稿
スー thanks_0u0
TOUCHのTMとかは、数値を受け取る変数を書きます。タッチしているフレーム数と、X座標Y座標を受け取る変数です。 場所の判断は、IF文かSPHITが良いと思います。 IF文の場合はnobuさんの方法で良いのですけれど、書き方は多分、IF 0<TX&&TX<64&&144<TY&&TY<240THEN、です。これで、TXが0より大きくて64より小さい、かつTYが144より大きくて240より小さいとき、です。 ANDはビットの計算に使うものなので、「かつ」の場合は&&を使う感じです(・ω・) SPHITの場合は、各ボタン用のSPとタッチ用の1x1ドットの透明なSPを作ってSPCOL、透明SPをTOUCHで取得した座標にSPOFSで移動させてから、SPHITです。 ボタンが押されていれば、当たったボタンの番号がわかるので、それに応じて処理をします( ´ ▽ ` )ノ
0そうだね
プレイ済み
返信[33]
親投稿
nobu divine-creator
スーさん、ありがとうございます♪ 私はANDと&&の違いを正しく理解できていませんでした…Σ(゚Д゚;)! 3つ以上の条件判断は&&を繰り返せば良かったんですね♪ SPHITのほうは未知のことが多いので、とりあえずはIFの範囲指定を使ってみようと思います!
1そうだね
プレイ済み
返信[34]
親投稿
nobu divine-creator
うわぁΣ(゚Д゚)!大事なことを見落としていました! タッチ操作…ということは、下画面で入力でしたね…。今まで使ったことがなかったので、つい忘れていましたけど、上画面と下画面ではサイズが違うので、上の質問で書いた座標では間違いになるのですよね?! …というか、そもそも下画面を使ったことがなかったので、下画面の使い方がハッキリ分かっていませんでした…。 XSCREEN 2とDISPLAY 1で下画面が使えるようになる事は知っていましたが、それだけでタッチ操作ができるわけじゃないですよね? 下画面の座標を正しく入力しないとダメだと思うのですけど、下画面の座標ってどうやって知ることができるのでしょうか?
0そうだね
プレイ済み
返信[35]
親投稿
スー thanks_0u0
下画面の座標も上画面の座標もあんまり変わらないと思いますよー(・д・) 下画面はちょっと幅が狭いので、0〜399でなくて、0〜319になります。 TOUCH命令は何もしなくても下画面の座標を返すので、あまり気にしなくても大丈夫だと思います。 GCOPYやSP,BGなどを下画面に置く場合はDISPLAY命令で画面を切り替えてくださいませ。DISPLAY 0が上、DISPLAY 1が下です( ´ ω ` )
0そうだね
プレイ済み
返信[36]
親投稿
nobu divine-creator
スーさんの仰る通り上画面と下画面の差はX軸が80違うだけでY軸は同じなので、サイズの問題はありませんでした♪ しかし、DISPLAY 1とGCOPYを使って出せた画面は予想と違って現在表示されている画面がそっくりそのままコピーされるわけじゃなかったのですね…! 上画面と同じように下画面を表示するには、全く同じ命令を入力しないと無理ということですか? 全く同じにできなくても構わないのですが、知識として尋ねてみました。 それと、TOUCHの時間をTM>=1にして、IF文の最初に追加してみたのですが、これで良いのでしょうか?
0そうだね
プレイ済み
返信[37]
親投稿
スー thanks_0u0
GCOPYはグラフィック面をコピーする命令なので、SPやBG、BACKCOLORやFADEはコピーされないです(・д・) 上画面と下画面に同じものを表示させたい場合は、FORで繰り返すと良いと思います。ACLSのヘルプに載ってるような形です( ´ ▽ ` )ノ 単に今まで上画面に表示していたものを下画面に移すなら、色々な表示命令の前に一度DISPLAY 1をするだけで良いと思います。 TOUCHはそれで良いと思います!タッチした瞬間1度だけならTM==1、タッチしている間ずっとならTM>0、みたいな感じです。
0そうだね
プレイ済み
返信[38]
親投稿
XDaringDoX GamerXDaringDoX
what is the key to this game? i'm a huge fan of touhou and have been teaching myself how to read Japanese so i can play it and understand what the characters are saying.
0そうだね
未プレイ
返信[39]
親投稿
nobu divine-creator
Sorry! This game is still unfinished. It is after January that this game is completed.
0そうだね
プレイ済み
返信[40]
親投稿
XDaringDoX GamerXDaringDoX
i look foward to this.
0そうだね
未プレイ