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
|