プレイ日記
nobu divine-creator
タッチ操作でカードを交換することまでは何とかできるようになりましたが、カードの組み合わせでできる役の判定がどうにも上手くできません! 使用するカードの説明と設定したい役を書くので、どのようにしたら良いか?アドバイスをお願いします。 カードには0~129の番号が設定されていて、0~4が全く同じ絵柄で、それ以降も5枚ずつが同じカードになります! つまり、カードの種類としては26種ということになりますが、同じカードが5枚ずつ存在しています。 それらのカードが重複せずに5枚ずつ配られた状態で、決められた役を作ります! 役の種類には、ペア・スリー・フォー・ファイブ・コンビ・トリオ・カルテット・クインテットがあり、全く同じ絵柄のカードが2~5枚揃えば、ペア~ファイブの役となります! それに対して、コンビ~クインテットは、ある特定のカードの組み合わせが2~5枚揃うことでできる役です♪
5そうだね
プレイ済み
返信[1]
親投稿
nobu divine-creator
添付した画像に入力してあるのは、以前にHanzoさんから教わった「同じカードが何枚含まれているのか?を調べるための命令文」なのですが、私の理解力不足により、どうしてこうなるのか?が不明で、どう使用すれば良いのか?も分かっていません…。 それぞれの役を判定するために必要な命令の流れが分からないので、具体的に何をどうすれば判定ができるのか?を詳しく教えてください! 条件判定の理解力が乏しいので、なかなか理解できないとは思いますが、見捨てずに協力していただけるとありがたいです♪
0そうだね
プレイ済み
返信[2]
親投稿
れい rei-nntnd
普通にすべての役をIFで。 sortしてmod 5してifしたらそんなパターンないだろ。 はい今日30コメ。 わーいぃ
0そうだね
プレイ済み
返信[3]
親投稿
nobu divine-creator
一応IFで可能だろう…と入力してみたのですけど、やっていくうちに見落としみたいなのがあることに気づいて、訳の分からない感じになってしまいました…orz。 …と書いたものの、コメントを使い果たしたれいさんにはこれ以上訊けないという…(>_<)。 …なので、別のコメント数が残っている方はコメントをよろしくお願いします<m(_ _)m>。
0そうだね
プレイ済み
返信[4]
親投稿
おかっぺ Japanese_WASABI
えっと、配列の中身をsort(昇順で並べかえる)命令があって、全てのカードを昇順で並べると、判断がしやすいよね。 カードには番号がふってあるけど、5で割った商が同じなら、同じ絵柄のカードと判断できる。(れいさんは mod(余り)って書いてるけど、div(商)の間違いだと思います。) 例えば[4,64,0,22,1]と言う配列があって、これをsortすると[0,1,4,22,64]と言う配列になる。 個々にdiv 5した値を比較すると0,0,0,4,12となり、同じ数字が3枚あるから、スリーカードと判断できるよ、と言う事だと思います。 sortはしなくても判断できるけど、sortしておくとロジックが簡単に書けますね。
0そうだね
プレイ済み
返信[5]
親投稿
ish owlis1
ポーカーの役判定が使えるでしょうか。 実は、以前、ダイスを使ったポーカー風のゲームを作りかけた事があり、その際にポーカーの役を判定するロジックを調査、実装しました。 もし良ければですが、ご参考になるようでしたら公開します。 なお、あまり効率良く無いと思います。
0そうだね
プレイ済み
返信[6]
親投稿
DIM C[130],K[26] ' カードを引いてC[n]にフラグを格納 WHILE I!=5 V=RND(130) IF C[V]==0 THEN C[V]=1:I=I+1 WEND ' K[n]に同じカードの枚数を格納 FOR I=0 TO 129 IF C[I]==1 THEN K[I DIV 5]=K[I DIV 5]+1 NEXT ' K[n]を見てカードが1枚以上あるかチェック FOR I=0 TO 25 IF K[I]!=0 THEN ?K[I], NEXT とりあえずこれだけ。何回か実行したら2がチラホラ出るように。
0そうだね
プレイ済み
返信[7]
親投稿
nobu divine-creator
おかっぺさん&ishさん、追加の情報をありがとうございます♪ 以前の投稿で、カードの並べ替えと5で割るという方法を教えていただいたのですが、何故それで判定できるのか?までは理解できていませんでした…。 でも、その時はまだタッチ操作などもできていなかったため、とりあえず役の判定は後回しにしていました! ようやく、役の判定を考える所まで進みましたが、自分1人で考えたのでは混乱してしまいました…orz。 ポーカーとは役の種類が異なるのですけど、応用が可能ならば教えていただけるとありがたいです♪
0そうだね
プレイ済み
返信[8]
親投稿
>>ishさん あ、ポーカーダイスでしたら作った事ありますよ。キー5A7NW3H4 ロジックは9なら1、10なら10、Jなら100、Qなら1000、Kなら10000、Aなら100000を足して合計に3と2があればフルハウスとかいう落ち物パズルに近い作りです。
0そうだね
プレイ済み
返信[9]
親投稿
ish owlis1
NACN43KJ 5個のダイスを降って役を作る「クロンダイク」というゲームがあるのですが、それに似た役を判定する関数です。 1. 5個のダイスをソート 2. 同じダイスが無いか判定し0〜2のフラグを立てる。 3. 役を判定 フラグは「同じダイスがなかったら0」「1つ目の同じダイスで1」「2番目の同じダイスで2」が立ちます。 具体例 役なし[00000] 5カード[11111] フルハウス[11222]または[11122]
0そうだね
プレイ済み
返信[10]
親投稿
Hanzo rzsense
私が以前説明した方法は、おかっぺBEERさんのおっしゃるとおりです。実は、5枚のカードの組み合わせは、同じカードを同じアルファベットで表すと「ABCDE」「AABCD」「ABBCD」「ABCCD」「ABCDD」「AABBC」「AABCC」「ABBCC」「AABBB」「AAABB」「AAABC」「ABBBC」「ABCCC」「AAAAB」「ABBBB」「AAAAA」の16パターンしかありません。このくらいなら、IF文で1つ1つ判定するのもアリかなって気になりませんか?しかしこれはsortをしているからここまで絞り込めるのであって、sortしないと、例えば「AABCD」が「ABCDA」「ABACD」などと同じ組み合わせであることを別途判定する必要が生じ、大変です。sortを推奨するのは、かような理由によります。
0そうだね
プレイ済み
返信[11]
親投稿
あきと SideBurnsM
みけらんジェロさんの考え方に似てます。 これで3カードから5カードまで判定できます DIM TE[5] '手札 DIM COUNT[26] '種類毎の枚数 '26種類のカード毎に数える FOR I=0 TO 125: INC COUNT[TE[I] DIV 5]:NEXT R=JUDGE345CARD(5) '5カードか判定 R=JUDGE345CARD(4) '4カードか判定 R=JUDGE345CARD(3) '3カードか判定 DEF JUDGE345CARD( NUM ) FOR I=0 TO 25 IF COUNT[I]=NUM THEN RETURN I NEXT RETURN -1 END
0そうだね
プレイ済み
返信[12]
親投稿
あきと SideBurnsM
5枚のカードから3・4・5カードは一つしか成立しませんが、2枚ペアの場合はペアが2つ出来上がることがあるのでnobuさんにどう扱うか考えてもらう必要がありそうです。 麻雀のように役が複数成立するゲームなのか、ポーカーのように必ず一つの役に絞られるのか決めないといけないかなと。 たとえばトリオとペアも同居したらどうする?みたいなことになると思います。
0そうだね
プレイ済み
返信[13]
親投稿
あきと SideBurnsM
今回のケースで言うとソートじゃなくて数えあげの方がFOR文も2重にならないし楽なんじゃないのかなと思います。 トリオの判定もC1C2C3に指定のかーどの種類を渡してやる関数でいいのかなと思うんですが DEF JUDGECOMBI(C1,C2,C3) IF COUNT[C1]!=0 &&COUNT[C2]!=0&&COUNT[C3]!=0 THEN RETURN 1 RETURN-1 END
0そうだね
プレイ済み
返信[14]
親投稿
nobu divine-creator
皆さん、具体例や追加の情報をありがとうございます♪ まだ全てを理解できたわけではありませんけど、以前の質問時に不明だった点が、ようやく分かってきました♪ れいさんの「パターンが少ないだろ?」というコメントの理由は、Hanzoさんのパターン解説のおかげで納得できました!(また、SORTすることの重要性もそれで分かりました♪) ペアが2つできた場合は、ツーペアという役ではなく、ワンペア分の得点が倍になるだけで良いかな?と考えていますが、得点については調整することになると思うので、まずは各役の判定が正しく行われるようにすることを目指したいと思います! それができたら、配点などについて考えることになります。
0そうだね
プレイ済み
返信[15]
親投稿
Hanzo rzsense
カードのパターンが、16パターンのうちいずれに該当するかを調べる、添付のような、ゴリ押しながらも素直なやり方もございますので、ご参考まで。
1そうだね
プレイ済み
返信[16]
親投稿
Godot orz_127
手札(要素数5でカード番号0~129が入っている)配列Tがあるとする。 カードの種類分(要素数26)の配列Kを用意。 配列Tをループして処理。 DIVした結果Rで、K[R]をカウントアップ。(どの種類のカードが何枚あるかの確認) 6要素の配列Cを用意。 配列Kをループ処理。 C[K[n]]をカウントアップ。 (本当はK[n]==0のときは数えなくても良いがw) C[5]が1なら5カード、C[4]が1なら4カード、C[3]が1かつC[2]が0なら3カード、C[3]が0かつC[2]が1ならワンペア、C[2]が2なら、ツーペア、C[3]が1かつC[2]が1ならフルハウス。 コンビ~は配列KをIF文で確認して、かな? 多分こんな感じで。
0そうだね
プレイ済み
返信[17]
親投稿
れい rei-nntnd
DIVだったごめんなちゃい
0そうだね
プレイ済み
返信[18]
親投稿
nobu divine-creator
れいさん、大丈夫です♪でも、間違えるなんて珍しいですね! Hanzoさんが最新のコメントで書かれた方法は、一度に全パターンを判定できる面白い方法ですね♪(初めて見る形式でした!) この方法を上手く使えれば判定しやすそうですが、例文だとDATAに具体的な数字が入力されています。しかし、ランダムに選ばれる数字にしなければならないので、そこをどのように変えれば良いのでしょうか?
0そうだね
プレイ済み
返信[19]
親投稿
れい rei-nntnd
Hanzo氏のコードもっかいよく読んでみたらいいんじゃね
0そうだね
プレイ済み
返信[20]
親投稿
Hanzo rzsense
昨日提示したプログラムに、130枚のカードからランダムに5枚を抜いて、手札TEに格納する部分を追加してみました。添付の4~7行目のFORループがその部分で、以前れいさんに教えていただいたFisher-Yatesアルゴリズムというものを応用しています。なお、添付では、まず130枚から5枚を抜いて役判定し、次は残りの125枚から5枚を抜いて・・・というのを、残りのカードがなくなるまで(つまり26回)繰り返します。
0そうだね
プレイ済み
返信[21]
親投稿
nobu divine-creator
Hanzoさんにいくつかの質問があります! このプログラムでは5枚ずつを取り出し、役の判定を繰り返していますが、役の判定をする部分を離した場所にしても大丈夫なのでしょうか? この投稿前までに作ってあった流れでは、まず手札をランダムな状態で配り、プレイヤーは交換したいカードをタッチ操作で交換します!そして、納得いくまで交換したら、役の判定となります♪ つまり、間にカードを交換するパートがあるため、最初に配られたカードの内容は変わる可能性が大です! 役の判定には、並び替えと判定が必要になりますが、プレイヤーが自由に交換した後のカードの並び替えと判定を行うには、そのプログラムをどのように変更して、使用すれば良いのでしょうか? 役の判定はプレイヤーのカードについてのみで、対戦相手のカードは決まっているので、判定の必要がありません!
0そうだね
プレイ済み
返信[22]
親投稿
Hanzo rzsense
ご質問に回答致します。まず、カードを配る部分と、役の判定部分を離すことは、もちろんOKです。私のプログラムでは、5枚のカードをランダムに配る部分が4~7行目で、役判定が8行目の「SORT TE」以降から17行目までの部分です。ちなみにRSは残りカード数を表し、5枚抜くごとに、8行目で5ずつ減らしています。カードの交換などは、役判定開始前(SORT TEの前)に行えばよいです。おそらくnobuさんは、カードの交換時に、TE配列変数に交換カードの数字を代入するときのルールを知りたいのだと思いますが、それこそ好きなように代入していただいて結構です。どんな風に数字を交換しようと、SORT TEの実行時点で、手配の配列は先述の16通りのいずれかに、必ずなりますので、必ず判定できます。唯一の注意事項は、同じ数字がダブらないこと、これだけです。
0そうだね
プレイ済み
返信[23]
親投稿
Aidan Aidan290
WHAT IS THIS SOURCERY?!?!
1そうだね
未プレイ
返信[24]
親投稿
nobu divine-creator
This is not sorcery but programing.
2そうだね
プレイ済み
返信[25]
親投稿
Hanzo rzsense
The original poster of this thread is making his original card game with PETIT COMPUTER III which is BASIC interpreter for Nintendo 3DS. Currently he is worried how to distribute cards and judge the rank. The attached photo is not sourcery. It is sample program for PETIT COMPUTER III to judge the rank.
1そうだね
プレイ済み
返信[26]
親投稿
Aidan Aidan290
Thank you.
0そうだね
未プレイ
返信[27]
親投稿
nobu divine-creator
Hanzoさん、的確な説明もありがとうございます♪ To Aidan Probably English version of Petitcom No.3 will be released soon.
1そうだね
プレイ済み
返信[28]
親投稿
Hanzo rzsense
ところでnobuさん、既出であれば恐縮ですが、今一度おさらいをさせてください。本作は、 ①プレイヤーと、何人か分かりませんが対戦相手がいるゲーム ②対戦相手のカード配列は、はじめから決まっている ここまでは分かりました。 問題は次の③④ですが、これらが正しいかどうか、教えてください。 ③プレイヤーは、手札の一部または全部を、好きなだけ交換できるが、一度捨てたカードを再び手札に戻すことはできない ④26種130枚のカードは、次のABCDのうちいずれかに、必ず属する →A.プレイヤーの手札 B.対戦相手の手札 C.プレイヤーの捨て札 D.プレイヤーの手札交換用の山 いかんせん私も説明ベタなもので、もどかしい思いをさせてしまいまして恐縮です。分からなければ何度でもご質問願います。必ずしも速効でレスを返せるとは限りませんが、なるはやで回答するよう努めます。
1そうだね
プレイ済み
返信[29]
親投稿
nobu divine-creator
1.対戦相手は1ステージ1人ずつで、勝てば次のステージへ進み、負けた場合は止めるかコンティニューかを選ぶ。(コンティニューはそのステージからです♪) 2.対戦相手のカードには、いくつかのパターンを用意しようとして、とりあえず2パターン入力済みです♪ 3.それについては、私は一度捨てたカードが戻ってくるのでも良いかな?と考えていますが、何か不都合が生じる可能性があるのならば、残りカードが無くなるまで…というのでも構いません。(そういえば、自由に何度でも交換すると、残りが0枚になってしまいますね!) 4.カードの絵柄は26種類なので、同じ絵柄が5枚あっても、カード番号は重複できないので、必ずABCDのいずれかになるはずです。(そういえば、同じ絵柄が5枚だと、対戦相手のカードにあるカードを5枚にすることはできませんね!)
1そうだね
プレイ済み
返信[30]
親投稿
nobu divine-creator
おかげさまで、同じ絵柄のカードが何枚含まれるかの判定はできましたが、ある特定のカードが何枚含まれるかの判定は見当が付きません…。 一見バラバラに見える組み合わせ(ノーペア)でも、例えば姉妹キャラが揃えばコンビという役になります♪同様に、関わりのあるキャラが3人揃えばトリオとなり、4人でカルテット、5人でクインテットまで成立することになります♪ 特定のキャラが2~5人揃う事でできる役なので、手札の中にどのキャラカード番号が含まれているか?の判定になるというのは分かりますが、どういう条件にすれば良いのか?は思い付きません…orz。
1そうだね
プレイ済み
返信[31]
親投稿
Hanzo rzsense
ルールのご説明ありがとうございます。概ね理解しました。ご教示いただいたルールにのっとって、どのような流れで処理をすればよいか、なるべく早くその例を示したいと思います。 ところで、コンビ~クインテッドの意味を今はじめて理解しました。どのように判定すればよいか、ですが、カードの種類は、0~25の番号で表されるはずなので、まず、どの番号の組み合わせが「姉妹」になるのか、それを明らかにしましょう。 私の考えでは、0~4、5~9…のように、5種類ずつが姉妹の組み合わせになるのかな、と思いましたが、カードの種類は26種類なので、それだと1種類仲間外れになってしまいますね…
1そうだね
プレイ済み
返信[32]
親投稿
nobu divine-creator
特殊役は特定の組み合わせのみが該当する役なので、キャラによって多くのパターンに使えるキャラとそうでないキャラが存在するように考えていました! 例えば、コンビの場合なら、姉妹or主人公or主従or友人というような組み合わせで成立するので、友人という組み合わせは多数存在しますが、姉妹や主人公は1組だけです!(コンビを組める人数が多いキャラほど使い勝手が良いと言えますが、コンビよりもトリオなどのほうが加点が多いので、クインテットを作れるキャラが一番有利に…?!) そのような感じで、トリオ以上ができる組み合わせも限られてくるから、特殊役の設定は厄介ですね…。 設定自体は、5枚の中に何番~何番までのカードと何番~何番のカードが含まれているか?調べるという仕組みになるわけですが、成立する組み合わせ全てを設定する必要があるので、IF文を多数並べることになるのでしょうか?
1そうだね
プレイ済み
返信[33]
親投稿
nobu divine-creator
あっ!そういえば、判定は5で割った数字で行われるから、各カードは範囲ではなく1つの数字で表されるんでしたか?! そうすると、コンビの場合なら0番と1番とかになるわけですか? それじゃあ、クインテットは7番~11番とか? でも、並んでいない複数の数字の組み合わせもあるので、トリオ以上の設定はやはり難しいですね…。
1そうだね
プレイ済み
返信[34]
親投稿
nobu divine-creator
いろいろと調べてみましたが、5で割った配列変数の中に何種類かの数字が含まれているかを見つけるための命令文の形が分かりません…! 配列を5で割るのはできても、「その中に特定の数字が含まれているか?」を調べる段階で、行き詰ってしまっています…orz。 何をどう使えば良いのか?全く見当が付きません…。
1そうだね
プレイ済み
返信[35]
親投稿
Hanzo rzsense
簡単なサンプルプログラムを作ってみました。「7KNN23K4」をお試しください。このサンプルでは、対戦相手の手札、自分の手札、場のカード全てWL配列変数で管理しています。また、1回につき1枚だけですが、任意の手札を好きなだけ交換できます。プログラム中にいろいろコメントを入れているので、ご一読ください。分からなければ遠慮なくご質問ください。 ところで、コンビ~クインテット判定の方法は、IF文の羅列で判定するとしても、まず役の組み合わせのパターンをはっきりさせることが先決です。まずこれを表・図などにまとめて整理してみましょう。
1そうだね
プレイ済み
返信[36]
親投稿
YADOKARE gaku1006
nobuさん僕の質問に答えてくれてありがとうございました!
1そうだね
未プレイ
返信[37]
親投稿
nobu divine-creator
YADOKAREさん、お役に立てたなら幸いです♪ Hanzoさん、サンプルプログラム凄いですねΣ(゚Д゚)! まず最初に驚いたのは、SWAPの使い方でした!変数を入れ替える命令だから、配列変数も入れ替えられるのは当然なのかもしれませんけど、SWAP命令自体を知ったのが最近なので、そのような使い方ができることに吃驚しました! 自分で考えた方法では、ただの変数に番号を入力していましたが、そちらに変更してみました♪ カードの交換もスムーズに行えて凄いと思いましたが、すでにタッチ操作で交換する方法にしていたため、できればタッチしたカードを交換するようにしたいと思っています。
1そうだね
プレイ済み
返信[38]
親投稿
Hanzo rzsense
サンプルプログラムはしばらくしたら消去しますが、ご容赦ください。サンプルプログラムの先頭の「RS=130」は「RS=120」の誤りです。すみません。XCARD関数は割と使いやすいと思いますので、ぜひご活用ください。SWAP命令は便利です。最初に重複しない数列を作っておけば、それを何度どのようにSWAPしようと、数字が重複することは絶対にありませんからね。 ところで、特殊役判定は、添付のDATAような表を作っておくと、やりやすくなります。表の意味や、表を使った実際の役判定の方法等、わからなければご質問ください。逆に、特殊役に対する私の解釈に誤りがあれば、ご指摘ください。
1そうだね
プレイ済み
返信[39]
親投稿
nobu divine-creator
なるほど!SWAP命令にはそのような秘密(?)もあったのですか!重複が起こらないというのはありがたいですね♪ 間違いについては、エラーの原因がそれだったのかもしれませんが、気付いていませんでした…。 特殊役の判定は、確かにそのような表にすれば、分かりやすいですね♪ それを参考にして考えてみます!
1そうだね
プレイ済み
返信[40]
親投稿
Hanzo rzsense
いえ、秘密と言うほどのことではなく、SWAPは文字どおり「交換」するだけで、新しい数字を「代入」するわけではないので、元の数列が重複していない限り、SWAPしたあとの数列も重複しない、ただそれだけのことですよ。トランプをいくらシャッフルしても、同じカードが2枚になったりしませんよね。 先ほど提案した、判定のための表をつくる件ですが、何よりご自身のアイディアを整理することが重要ですので、ぜひ実施することをお勧めします。
1そうだね
プレイ済み
返信[41]
親投稿
nobu divine-creator
特殊役の組み合わせについて研究した結果、添付した画像が表示されるようになりましたが、これをどう点数計算に繋げたら良いのでしょうか?
1そうだね
プレイ済み
返信[42]
親投稿
Hanzo rzsense
どうやら、DATAが私の考えと違うようです。(私の考えを説明していないので当然ですが)私の考えは、26種類のカード全てについて「種族」と「種族番号」をDATAで割り当てるというものです。例えば、私のDATAでは、カード種類番号0と1が「主人公」という「種族」に属し、かつ「主人公0番」という「種族番号」を有します。主人公は1組しかいないと聞いているので、カード種類番号0と1以外は全て「主人公」に属さないことを表す「X」としています。「トリオ」なら「トリオ0~3番」がそれぞれ3人ずつ、計12人います。「友達」の「種族番号」は「友達グループ番号」のようなイメージです。 nobuさんのDATA文がどのようなもので、DATAの意味を教えていただけると、アドバイスできると思います。(全てアルファベットで書かれていると拝察しますが・・・)
1そうだね
プレイ済み
返信[43]
親投稿
nobu divine-creator
こちらはサンプルプログラムのうち、特殊役のみを試した結果ですが、このように表示されるのは正しいのでしょうか? 上のコメントに添付した画像は、普通役の判定に続けて特殊役の判定を入力した場合でしたが、そうするとあのような結果になります。 本来は、どのような結果が出て、それをどう点数計算に繋げるのか?が分かれば、元のプログラムに組み込む方法が考えられると思います♪
1そうだね
プレイ済み
返信[44]
親投稿
Hanzo rzsense
なるほど、そういうことでしたか。判定の方法は、後ほどサンプルプログラムのようなものを作って説明させていただきますので、しばらくお待ちください。ところで「重複する特殊役」はどのように判定しましょうか?「重複する特殊役」とは、例えば「クインテット0番」が成立するときは、必ず「カルテット0番」も成立しますし、「クインテット3番」が成立するときは、必ず「トリオ1番」「主従1番」「姉妹1番」も同時に成立します。クインテット>カルテット>トリオ>友達>主従>姉妹>主人公の優先順で1つだけ、という感じでしょうか。
1そうだね
プレイ済み
返信[45]
親投稿
nobu divine-creator
そう言われてみると、確かにそうですねΣ(゚Д゚)! 重複する役を同時に全て成立させてしまうと、他の役でその組み合わせに勝つことは不可能ですね…。なので、重複する役は一番加点の高い役のみ成立!というのが良いですね♪ そうすれば、たぶん勝てる組み合わせに幅ができるので、決まった組み合わせのみを狙うという攻略法になってしまわないでしょう! 対戦相手の出す役とプレイヤーが作れる役の優劣を、絶妙なバランスにできる自信は全くありませんけど…、とりあえずシステム的には特殊役の重複は成立しない!というのが正解だと思います♪
1そうだね
プレイ済み
返信[46]
親投稿
nobu divine-creator
先ほど、重複する特殊役は成立しない…と書きましたが、それはトリオ以上の役が重なるとマズいからであり、コンビの重ならない役は同時に成立しても良いのですけど、そういう条件で判定するのは複雑過ぎて大変なのでしょうか? 5枚の中に、2つのコンビが同時にできた場合にはどちらも成立とし、トリオとコンビが同時に成立した場合もどちらも成立としたほうが、組み合わせのパターンが選べて面白いと感じますけど、判定する条件を考えるのは難しいですね…!
1そうだね
プレイ済み
返信[47]
親投稿
Hanzo rzsense
お待たせしました。「XKS3QEDF」をお試しください。前回の枚数判定のサンプルプログラムに、特殊役判定を追加しています。特殊役判定は、枚数判定よりもずっとめんどくさくなりますが、条件が表になってはっきりしている以上、必ずできますので、諦めてはいけません。もっとも、私のサンプルプログラムは、多分無駄な重複が多く、大幅に短縮できる気がします。サンプルプログラムの6~70行目あたりに、多くのデータ文をコメント化しているところがありますが、これは、自分の作った特殊役判定ルーチンが正しく判定しているか確認するために使ったものです。ちなみに、私も途中で次のことに気がつきましたが、今回のプログラムはこれらも判定できるはずです。 ・トリオとコンビは同時に成立することがある。・コンビが同時に2組できることがある(同じコンビが2組のときは、同時に2ペアかフルハウスになる)
0そうだね
プレイ済み
返信[48]
親投稿
nobu divine-creator
Σ(゚Д゚)!数字が2段になっている!…と、最初は驚きましたが、下の段の数字は5で割った数字だったのですね。 確かに絵で見ると、すぐに同じカードか分かりますけど、数字だけだと役ができているのか?非常に分かりにくいですね…! 該当する数字をメモして、それが揃ったら判定するという方法をしてみたら、上手く役を作れるようになりましたが、何回でも自由に交換可能というルールなのに、なかなか揃わないものだなぁ…と感じました! やはり難しい役を作るには、交換自由じゃないとダメみたいですね。
0そうだね
プレイ済み
返信[49]
親投稿
Hanzo rzsense
大雑把な計算ですが、5枚のカードが配られた時点での、役の成立確率は、概ね添付のとおりです。ワンペアですら3%なんですね。 私のサンプルプログラムのXCARD関数は、第2引数をFALSEにして呼び出すと、1度捨てたカードであっても、何度でも交換できます。
0そうだね
プレイ済み
返信[50]
親投稿
nobu divine-creator
まさかの3%以下Σ(゚Д゚;)!ワンペアやコンビは比較的簡単に成立するので、もっと高確率なのかと思っていましたが、確率って難しい! だからこそ、当たる確率が超低いはずの宝くじに当選者が存在するんですけどね♪ 私もDSiと3DSの両方を懸賞で手に入れたから、低い当選率で当たったことがあるんですけど、0パーセントでない限りは当たる可能性があるんですよね(≧▽≦)! このゲームの場合は、カード交換自由なので、さらに確率UPだから、何とかなると思います…たぶん…。 もし、あまりに勝てないようなら、対戦相手の出す役に弱い場合を増やせば、運次第で勝てるようにできますし…♪
0そうだね
プレイ済み
返信[51]
親投稿
Hanzo rzsense
大変恐縮ながら、先ほどの私の確率の計算は、どうも誤っているようです。ワンペアはいくら何でも3%ってことはなく、10~20%はあるはずです。ただし確率の計算方法を忘れてしまったので、顔を洗って計算しなおします。
0そうだね
プレイ済み
返信[52]
親投稿
Hanzo rzsense
初期手札時点での各役の成立確率を、添付のとおり計算し直しました。130枚のカードから無作為に5枚を選ぶ選び方は、全部で約2億9千万通りで、ワンペアが成立するのは、そのうちの約7千5百万通りなので、大体4回に1回はワンペアが成立することになります。特殊役のうち最も成立しやすいのは「友達」で、10回に1回くらいでしょうか。なお、私も計算してみてはじめて気がつきましたが、「カルテット」「クインテット」は「フォーカード」「ファイブカード」よりもはるかに成立しやすいようです。
0そうだね
プレイ済み
返信[53]
親投稿
nobu divine-creator
あわわわっΣ(゚Д゚;)!そんな確率になるとは…、驚きました! 友人コンビの組み合わせは他の役よりも多いですから、別のコンビと確率的には同じですね♪ カルテットとクインテットについては意外でしたね!確かに、同じカードが揃うよりは揃いやすいというのは何となく分かりますけど、4~5枚揃うのは簡単じゃないと思っていたので、大きな差があるとは予想外でした! しかし、そうなると配点に差を付けないとバランスが悪くなりそうですね…。(各役の加点については、まだ後回しですけど…。)
0そうだね
プレイ済み
返信[54]
親投稿
Hanzo rzsense
差があると言っても、ファイブカードが0.000009%に対し、クインテットが0.004%という世界ですから、いずれも滅多にお目にかかれない役であることに変わりはありません。ゆえに、高次の役については、あまり厳密に配点バランスを考慮しなくても問題ないと、個人的には思います。
0そうだね
プレイ済み
返信[55]
親投稿
nobu divine-creator
サンプルプログラムに少し命令を加えて、正常に表示されるか確認後、自分のプログラムを変更して、そこにサンプルプログラムを挿入して正常に動作するか試してみたところ、カードが正しく表示されませんでした…orz。 サンプルでは数字のみの表示でしたので、それをSPの表示に変えなければならないのですが、何故かWL[0]~[4]を指定の番号に変更することから失敗してしまいました…。 SWAPで番号を替えた後、SPの位置を指定して表示するようにしたのですけど、それじゃあダメなのですか? 5枚目のカードしか表示されず、しかも0番のカードしか表示されません…。
0そうだね
プレイ済み
返信[56]
親投稿
nobu divine-creator
基本的には、サンプルのシステムを活かして役の判定を可能にしたいので、元々はタッチ操作で変更するカードの選択をしようとしていましたが、十字キーでカードの選択をするように変えることにしました。 しかし、サンプルのように数字が表示されてカードを変更するのではなく、「SPのカード枠を表示して、十字キーで枠が動いて選択する」という仕組みにしたいので、それを可能にする方法が知りたいのです!
0そうだね
プレイ済み
返信[57]
親投稿
Hanzo rzsense
プログラムを見せていただけると、どこに間違いがあるか指摘差し上げるのは容易と思いますが、もし本作の大喜利投稿を予定されているとすると、無条件に公開するわけにもいきませんね。 0~129のカード番号を、そのままスプライトの管理番号に置き換えるのが最も素直なやり方で、実際そうされていると思いますが、1枚しかカードが表示されていないとすれば、①WLの内容がおかしい ②5枚のスプライトを全部同じ位置に表示している のどちらかと思います。①②を切り分けるには、WLの内容を実際に表示してみることです。 WL[0]~[4]のSWAP失敗は、おそらく、SWAPを昇順に実行していないためではないかと推察されますが・・・
0そうだね
プレイ済み
返信[58]
親投稿
Hanzo rzsense
それにしても、せっかく作られたタッチ操作部分を放棄してしまうのは、実にもったいない。私のサンプルは、タッチにも問題なく移行できるはずです。論より証拠で「7KN3X3H4」をお試しください。このサンプルでは、タッチでカードを選び、1枚ずつでなく何枚でもいっぺんに、しかも何回でもカード交換できます。タッチで交換したいカードを選び、「Exchange」をタッチすれば、選択したカードをいっぺんに交換します。判定に移行するときは「Judge」をタッチします。多分、このサンプルのUIは、多分、nobuさんの理想に近いのではないかと思います。 先述した、対戦相手の初期手札WL[0]~[4]のSWAP方法を変えているので、サンプルの当該部分のコメントをご一読ください。
0そうだね
プレイ済み
返信[59]
親投稿
Hanzo rzsense
すみません、先ほど提示したサンプルプログラムの間違いを見つけました。41行目に「:FILL SF,FALSE」と追加願えますでしょうか。 他にも間違いがあるかもしれませんが、あしからずご容赦願います。
0そうだね
プレイ済み
返信[60]
親投稿
nobu divine-creator
まず大喜利に関してですが、個人的には出せるなら出したいと思っていますけど、キャラクターのみですが二次創作となるので、著作権は二次創作者のものとなるという説明から問題無いとは思うものの、原作のファンから何か苦情があったら…と考えると、この作品は大喜利用には使えないという気がしています…。 でも、中途半端な状態のプログラムを公開するのは避けたいので、場合によっては画面写真を使って尋ねるということはするかもしれません。 それで、SPの位置やSWAPの昇順は合っているはずなので、WLをSPに変える所で何かを間違えているのでしょう。 すぐにタッチ操作に移行できるとは凄いですね!以前のサンプルに合わせると、タッチ操作にするのは難しいと思ってしまっていましたが、そのようにできるなら非常にありがたいです♪ もし訂正する箇所がありましたら、またコメントを宜しくお願いします♪
0そうだね
プレイ済み
返信[61]
親投稿
nobu divine-creator
Hanzoさん考案の役判定プログラムを組み込んで起動してみたら、Illegal function call in 0:374(SPSCALE:1)というエラーになってしまいました…。 スロット0の374行目は確かにSPSCALEなのですが、そこのSPはカードじゃなくて対戦相手で、サイズは間違っていないはず…。SPSCALE:1の1というのが不明なのですが、それは何を表しているのでしょうか? また、エラーの原因となりそうなことをご存知でしょうか?別の箇所ならまだしも、そこでエラーになるのは予想外でした!
0そうだね
プレイ済み
返信[62]
親投稿
Hanzo rzsense
SPSCALEのサイズは、よほど変な値(負の数とか)を入れない限り、めったなことではエラーにはなりません。そもそも引数が範囲外の場合のエラーは「Out of range」です。スプライト関連命令で「Illegal function call」が出るとすると、「SPSET」を未実行の場合が多いと思いますので、エラーが出るスプライト管理番号に対し「SPSET」を実行済かどうか、ご確認ください。 ただ、私の最近のサンプルプログラムでは、130枚のカードのスプライト管理番号(0~129)に対しては、SPSETを最初に実行するはずだから、SPCLRを実行しない限り大丈夫なはずなんですが…
0そうだね
プレイ済み
返信[63]
親投稿
nobu divine-creator
私のプログラムでは基本的に、まず最初にSPDEFで定義した後すぐにSPSETとSPHIDEを使って、全てのSPを隠しておくという方法を行っています! そして、登場させたい所でSPSHOWを使って表示させています。 もしかすると、それが原因となっているのでしょうか? SPSETが二重になっていると問題になりますか?でも、エラーはSPSCALEでSPSETのエラーではない…? ちなみに、カードはそのままのサイズで使うので、SPSCALEを使う必要はありません。キャラは2倍のサイズで使いますが数値は正しく、役判定のプログラムを追加する前は、正しい大きさで正しい位置に表示されていました♪ それと、キャラのSPは変数で入れ替えるので、SPSCALE CHARA,2,2と入力しているのですが、その行がエラーということになっています…。
0そうだね
プレイ済み
返信[64]
親投稿
Hanzo rzsense
エラーが出て停止した直後に、ダイレクトモードで「?CHARA」を実行して、CHARAの内容が想定どおりかご確認ください。
0そうだね
プレイ済み
返信[65]
親投稿
nobu divine-creator
そのような確認法があったのですね!今まで知りませんでした…。 それを実行した結果は149で、入力している番号と同じなので、そこは問題ないようです♪ 選択マーカーのSP番号が別のSPとかぶっていることに気づいたので、選択マーカーのSP番号を変えてみましたが、結果は変わらず全く同じエラーが発生します! そこのSPSCALEはエラーになるはずがないんですけどね…。別の場所の何かが影響しているとしか思えませんが、SPSCALEを妨げるものには何があるのでしょう?
0そうだね
プレイ済み
返信[66]
親投稿
Hanzo rzsense
拝見する限り、SPSCALEの使い方は正しいようです。CHARAで示されるスプライト管理番号(149)は、もちろんSPSET済ですよね…SPHIDEは、SPSETを無効にすることはありません。SPSETを無効にするのは、SPCLRだけですが、伺った限りでは、SPCLRは実行してなさそうですし…待てよ、SPSETを無効化するヤツが他にもいます。そう、ACLSです。プログラム全体にわたりACLSで検索をかけて、2箇所以上ヒットするなら、後の方で実行されるACLSが怪しいですが、そんなACLSに心当たりはございませんか?私のプログラムを一部使っていただいているとすれば、その中のACLSもそのままコピーしてたりとか。
0そうだね
プレイ済み
返信[67]
親投稿
Hanzo rzsense
とりあえず、やはりCHARAで示されるスプライト管理番号が怪しいです。 それを確認するために、次の手順をお試しください。 ・プログラムがエラーで停止したら、ダイレクトモードで「?CHARA」を実行して、CHARAの中身を確認する。 ・ダイレクトモードで「?SPSET(0,0,1,1,1)」を繰り返し実行する。ここで、CHARAの中身と同じ値が表示される場合、CHARAで示されるスプライト管理番号が、何らかの原因で無効になっている証拠
0そうだね
プレイ済み
返信[68]
親投稿
nobu divine-creator
直前のコメントに書かれたチェック法を試した結果は異常なしのようですが、いろいろと調べ直してもなかなか正しく動いてくれないため、サンプルプログラムのほうで正常にカードが表示できるようにしようと考えました! しかし、最初の部分から疑問が複数ありました…orz。 最初にFILL SFが使われていますが、これにはどのような意味があるのでしょうか? そして、その後にACLSが使われていますが、ここで使う意図が分かりません…。(何かをリセットするためなのは分かりますけど…。) また、そこでACLSを使ってしまうと、それ以前の内容がリセットされてしまうので、もう一度必要な部分を入力しなければならないわけですよね? プログラムの一番最初に、ACLSまでの部分を入力するようにすれば良いのでしょうか?
0そうだね
プレイ済み
返信[69]
親投稿
Hanzo rzsense
私のプログラムは分かりにくくて恐縮です。まぁ、分からなくなったら一度ゼロベースで考え直すと言うのも一つの手です。 ご質問にお答えしましょう。まず配列SF[](添字は0~4)は、5枚の手札それぞれについて、選択中か否かを表します。選択中ならTRUE、そうでなければFALSEです。「FILL SF,FALSE」とは、SF[0]~SF[4]を一律FALSEにする命令です。全てFALSEとはつまり手札全て一旦非選択とする、と言うことです。 ACLSは「表示のみ初期化」する命令で、スプライトやBGなどはここでリセットされますので。ACLS以降、スプライトを使用するためには必ずSPSETが必要です。しかしながら、ACLSは配列変数など変数の中身まではリセットしません。そのため、ACLSによりFILL SF,FALSEが無効になることはありません。
0そうだね
プレイ済み
返信[70]
親投稿
Hanzo rzsense
とにかく ①ACLSをまず実行してからSPSETを実行 ②SPSETを実行したら、再びACLSを実行しない(つまりACLSは1プログラムに1個だけ、それも最初だけ)を守ることが重要です。特に①を逆にして、SPSETを実行してからACLSを実行するのは、ズボンを穿いてからパンツを穿こうとするようなものです。 変数の初期化は、ACLSの前でも後でも構いません。もちろん、配列変数を使う部分より前に初期化すべきであるのは言うまでもありません。 ところで、さっきから「変数の初期化」と申しており、何となく難しい印象をお持ちかも知れませんが、実際にはそんな難しい話ではなく、どんな変数でも、最初に値を代入しないと使えない(明示的に代入しないと、何が入ってるか分からなくて不安)から、最初に(使う前に)値を代入しましょう、と、この最初に値を代入することを「初期化」と言っているだけのことです。
0そうだね
プレイ済み
返信[71]
親投稿
nobu divine-creator
詳しい解説ありがとうございます♪ ACLSで変数が初期化されないことは、着せ替えソフトを作った際に知りましたが、今回使用されている位置が一番最初ではなかったため、その位置でなければならない理由があるのかな?と不思議に思っていました…。 けれど、今の解説によると、ACLSが一番最初でも問題ないようなので、一安心しました♪
0そうだね
プレイ済み
返信[72]
親投稿
あきと SideBurnsM
書き込みをしてからずっとフラグが立つので読ませてもらってたのですが、お二人がMiiverseの那賀で一番の合作チームだなと思います。 nobuさんも組み込んだ状態をアップロードして手直ししながら組み込んでいった方がいいのでは?
0そうだね
プレイ済み
返信[73]
親投稿
nobu divine-creator
一番の合作チームですか?そう評価していただけるのは光栄ですけど、初心者が一人では分からない事を質問し、協力していただいている状態なので、合作とは少し異なる感じがします…。 それに、合作だとしたら、完全に私が足を引っ張ってしまっています…(^_^;)。 一番の合作チームは、ナルミンチョさんのRPGチームだと思います♪ 何とか、自作カードを下画面に表示して、タッチで選んだカードを交換できるようになりました! まだ細かい変更が必要で、完全にうまくいったというわけではありませんが、段々と仕組みが理解できてきました♪ 現在、一番の疑問は「判定された役をどう得点に繋げるか?」です。得点の計算は、変数に数値を代入して行うのですが、出てきた役の判定を変数に代入するには、どのようにすれば良いのでしょうか?
0そうだね
プレイ済み
返信[74]
親投稿
Hanzo rzsense
おおっ!やはり実際に絵が入ると違いますね! 実際に合作するとしたら、nobuさんの画力は相当魅力です。これからも、分からないことはどしどし訊いていただければ、「永遠の中級者」としての知識をフル動員してお答えします。 ところで、役の判定を変数に代入する方法ですが、私がお勧めしたいのは、ビット演算を使って役を割り振る方法です。例えば、ワンペア="0001"、ツーペア="0010"、友達1="1000"のように、重複しない1ビットを1つの役に割り当てます。説明では4ビットですが、プチコン3号で扱う整数のビット長は32ビットなので、32種類の役を割り振ることができます。
0そうだね
プレイ済み
返信[75]
親投稿
Hanzo rzsense
ワンペア="0001"=&H1、ツーペア="0010"=&H2、友達1="1000"=&H8 として、役の変数をRKとすると、まずRKに0を代入しておいて、ワンペアが成立したら、RK=(RK OR &H1)を実行します。その状態で、友達1が成立したら、RK=(RK OR &H8)を実行します。そうすると、RKは"1001"=&H9となります。 ビット演算を使うと、点数計算や役の表示が系統的に実行できるのですが、じゃあ具体的にどうやるのか、と言うのが、文字で説明するのが案外難しいので、後でサンプルプログラムを作ってご説明致します。 ※いちいちビット演算を行わなくても、役の判定を実行している部分で、点数を格納する変数に、役ごとに固有の点数を加算していけば済む話ですが、ビット演算が分かっていると、後々役に立ちますので。
0そうだね
プレイ済み
返信[76]
親投稿
nobu divine-creator
ビット演算……これまでに何度もその言葉を見る機会はありましたが、未だに理解ができていないものの一つです…。 これまでは、変数に普通の数字を入力する方法を使っていましたが、複雑な点数計算をするには、ビット演算を使ったほうが都合が良いのでしょう? 何とかそちらの方法を行えるようにしたいと思います! ところで実は、役の点数以外にカードの種類による点数を考えていて、キャラカードとスペルカードでは「スペルカードのほうが少しだけ攻撃力が高い」という設定にしていました。その得点も同じように表したほうが良いということですよね?
0そうだね
プレイ済み
返信[77]
親投稿
Hanzo rzsense
なかなかサンプルプログラムを示さなくて恐縮です。大喜利投稿作品作成が難航しておりまして・・・まぁ、役の判定ができているから、どの役に何点割り当てるかさえ明らかにすれば、あとはいかようにもできます。 特定のカードを持っているときに加算される点数については、26種類それぞれの点数を決めておき、配列変数に格納しておくなり、私がよくやるように、得点をDATAにしておいて、その都度参照するなりすればOKです。
0そうだね
プレイ済み
返信[78]
親投稿
nobu divine-creator
この作品は大喜利応募用ではないので、完成期限が無く、大喜利応募用作品を優先しなければならないため、全く急ぐ必要はありません♪ なので、ゆっくり進めて行こうと思っていますが、サンプルから元のプログラムに組み込む際に、新たな疑問が発生してしまいました…! サンプルでは、下画面にプレイヤーのカードを表示するだけでしたが、実際には上画面に対戦相手のカードを表示するため、DISPLAY0とSPOFSを使って表示しようとしましたが、対戦相手のカードを表す変数が間違っているのか?エラーになってしまいました…orz。 TMP[I]やWL[I],TMP[WL[I]]を試してみたりしましたが、どれでも上手くいきませんでした…。対戦相手のカードを表す変数は、それらではないのですか?それとも、別の理由でエラーになっているのでしょうか?
0そうだね
プレイ済み
返信[79]
親投稿
Hanzo rzsense
サンプルプログラムを作りました。「2K3V83ZJ」をお試しください。前回大見栄を切った割には、ビット演算の使い方がイマイチです。と言うか、自分のプログラムを改めて見ると、その汚さに愕然とします。もっときれいでスマートな書き方がきっとあるので、ぜひチャレンジしてみてください。 サンプルでは、役ごとの点数を、DATA文に適当に追加してみましたので、ご参考ください。 「カードの種類による点数」とは「カードAが含まれていればPA点、カードAが2枚あればPA×2点」のような考え方でしょうか? 対戦相手のカードは、サンプルプログラムの51行目(FORループ)を実行後、WL[0],WL[1],WL[2],WL[3],WL[4]に格納されています。
0そうだね
プレイ済み
返信[80]
親投稿
nobu divine-creator
予想以上に早い対応ありがとうございます♪本当なら、すぐに内容を理解して活用したいところですが、大喜利応募用の作品を優先しなければならないため、今すぐこちらに取り掛かることはできません…。 いつ頃再開できるかはまだ不明ですが、なるべく早く続きを行い完成させたいと思っています!他の作品が完成するか一区切りついた時に、少しずつでも進めたいと考えています♪
0そうだね
プレイ済み