プチコン3号講座 SMILE BASIC

NINTENDO 3DSのプチコン3号の使い方、プログラミング方法を紹介します。

カテゴリの「プチコン3号」をクリックすると、古いものから表示されるので 順番に読むことができます。

データを一気に設定するには? その2 COPY

では、COPY機能のもう一つの使い方を紹介します。

前回は配列から配列に値をコピーする方法でした。
今回は配列に複数のデータを一気にコピーする方法です。

ちなみに配列については
配列って何?

まず、この方法を使わすに配列に値を設定するとこうなります。

DIM A$[4]
A$[0] = "あいうえお"
A$[1] = "かきくけこ"
A$[2] = "さしすせそ"
A$[3] = "たちつてと"

これが増えていくと、長い文章になってしまいますね。

では、今回のCOPYの使い方です。

COPY コピー先配列, [オフセット], "@ラベル文字列", [データ個数]

さて、コピー先配列、オフセットについては、前回紹介しました。
データを一気に設定するには? COPY

"@ラベル文字列"とは、
プログラムの好きなところを実行させる GOTO

ラベルを付けた先がデータになります。

プログラム例です。
@DATAA
DATA "あいうえお","かきくけこ","さしすせそ","たちつてと"
DIM A$[4]
COPY A$, "@DATAA"

FOR I=0 TO 3
  PRINT A$[I]
NEXT I

赤字が今回の命令です。
20150913_1


実行結果はこちら。
20150913_2


さて、データは1行に書かないといけないのでしょうか?

@DATAA

DATA "あいうえお","かきくけこ","さしすせそ","たちつてと"
DATA "なにぬねの"
DIM A$[5]
COPY A$, "@DATAA"

FOR I=0 TO 4
  PRINT A$[I]
NEXT I

上記のように入力するとどうなるでしょうか?
20150913_3


下記のように、データをすべて受け取ってくれます。
20150913_4


ちなみに、二次元配列でできるか試してみましたがうまく入りませんでした。

さて、これはどういうときに使うかというと、
やはり、得点によってメッセージを変えたいときとか。
例えば
@KEKKA
DATA "すごくおそいですね", "あとすこしがんばりましょう"
DATA "ふつうにいいですね", "なかなかです"
DATA "いいね!", "さいこうです"

DIM MSG$[5]
COPY MSG$, "@KEKKA"

DIM A

A = RND(6)

PRINT MSG$[A]

20150913_5

実行すると、こうなります。

20150913_6





 

データを一気に設定するには? COPY

配列を使うとデータの扱いが簡単になったりします。

配列については
配列って何?

を読んでみましょう。

さて、データを一気に設定するとはどういうことでしょうか?

いってみれば、DVDケースに5枚分、一度に収納する、職人芸のような感じでしょうか。

そんな命令は
COPYです。

COPY コピー先配列 [,コピー先オフセット],コピー元配列 [[,コピー元オフセット] , コピー要素数]
という使い方ですが、どういうことでしょうか?

では、例で試して見ましょう。

' Aの配列を5個に設定
DIM A[5]
' Bの配列を3個に設定
DIM B[3]
' 5回繰り返し
FOR I = 0 TO 4
  ' Aの配列位置にI+1の値を設定
  A[I]=I+1
NEXT I

' 配列をコピーする
COPY B, A

FOR I = 0 TO 4
  ' Bの中身を表示する
  PRINT B[I]
NEXT I

2015032505

さて、COPYの最初の引数はコピー先配列です。
この場合、Bの配列に値を設定するということになります。

そして、コピー元配列。
ここでは、Aです。

ですから、Aの配列の中身をBに一気に入れます。

ここで、問題なのは、Bの配列は3個なのに、Aの配列は5個という点です。

これはどうなるのでしょうか?

それは、Bの配列が大きくなって、Aの配列と同じ大きさになります。
つまり、Bの配列数も5個になります。

そして、表示すると見事にBにコピーされています。

2015032506


ちなみに、二次元配列以上の場合は拡張されません。
' Aの配列を5x3個に設定
DIM A[5,3]
' Bの配列を3x2個に設定
DIM B[3, 2]
' 5回繰り返し
FOR I = 0 TO 4
  FOR J = 0 TO 2
    ' Aの配列位置にIx3+J+1の値を設定
    A[I, J]=I*3+J+1
  NEXT J
NEXT I

' 配列をコピーする
COPY B, A

FOR I = 0 TO 4
  FOR J = 0 TO 2
    ' Bの中身を表示する
    
PRINT B[I, J]
  NEXT J
NEXT I

2015032501

実行するとエラーになります。

2015032502


動かすには
DIM B[5, 3]
とAの配列数と同じにします。

続いてオフセットの使い方ですが、途中からコピーしたいときに使います。

' Aの配列を5x3個に設定
DIM A[5,3]
' Bの配列を3x2個に設定
DIM B[3, 2]
' 5回繰り返し
FOR I = 0 TO 4
  FOR J = 0 TO 2
    ' Aの配列位置にIx3+J+1の値を設定
    A[I, J]=I*3+J+1
  NEXT J
NEXT I

' 配列をコピーする(Aの(2 + 1)個目から3個分コピーする
COPY B, A, 2, 3

FOR I = 0 TO 2
  FOR J = 0 TO 1
    ' Bの中身を表示する
    
PRINT B[I, J]
  NEXT J
NEXT I

2015032503


上記のように配列数が変わらないようにコピーすると
コピーできるようです。(一次元の場合。2次元以上は1次元だけコピーされます。)

2015032504


最後におさらいすると
COPY B, A, 2, 3

Bの配列にAの配列の中身をコピーします。
Aの配列の(2+1)番目の値から、3個分コピーします。

(2+1)というのは配列は0始まりのため0, 1, 2の3番目になるからです。

ただし、多次元配列の場合は、まったく同じ個数の場合コピーされますが
それ以外の場合は、制限があるというわけです。


数値を足したり引いたいるするには INC DEC

変数に値を設定する。
これは、BASICだけでなく、プログラム言語では絶対に必要なことです。

この講座でも最初のころに学習しました。
値の設定

さて、普通に変数に値を足すのは
X = X + 1
Y = Y - 5

などと書きます。

しかし、命令で行うこともできます。

それが、INC, DEC です。

INCが変数に値を足す命令で
DECが変数から値を引く命令です。

使い方は
INC X
DEC Y, 5

となります。
これは、最初に書いた
X = X + 1
Y = Y - 5
と同じ意味です。

もう少し、詳しく書くと
INC X
Xという変数に値を加えます。
Xの後ろに、加えたい数値を書くのですが、
書かないと1が加えたい数値になります。

そのため、Xに1を足すという意味になります。

DEC Y, 5
こちらは、Yという変数から5を引く
という意味になります。

こちらも、Yの後ろの数値を省くと1を引くという意味になります。

ちなみに、増加を意味する英語incrementからINC
減少を意味する英語decrementからDEC
になっています。

では、サンプルを作ってみましょう。

今回参考になるのは
画面をきれいに(クリア)するには? CLS ACLS

文字の表示位置を指定するには? LOCATE

ボタンの入力を受け付けるには? BUTTON VSYNC


ACLS

'位置変数
AX=0
AY=0
AZ=0
'ボタン変数
A=0
'数値変数
VAL=128

'Bボタンが押されるまで繰り返す
WHILE A != 32
  'ボタンの押下状況を取得
  A = BUTTON()
  '↑が押されたら
  IF (A AND 1) == 1 THEN
    'VALに1加える
    INC VAL
  END IF
  '↓が押されたら
  IF (A AND 2) == 2 THEN
    'VALから1を引く
    DEC VAL
  END IF

  '前の情報をクリア
  LOCATE AX, AY, AZ
  PRINT "          "
  '今回の数値を書き込む
  LOCATE AX, AY, AZ
  PRINT VAL
  ' 正しくボタン情報が取れるように垂直同期
  VSYNC
' 繰り返し部の最後
WEND

' 位置情報を初期化
LOCATE 0, 0, 0

2015032204

実行すると

2015032205


さて、これを使ってゲームを作るなら・・・
ドライブゲームのアクセルを踏んだときの時速が増えるときに
INC
ブレーキでDECを使うとかですかね。
最新コメント
カテゴリー