お知らせ

電子会議

ライブラリ

パレット

Delphi FAQ検索

Delphi FAQ一覧

サンプル蔵





FDelphi FAQ
16番会議室「玉石混淆みんなで作るSample蔵」に寄せられたサンプル

"Re:カードゲーム用ランダムシャッフル(改)"

この発言は
#00281 J-OH!     さんのカードゲーム用ランダムシャッフル(改)
に対するコメントです

J-OH! さん、こんにちは > 2: また、おかしなトコロがありましたら御教示下さい。 m(__)m オネガイシマス・・ おかしいところはなさそうですが、ちょっと効率が悪いような気がします。 私ならこう書く、というコードを載せておきます。ついでなのでジョーカーに も対応しておきました。 unit Unit1; interface uses ...; type TCard = 0..52; { カードの種類 Joker を 0, スペードの札を 1から13, ハートの札を14から26, ダイヤの札を27から39, クラブの札を40から52で表す } TCardOrder = 0..52; { カードの順番 } TCardStrings = array[TCard] of String[4]; { カードを表す文字列の配列 } TCards = array[TCardOrder] of TCard; { 1組のカードを表す配列 } TForm1 = class(TForm) StringGrid1: TStringGrid; Button1: TButton; procedure FormCreate(Sender: TObject); procedure Button1Click(Sender: TObject); private { Private 宣言 } CardStrings: TCardStrings; { カードを表す文字列の配列で、フォーム生成時に初期化され、その後は変 更されない。配列定数的に使う。 } procedure Shuffle(var cs: TCards; m, n: TCardOrder); { カードを切る } public { Public 宣言 } end; var Form1: TForm1; implementation {$R *.DFM} procedure TForm1.Shuffle(var cs: TCards; m, n: TCardOrder); { カードを切る範囲を引数として渡す仕様なので、ゲームの途中でカードの一部 だけを切る場合にも使える } var i, rn: TCardOrder; work: TCard; begin for i := m to n - 1 do begin rn := i + Random(n - i + 1); work := cs[i]; cs[i] := cs[rn]; cs[rn] := work; end; end; procedure TForm1.FormCreate(Sender: TObject); const StrMrks: array[1..4] of string[2] = ('●', '○', '◇', '★'); StrNums: array[1..13] of string[2] = ('A', '2', '3', '4', '5', '6', '7', '8', '9', '10', 'J', 'Q', 'K'); var mrk, num: integer; begin { 乱数系列の初期化 } Randomize; { カードを表す文字列を作る } CardStrings[0] := 'Jo'; for mrk := 1 to 4 do begin for num := 1 to 13 do begin CardStrings[13 * (mrk - 1) + num] := StrMrks[mrk] +StrNums[num]; end; end; end; procedure TForm1.Button1Click(Sender: TObject); var i: TCardOrder; n, rc, cc: Integer; cards: TCards; begin { StringGrid1.ColCount := 9; StringGrid1.RowCount := 8; } for i := 0 to 52 do cards[i] := TCard(i); { カード1組を初期化する } Shuffle(cards, 0, 52); { カードを切る } { Joker を使わない場合は Shuffle(cards, 1, 52); } { 以下、切ったカードを表示する } n := 0; { Joker を使わない場合は n := 1; } for rc := 1 to 7 do begin for cc := 1 to 8 do begin if n <= 52 then StringGrid1.Cells[cc, rc] := cardStrings[cards[n]] else StringGrid1.Cells[cc, rc] := ''; { n が52以下ならStringGrid1のrc行cc列のところにn 枚めのカードを表示し、 それ以外の場合は空にする } n := n + 1; end; end; end; end. CQY00603 T. Kawanishi Original document by T. Kawanishi 氏 ID:(CQY00603)



ここにあるドキュメントは NIFTY SERVEの Delphi Users' Forum の16番会議室「玉石混淆みんなで作るSample蔵」に投稿されたサンプルです。これらのサンプルはボーランド株式会社がサポートする公式のものではありません。また、必ずしも動作が検証されているものではありません。これらのサンプルを使用したことに起因するいかなる損害も投稿者、およびフォーラムスタッフはその責めを負いません。使用者のリスクの範疇でご使用下さい。

Copyright 1996-2002 Delphi Users' Forum