パソコン活用研究5番街(Visual Basic、Excel(VBA)、BASIC プログラミング研究)



配列 その2

====================================================================================
配列を使用したプログラムの第2段として、データの並び替えと、GAMEでよく使う、カードのシャッフル
について、とりあげてみます。いずれも配列をを使った基本技法です。
====================================================================================

1 データの並び替え

データの並び替え(大きい順、小さい順など)は、まさしくパソコンにまかせるべき作業です。
人間ならうんざりするような、何千、何万というデータの並び替えを文句も言わず、瞬時に
こなしてくれます。
データの並びかえや、最大値、最小値の検索、順位づけなども、配列を使います。

データの並び替えについては、いろいろな方法が研究されていますが、以下に一番単純な
バブルソートによるデータ並び替え(小さい順)のプログラム例を示します。
バブルソート法というのは、隣同士のデータを順番に比較し、入れ替えていく方法です。
ここでは、小さい順に並べ替えなので、隣同士を比較し、
・前のデータ<後ろのデータ  ならそのまま
・前のデータ>後ろのデータ  なら入れ替え
という作業を繰り替えしていきます。
N個のデータがある場合、1回目はN−1回隣同士を比較し入れ替えます。これで、一番大きい
データは一番後ろに移動します(一番大きいデータの確定)。一番大きいデータは確定したので、
2回目は、残りのN−1個のデータの入れ替えです。今度はN−2回隣同士を比較し入れ替えま
す。これで、2番めに大きいデータが、後ろから2番目に確定します。以下、N−2,N−3個の
データの入れ替えという作業をくりかえします。N個のデータの場合、結局N−1回の作業で、
並べ変えが完了します。

データ4個(5,9,4,3の場合)
1回目のソート          2回目        3回目
5 −>5            5−>4       4−>3 
9 −>9 −>4        4−>5−>3    3−>4
4    4 −>9−>3    3   3−>5    5 
3         3−>9    9            9
          9は確定       5が確定     全部確定

BUBSORT.BAS(N88互換Basic for Win用)
データは9個乱数で発生させています

1 'バブルソート
5 CLS
10 randomize val(right$(time$,2))
15 n=9                  'データ個数 ここでは9個
20 for i=0 to n
30 a(i)=int(rnd*100): print a(i);   'a(0)からa(9)にデータ設定
40 next
50 'バブルソート
60 for i=n to 1 step -1      'ソートするデータ個数は1かい毎に減少
70 for j=0 to i-1          'ソートするデータは 0 からi−1(=n−1)番まで
80 if a(j)>a(j+1) then swap a(j),a(j+1)  '前のデータ>後ろのデータ なら入れ替え
90 next j
100 next i
110 print:print "結果PRINT"
120 for i=0 to 9
130 print a(i);
140 next
150 print:print "もう1かいやる?(y/n)"
160 q$=input$(1)
170 if q$="y" or q$="Y" then goto 20

 

2 トランプのシャッフル

トランプもパソコンのゲームでよくありますが、カードの設定とシャッフルも配列を使うと簡単に
できます。

以下のプログラムは、シャッフルしてその結果を表示するものですが、変数等は次のように
設定しています。
0から52の数値にカードを設定します。設定ルールは以下の通りとします。  
0 ジョーカー
1 から 13     ハート  1 が ハート 1
14 から 26   ダイヤ   14がダイヤ 1
27 から 39   クラブ
40から 52    スペード
この数値を配列 K() に設定します。K() の添え字はカードが何枚目かを表します。 
(例)
K(3) = 0   4枚目(配列は0からはじまるので)のカードがジョーカー
K(34) = 1  35枚めのカードが ハート 1

変数Q$()は表示用です。
例えば K(11) = 0 の場合 (12枚めのカードがジョーカー)
Q$(K(11)) は“ジョーカー ”と表示します。

K()の値でカードの種類が判別できるので、K()の値を判定することにより、いろんなトランプ
ゲームが作成できます。また、カードの表示はQ$(K( ))で行えます。

シャッフルは、1 から 52 までの乱数を発生させ 0番のカードと交換していくというやり方を
とっています。100回もやればかなり、混ざると思います。

乱数 5 ===> 乱数 2  ==>
K(0)=0     K(0)=5     K(0)=2     
K(1)=1     K(1)=1      K(1)=1 
K(2)=2     K(2)=2     k(2)=5
・・・・・・・       ・・・・・・・     ・・・・・・・・ 
k(5)=5     K(5)=0     K(5)=0
・・・・・・・・       ・・・・・・      ・・・・・・・

トランプのカード設定、シャッフルの方法は他にもいろいろありますが、筆者はだいたいこの
方法でやりました。

SHUFFLE.BAS(N88互換BASIC for Win 用)

1 'SHUFFLE
10 dim q$(52),k(52)
20 cls
25 '初期設定
30 q$(0)="Joker***"
40 for i=1 to 13
50 q$(i)="ハート"+str$(i)
60 q$(i+13)="ダイヤ"+str$(i)
70 q$(i+26)="クラブ"+str$(i)
80 q$(i+39)="スペド"+str$(i)
90 next
92 for i=0 to 52
94 q$(i)=left$(q$(i)+" ",9)
96 next
97 for i=0 to 52
98 k(i)=i
99 next
100 'シャッフル
110 randomize val(right$(time$,2))
120 for j=0 to 100
130 i=int(rnd*52)+1
140 swap k(0), k(i)
150 next
155 '結果表示
160 for i=0 to 12
170 for j=0 to 3
180 print q$(k(i*4+j))+" ";
190 next j
195 print
200 next i
210 print q$(52)

TOP PAGE >Basic活用研究目次