カードマジックのプログラム化へのお願い

 投稿者:GAI  投稿日:2009年10月17日(土)18時02分55秒
  一組のトランプを次の順序で構成する。
トップからの順番で
  1:ハート   8
  2:スペード 3
  3:ハート  6
  4:ダイア  9
  5:ダイア  6
* 6:ダイア  Q
  7:ダイア  J
* 8:スペード Q
  9:ハート  J
 10:スペード 9
*11:ハート  5
 12:ダイア  8
 13:スペード 6
*14:ハート  Q
*15:ダイア  7
 16:スペード K
 17:クラブ  K
 18:ハート  9
 19:ダイア  3
*20:ダイア  5
*21:ダイア 10
*22:スペード10
 23:クラブ  J
 24:クラブ  9
*25:ハート  2
 26:ダイア  A
*27:スペード 5
*28:ハート 10
 29:スペード 8
 30:クラブ  6
*31:ハート  K
*32:ダイア  K
*33:スペード 4
*34:クラブ 10
*35:クラブ  7
 36:クラブ  A
*37:クラブ  2
 38:ハート  A
*39:スペード 2
*40:ハート  4
*41:スペード 7
*42:クラブ  4
 43:クラブ  8
 44:クラブ  3
 45:ハート  3
*46:ダイア  2
*47:ダイア  4
 48:スペード J
*49:クラブ  Q
*50:ハート  7
 51:スペード A
*52:クラブ  5

ただし*印は表向きで、他は裏向きでセットする。
(組み上がった時、ハートの8が裏向きで一番上のある。)

(遊び方)
1.演者は目隠しか、後ろを向いておく。
2.客に、この仕込んだデックを数回カット(任意の位置で上、下2つに分けて上下の位置関係を入れ替える。)させる。
3.5人の客(A,B,C,D,E)に上から一枚ずつカードを取らせる。
   この時、そのカードが表向きか裏向きかを言ってもらう。
4.最後に残りのパケットの一番上にあるカードが表向きか裏向きかを尋ねる。
5.このことから、いまパケットの一番上にのっているカードの種類と数字を言い当てる。

<言い当てるカードの種類の判定方法>
客C,Dが言う表、裏の組み合わせで
(C,D) =(表、表)→クラブ
    =(表、裏)→ハート
        =(裏、表)→スペード
        =(裏、裏)→ダイア

<言い当てるカードの数字の算出方法>
3人の客(A,B,E)と最後に聞くパケットトップのカードに割り当てるキー数字を
客A・・・8点
客B・・・4点
客E・・・2点
パケットのトップカード・・・1点
としておき、裏向きであるカードに対応する位置のキー数字の合計をする。
(0~15の合計値のいずれかになる。)このとき、
合計値が0か5か10か15なら、言い当てるカードの数字=K
0<合計値<5なら、言い当てるカードの数字=合計値
5<合計値<10なら、言い当てるカードの数字=合計値-1
10<合計値なら、言い当てるカードの数字=合計値-2
 

Re: カードマジックのプログラム化へのお願い

 投稿者:SECOND  投稿日:2009年10月21日(水)00時42分22秒
  > No.657[元記事へ]

GAIさんへ

!じつは、よくわからなくて、次のように勝手に想像してみましたが、
!合っているでしょうか。

!デックのトップから、A,B,C,D,E のパケット順に、最後の1枚を残して、配る。
!ただし*印は表向きで、他は裏向き。

!最後のパケットトップが、以下なら、最後の1枚の種類は、
!(C,D) =(表、表)→クラブ
!    =(表、裏)→ハート
!        =(裏、表)→スペード
!        =(裏、裏)→ダイア

!裏向きカードの場所ごとに、点数をつけて合計する。
!5つの、パケットトップは、C,D …0点
!A・・・8点
!B・・・4点
!E・・・2点
!最後のカード・・・1点

!合計値が
!0,5,10,15 なら、 K …13
!0<合計値<5なら、  合計値
!5<合計値<10なら、 合計値-1
!10<合計値なら、   合計値-2

!が、最後の1枚の、ナンバー

OPTION BASE 0
DIM s$(51),cd$(3)

LET cd$(0)="クラブ"
LET cd$(1)="ハート"
LET cd$(2)="スペード"
LET cd$(3)="ダイヤ"

! s$()(1:1) 先頭の数字= 1,0(裏,表)

LET s$( 0)="1ハート  8" !  1:ハート   8
LET s$( 1)="1スペード 3" !  2:スペード 3
LET s$( 2)="1ハート  6" !  3:ハート  6
LET s$( 3)="1ダイア  9" !  4:ダイア  9
LET s$( 4)="1ダイア  6" !  5:ダイア  6
LET s$( 5)="0ダイア  Q" !* 6:ダイア  Q
LET s$( 6)="1ダイア  J" !  7:ダイア  J
LET s$( 7)="0スペード Q" !* 8:スペード Q
LET s$( 8)="1ハート  J" !  9:ハート  J
LET s$( 9)="1スペード 9" ! 10:スペード 9
LET s$(10)="0ハート  5" !*11:ハート  5
LET s$(11)="1ダイア  8" ! 12:ダイア  8
LET s$(12)="1スペード 6" ! 13:スペード 6
LET s$(13)="0ハート  Q" !*14:ハート  Q
LET s$(14)="0ダイア  7" !*15:ダイア  7
LET s$(15)="1スペード K" ! 16:スペード K
LET s$(16)="1クラブ  K" ! 17:クラブ  K
LET s$(17)="1ハート  9" ! 18:ハート  9
LET s$(18)="1ダイア  3" ! 19:ダイア  3
LET s$(19)="0ダイア  5" !*20:ダイア  5
LET s$(20)="0ダイア 10" !*21:ダイア 10
LET s$(21)="0スペード10" !*22:スペード10
LET s$(22)="1クラブ  J" ! 23:クラブ  J
LET s$(23)="1クラブ  9" ! 24:クラブ  9
LET s$(24)="0ハート  2" !*25:ハート  2
LET s$(25)="1ダイア  A" ! 26:ダイア  A
LET s$(26)="0スペード 5" !*27:スペード 5
LET s$(27)="0ハート 10" !*28:ハート 10
LET s$(28)="1スペード 8" ! 29:スペード 8
LET s$(29)="1クラブ  6" ! 30:クラブ  6
LET s$(30)="0ハート  K" !*31:ハート  K
LET s$(31)="0ダイア  K" !*32:ダイア  K
LET s$(32)="0スペード 4" !*33:スペード 4
LET s$(33)="0クラブ 10" !*34:クラブ 10
LET s$(34)="0クラブ  7" !*35:クラブ  7
LET s$(35)="1クラブ  A" ! 36:クラブ  A
LET s$(36)="0クラブ  2" !*37:クラブ  2
LET s$(37)="1ハート  A" ! 38:ハート  A
LET s$(38)="0スペード 2" !*39:スペード 2
LET s$(39)="0ハート  4" !*40:ハート  4
LET s$(40)="0スペード 7" !*41:スペード 7
LET s$(41)="0クラブ  4" !*42:クラブ  4
LET s$(42)="1クラブ  8" ! 43:クラブ  8
LET s$(43)="1クラブ  3" ! 44:クラブ  3
LET s$(44)="1ハート  3" ! 45:ハート  3
LET s$(45)="0ダイア  2" !*46:ダイア  2
LET s$(46)="0ダイア  4" !*47:ダイア  4
LET s$(47)="1スペード J" ! 48:スペード J
LET s$(48)="0クラブ  Q" !*49:クラブ  Q
LET s$(49)="0ハート  7" !*50:ハート  7
LET s$(50)="1スペード A" ! 51:スペード A
LET s$(51)="0クラブ  5" !*52:クラブ  5

FOR i=0 TO 52
   LET A=MOD(i,52)
   LET B=MOD(i+1,52)
   LET C=MOD(i+2,52)
   LET D=MOD(i+3,52)
   LET E=MOD(i+4,52)
   LET r=MOD(i+5,52)
   LET sum= VAL(s$( A )(1:1))*8+VAL(s$( B )(1:1))*4+VAL(s$( E )(1:1))*2+VAL(s$( r )(1:1))
   IF MOD(sum,5)=0 THEN
      LET N=13
   ELSEIF sum< 5 THEN
      LET N=sum
   ELSEIF 5< sum AND sum< 10 THEN
      LET N=sum-1
   ELSEIF 10< sum THEN
      LET N=sum-2
   END IF
   PRINT "計算のカード:";cd$( VAL(s$( C )(1:1))*2+VAL(s$( D )(1:1)) );N
   PRINT "最後のカード:";s$( r )(2:7)
   PRINT
NEXT i

!連続する6枚が、デックの一番下に残れば、その6枚は、何番目のものでも、OK
!のようですが、細かくシャッフルしすぎると、6枚が、確保できないかも知れません。

END
 

Re: カードマジックのプログラム化へのお願い

 投稿者:GAI  投稿日:2009年10月21日(水)07時25分6秒
  > No.667[元記事へ]

SECONDさんへのお返事です。


製作ありがとうございます。


> !デックのトップから、A,B,C,D,E のパケット順に、最後の1枚を残して、配る。
> !ただし*印は表向きで、他は裏向き。


この部分はA,B,C,D,Eの人が一枚ずつカードをとることで、とった後はそれ以上はカードはとりません。そして残りのパケットはテーブルにあり、その一番上にのっているカードについて、表か裏かを聞きます。
5人の返事とこの情報(6つの表か裏かのデーター)から、パケットトップにあるカードを当てると言う仕組みです。
これは、元のデックを任意にカットしても同じく成立します。(別に6枚が連続する必要はなく、任意の位置でデックを2分し、上下を入れ替えることが可能)


そこで、任意の位置でデックをカットする部分と、6つのデーター(A,B,C,D,E,トップカードの裏、表)を表示してもらい、一応こちらがパケットトップにあるカードを予想しますから、この答えが正解になるかを確認できるプログラムを構成してもらいたいんですが・・・
 

Re: カードマジックのプログラム化へのお願い

 投稿者:SECOND  投稿日:2009年10月21日(水)11時06分38秒
  > No.668[元記事へ]

GAIさんへ

カードはド素人で、随分とんちんかんな、状況を想像していたようです。
申し訳ない!でも、プログラム自体は、

s$( 0),s$( 1),s$( 2),s$( 3),s$( 4),s$( 5) の裏表からの計算カード = s$( 5)のカードに一致
s$( 1),s$( 2),s$( 3),s$( 4),s$( 5),s$( 6) の裏表からの計算カード = s$( 6)のカードに一致
s$( 2),s$( 3),s$( 4),s$( 5),s$( 6),s$( 7) の裏表からの計算カード = s$( 7)のカードに一致
         :           :
         :           :
s$(50),s$(51),s$( 0),s$( 1),s$( 2),s$( 3) の裏表からの計算カード = s$( 3)のカードに一致
s$(51),s$( 0),s$( 1),s$( 2),s$( 3),s$( 4) の裏表からの計算カード = s$( 4)のカードに一致
s$( 0),s$( 1),s$( 2),s$( 3),s$( 4),s$( 5) の裏表からの計算カード = s$( 5)のカードに一致

このように、ぐるぐると、何度回っても、連続の6枚でありさえすれば、
一致する確認の計算をしていますので、

兼用できるような気がします。
少しくらいは、シャッフルしてもトップの6枚は、上記の何れかだと思います、
上下を、中ほどで、入替えても、サークル順序は同じで、崩れませんが、
途中から抜き取ったり、1枚毎に織り込むシャッフルだと、どこで崩れるか、
運、になりますね。
あとは、ご自身で工夫してみてください。すみません。

   ------------------------
  ※例えば、23枚目で上下入換えたとすると

  for i=0+23 to 52+23
      (
       )
    next i

    とした状態です、23枚目から始まる他、何も変りません。
 

戻る