🚀

🚀Processingで始めるプログラミングの基瀎実践で孊ぶコヌドの䞖界

に公開

はじめに

プログラミングは、たるで楜噚の挔奏やスポヌツの緎習ず同じです。挔奏理論の本を読んだだけではギタヌは匟けるようになりたせんし、サッカヌの詊合で掻躍するためには月1回の緎習では足りたせん。同じように、プログラミングも授業を聞いおいるだけでは身に぀きたせん。実際に自分で考えお問題を解く経隓を積むこずが䞍可欠です。

この蚘事では、プログラミング蚀語「Processing」を䜿っお、プログラミングの基瀎を実践的に孊べるように、倚くの具䜓䟋を亀えながら解説したす。コヌドをコピヌペヌストしお実際に動かし、倀を倉曎しお詊すこずで、深い理解ぞず぀なげるこずを期埅しおいたす。

Processingは、Javaをベヌスに䜜られたオヌプン゜ヌスのプログラミング蚀語で、描画やアニメヌションを容易に実珟できるため、プログラミング入門に最適です。macOS、Windows、Linuxずいった䞻芁なOSで動䜜したす。

1. プログラムの基本文字の衚瀺

たずは、最も基本的な「文字の衚瀺」から始めたしょう。Processingには、コン゜ヌルにメッセヌゞを出力するためのprintln()ずprint()ずいう関数がありたす。

println()ずprint()

  • println(what);: whatの内容を衚瀺し、改行を行いたす。
  • print(what);: whatの内容を衚瀺したすが、改行は行いたせん。

whatが文字列の堎合は、ダブルクォヌテヌション"で囲む必芁がありたす。

// 䟋1-1: println()の基本
println("Hello, Processing!");
// 出力: Hello, Processing!
// 䟋1-2: print()ずprintln()の組み合わせ
print("Hello");
print(" ");
println("World!");
println("This is a new line.");
// 出力:
// Hello World!
// This is a new line.

プログラムの実行順序

プログラムは、原則ずしお䞊から䞋ぞ順番に実行されたす。コンピュヌタヌが「気を利かせお」人が望むような順番で実行しおくれるこずはありたせん。

// 䟋1-3: 実行順序の確認
println("Good night");
println("Good bye");
println("Hello");
// 出力:
// Good night
// Good bye
// Hello

コヌドを蚘述する際は、凊理をどのような順番で実行したいかをきちんず考える必芁がありたす。

2. デヌタの䞀時保管倉数

プログラムでは、数倀や文字列などのデヌタを䞀時的に保管しおおく堎所が必芁です。それが「倉数」です。

倉数の必芁性

なぜ倉数が必芁なのでしょうか䟋えば、耇数のリンゎやミカンの䟡栌を蚈算するプログラムを考えおみたしょう。

// 䟋2-1: 倉数を䜿わない蚈算 (問題点: 分かりにくい、倉曎が困難)
println(100 * 5); // リンゎ5個
println(100 * 5 + 80 * 10); // リンゎ5個、ミカン10個
println(100 * 80 + 80 * 100); // リンゎ80個、ミカン100個

このコヌドでは、100がリンゎの䟡栌、80がミカンの䟡栌だず掚枬できたすが、ぱっず芋お䜕をしおいるか分かりにくいです。もしリンゎやミカンの䟡栌が倉わったら、プログラム䞭のすべおの数倀を手動で倉曎しなければならず、ミスも起こりやすくなりたす。

そこで、倉数を䜿いたす。倉数には「名札」のように名前を付け、デヌタを関連付けたす。

// 䟋2-2: 倉数を䜿った蚈算 (可読性、倉曎容易性が向䞊)
int applePrice = 100; // リンゎの䟡栌
int orangePrice = 80; // ミカンの䟡栌

println(applePrice * 5);
println(applePrice * 5 + orangePrice * 10);
println(applePrice * 80 + orangePrice * 100);
// 出力は䟋2-1ず同じですが、コヌドの意図が明確になりたす。

倉数の宣蚀、代入、参照

倉数を䜿うには、以䞋の3぀のステップが必芁です:

  1. 宣蚀: 倉数の「型」ず「名前」を決めたす。Processingでは、倉数の宣蚀時にデヌタの皮類型を明瀺する必芁がありたす。
    • int: 敎数䟋: 1, 0, -27
    • float: 実数浮動小数点数䟋: 1.2, 0.0, -27.3
    • char: 文字䟋: 'A', 'b', '#'
    • String: 文字列䟋: "Hello", "HEY"
    • boolean: 真停倀trueたたはfalse
  2. 代入: 倉数にデヌタを栌玍したす。代入には代入挔算子=を䜿いたす。文字列はダブルクォヌテヌション、文字はシングルクォヌテヌションで囲みたす。宣蚀ず同時に初期倀を䞎えるこずも可胜です。
  3. 参照: 倉数に栌玍されたデヌタを利甚したす。
// 䟋2-3: 倉数の宣蚀、代入、参照
// 宣蚀
int score;
String name;
boolean isStudent;

// 代入 (初期化)
score = 95;
name = "Alice";
isStudent = true;

// 参照
println("名前: " + name);
println("点数: " + score);
println("孊生ですか: " + isStudent);

// 宣蚀ず同時に初期化
float pi = 3.14;
println("円呚率: " + pi);

適切な倉数名

倉数名にはルヌルず習慣がありたす。

  • lower camel case: 耇数の単語からなる倉数名は、最初の単語の先頭は小文字、それ以降の単語の先頭は倧文字にしたす䟋: greenApplePrice。
  • 内容が分かるように: price1, price2よりもapplePrice, orangePriceのように、䜕を衚すのか明確な名前を付けたしょう。
  • 短く適切に: applicationをappのように省略するこずもありたすが、これはある皋床の知識・経隓が必芁です。

3. 数倀の蚈算算術挔算子

Processingでは、算術挔算子を䜿っお四則挔算や剰䜙挔算を行うこずができたす。

算術挔算子䞀芧

算術挔算子 圹割
+ 加算
- 枛算
* 乗算
/ 陀算
% 剰䜙挔算

泚意敎数同士の陀算

非垞に重芁なポむントです 敎数同士の陀算では、商の小数点以䞋は切り捚おられたす。挔算察象に1぀でも実数float型があれば、結果は実数になりたす。

// 䟋3-1: 敎数同士の陀算ず実数を含む陀算
println(10 / 3);   // 出力: 3 (小数点以䞋切り捚お)
println(5 / 2);    // 出力: 2 (小数点以䞋切り捚お)

println(10 / 3.0); // 出力: 3.3333333 (実数を含むため切り捚おなし)
println(5.0 / 2);  // 出力: 2.5 (実数を含むため切り捚おなし)

この挙動は、意図しないバグの原因ずなるこずが倚いため、蚈算を行う際には垞に「蚈算過皋で倀が敎数なのか実数なのか」を意識するようにしたしょう。

剰䜙挔算

%挔算子は、陀算の䜙りを求めたす。倍数や玄数の刀定、呚期性のある倀の蚈算などによく利甚されたす。

// 䟋3-2: 剰䜙挔算
println(11 % 3);   // 出力: 2 (11を3で割るず商は3、䜙りは2)
println(5 % 2);    // 出力: 1 (5を2で割るず商は2、䜙りは1)
println(100 % 30 % 3); // 出力: 1 (100 % 30 = 10, 10 % 3 = 1)

挔算子の優先順䜍

数孊ず同様に、挔算子には蚈算の優先順䜍がありたす。同じ優先順䜍の堎合は、前に曞かれおいる方が先に蚈算されたす。

  1. ()で括られた範囲 (最優先)
  2. *, /, %
  3. +, - (最䜎優先床)
// 䟋3-3: 挔算子の優先順䜍
println(4 * 3 / 2 * 3);  // (4 * 3) / 2 * 3 = 12 / 2 * 3 = 6 * 3 = 18
println(4 * 3 / (2 * 3)); // 4 * 3 / 6 = 12 / 6 = 2
println(3 / 2 * 2);      // (3 / 2) * 2 = 1 * 2 = 2 (敎数陀算の切り捚おに泚意)
// 出力:
// 18
// 2
// 2

4. 凊理の分岐条件分岐

プログラムの実行䞭に、ある条件に応じお凊理の流れを倉えたい堎合がありたす。これが「条件分岐」です。

真停倀ず比范挔算子

条件分岐では、ある条件が「成立するか真 / true」たたは「䞍成立か停 / false」を刀定する必芁がありたす。この真停を衚す倀が「真停倀」で、Processingではboolean型で扱いたす。

条件の真停を刀定するためには、「比范挔算子」を䜿いたす。

蚘号 説明
== 等しい
!= 等しくない
> より倧きい
< より小さい
>= 以䞊
<= 以䞋

比范挔算子の結果はboolean型になりたす。

// 䟋4-1: 比范挔算子
println(1 == 1); // true
println(1 != 2); // true
println(2 > 1);  // true
println(1 < 2);  // true
println(1 >= 1); // true
println(1 <= 2); // true

println(1 == 2); // false
println(1 != 1); // false
println(2 > 3);  // false
println(1 < 0);  // false
println(1 >= 2); // false
println(1 <= 0); // false

if文

if文は、条件匏testの結果がtrueであれば、その䞭にある凊理statementsを実行したす。falseであれば䜕も実行したせん。

// 䟋4-2: if文の基本
int age = 19;

if (age < 20) {
  println("You cannot drink.");
}
// 出力: You cannot drink.

else文

if文にelse文を組み合わせるず、条件匏の結果がtrueの堎合ずfalseの堎合で、それぞれ異なる凊理を実行できたす。

// 䟋4-3: if-else文
int age = 25;

if (age < 20) {
  println("You cannot drink.");
} else {
  println("You can drink.");
}
// 出力: You can drink.

else if文

3぀以䞊の条件で凊理を分岐させたい堎合は、else if文を耇数䜿甚できたす。䞊から順に条件匏が評䟡され、最初にtrueになったブロックの凊理が実行されたす。

// 䟋4-4: else if文
int score = 85;

if (score >= 90) {
  println("Great!");
} else if (score >= 80) { // scoreが90未満で、か぀80以䞊の堎合
  println("Good!");
} else {
  println("Keep practicing.");
}
// 出力: Good!

論理挔算子

耇数の条件を組み合わせおより耇雑な条件を衚珟するために、「論理挔算子」を䜿いたす。

  • && (AND/論理積): 䞡方の条件がtrueの堎合にtrue。
  • || (OR/論理和): どちらか䞀方たたは䞡方の条件がtrueの堎合にtrue。
  • ! (NOT/吊定): 条件がfalseの堎合にtrue条件の真停を反転させる。

論理挔算子にも優先順䜍がありたす。

  1. ()で括られた範囲 (最優先)
  2. !
  3. &&
  4. || (最䜎優先床)

同じ優先順䜍の堎合は、巊から順に蚈算されたす。

泚意点: &&ず||には「短絡評䟡ショヌトサヌキット評䟡」ずいう性質がありたす。

  • &&: 巊偎の条件がfalseの堎合、右偎の条件は評䟡されたせん結果が必ずfalseになるため。
  • ||: 巊偎の条件がtrueの堎合、右偎の条件は評䟡されたせん結果が必ずtrueになるため。

これは、意図しない゚ラヌを防ぐためにも重芁です。䟋えば、配列の範囲チェックず芁玠ぞのアクセスを&&で結合する堎合、範囲チェックを先に曞くべきです。

// 䟋4-5: 論理挔算子ず優先順䜍
int x = 15;
int y = 12;

// AND (&&)
if (x >= 10 && x < 20) {
  println("xは10以䞊20未満です。"); // true && true -> true
}

// OR (||)
if (y >= 10 || y % 5 == 0) {
  println("yは10以䞊、たたは5の倍数です。"); // true || false -> true
}

// NOT (!)
boolean isSunny = false;
if (!isSunny) {
  println("晎れおいたせん。"); // !false -> true
}

// 優先順䜍の䟋 (p || q && r) -> p || (q && r)
boolean p = true;
boolean q = false;
boolean r = false;
if (p || q && r) { // true || (false && false) -> true || false -> true
  println("OK");
}
// 出力:
// xは10以䞊20未満です。
// yは10以䞊、たたは5の倍数です。
// 晎れおいたせん。
// OK

入れ子構造のif文

共通の条件がある堎合、if文を入れ子構造にするずコヌドが簡朔になりたす。内偎のブロックには、䞀段深いむンデントを入れるのがルヌルです。

// 䟋4-6: 入れ子構造のif文 (送料蚈算の䟋)
boolean member = true;
int price = 600;
int count = 15;
int total = price * count; // 合蚈金額 = 9000

if (member) { // 䌚員の堎合
  if (total < 10000) {
    println("送料: 300円");
  } else {
    println("送料: 無料");
  }
} else { // 非䌚員の堎合
  if (total <= 12000) {
    println("送料: 500円");
  } else {
    println("送料: 200円");
  }
}
// 出力: 送料: 300円

重芁: むンデントはコヌドの可読性を保぀ために非垞に重芁です。䞍適切なむンデントは枛点察象になるこずがありたす。この蚘事の䟋では、半角スペヌス2個のむンデントを䜿甚しおいたす。

5. 凊理の繰り返しルヌプ

同じ凊理を䜕床も繰り返したい堎合に䜿うのが「繰り返しルヌプ」です。Processingには䞻にwhile文ずfor文がありたす。

while文

while文は、指定した条件匏testがtrueである限り、その䞭にある凊理statementsを繰り返し実行したす。

// 䟋5-1: while文の基本
int i = 0;
while (i < 5) { // iが5未満である限り繰り返す
  println(i);
  i++; // iの倀を1増やす (これを忘れるず無限ルヌプになる)
}
// 出力:
// 0
// 1
// 2
// 3
// 4

無限ルヌプに泚意 while文の条件匏が垞にtrueになるように蚘述しおしたうず、プログラムが終了しなくなり、「無限ルヌプ」に陥りたす。繰り返し凊理の䞭で、条件匏に関わる倉数を適切に曎新する凊理を忘れないようにしたしょう。

// 䟋5-2: 無限ルヌプ (意図的に避けるべきコヌド)
// int i = 0;
// while (i < 5) {
//   println(i);
//   // i++; がないため、iは垞に0で、i < 5が垞にtrueずなり無限ルヌプ
// }

for文

for文は、初期化凊理init、条件匏test、曎新凊理updateの3぀の芁玠を1行で蚘述できる繰り返し凊理です。

// 䟋5-3: for文の基本
for (int i = 0; i < 5; i++) { // iを0で初期化、iが5未満である限り繰り返し、1回ごずにiを1増やす
  println(i);
}
// 出力:
// 0
// 1
// 2
// 3
// 4

for文は、繰り返し回数が事前に分かっおいる堎合に特に適しおいたす。

while文ずfor文の䜿い分け

  • for文: 繰り返しの回数が事前に明らかである堎合や、カりンタ倉数の初期化・曎新が明瀺的な方がミスしにくい堎合に適しおいたす。
  • while文: 繰り返しの回数が事前に䞍明な堎合や、曎新凊理が耇雑で条件によっお異なる堎合に曞きやすいです。

どちらの文も同じような凊理を実珟できたすが、適切な方を遞択するこずでコヌドの可読性やメンテナンス性が向䞊したす。

入れ子構造のルヌプ

if文ず同様に、ルヌプも入れ子構造にするこずができたす。䟋えば、2次元のパタヌンを描画したり、九九の衚を生成したりするのに䟿利です。

// 䟋5-4: 入れ子構造のfor文 (九九の衚の䟋)
for (int i = 1; i <= 9; i++) { // 段
  for (int j = 1; j <= 9; j++) { // 数
    int x = i * j;
    if (x < 10) { // 桁を揃えるために1桁の数字の前にスペヌスを远加
      print(" ");
    }
    print(x + " ");
  }
  println(); // 1段終わったら改行
}
// 出力:
//  1  2  3  4  5  6  7  8  9
//  2  4  6  8 10 12 14 16 18
//  3  6  9 12 15 18 21 24 27
//  4  8 12 16 20 24 28 32 36
//  5 10 15 20 25 30 35 40 45
//  6 12 18 24 30 36 42 48 54
//  7 14 21 28 35 42 49 56 63
//  8 16 24 32 40 48 56 64 72
//  9 18 27 36 45 54 63 72 81

高床な代入挔算子ずむンクリメント/デクリメント挔算子

ルヌプ凊理で頻繁に利甚されるのが、倉数ぞの加枛乗陀を簡朔に蚘述できる「高床な代入挔算子」ず、倀を1増枛させる「むンクリメント/デクリメント挔算子」です。

蚘号 説明
+= 巊蟺に右蟺を加算し代入
-= 巊蟺に右蟺を枛算し代入
*= 巊蟺に右蟺を乗算し代入
/= 巊蟺に右蟺を陀算し代入
++ 倉数の倀を1増やす埌眮の堎合、文実行埌に増える
-- 倉数の倀を1枛らす埌眮の堎合、文実行埌に枛る
// 䟋5-5: 高床な代入挔算子ずむンクリメント/デクリメント
int a = 10;
a += 5; // a = a + 5; ず同じ -> aは15
println("a: " + a);

int b = 20;
b -= 3; // b = b - 3; ず同じ -> bは17
println("b: " + b);

int c = 2;
c *= 4; // c = c * 4; ず同じ -> cは8
println("c: " + c);

int d = 10;
d /= 2; // d = d / 2; ず同じ -> dは5
println("d: " + d);

int x = 5;
println("x++ (埌眮むンクリメント): " + (x++)); // 5が衚瀺され、その埌xが6になる
println("xの倀: " + x);

int y = 5;
println("++y (前眮むンクリメント): " + (++y)); // yが6になり、その埌6が衚瀺される
println("yの倀: " + y);
// 出力:
// a: 15
// b: 17
// c: 8
// d: 5
// x++ (埌眮むンクリメント): 5
// xの倀: 6
// ++y (前眮むンクリメント): 6
// yの倀: 6

6. デヌタの集合配列

これたでの倉数では、䞀぀の箱に䞀぀のデヌタしか栌玍できたせんでした。倧量の䌌たようなデヌタを扱いたい堎合、䞀぀䞀぀倉数を甚意するのは非効率的です。そこで登堎するのが「配列」です。

配列は、同じ型の耇数のデヌタを1぀の集合ずしお扱うこずができるデヌタ構造です。集合内の各デヌタは、添字むンデックスず呌ばれる番号で区別したす。添字は0から始たりたす。

配列の宣蚀ず初期化

配列の宣蚀方法は䞻に2぀ありたす。

  1. 芁玠数のみを指定しお宣蚀: 各芁玠はデフォルト倀で初期化されたす。

    datatype[] array = new datatype[length];
    
    • datatype: int, float, Stringなどの型。
    • length: 配列に栌玍できるデヌタの数。
    // 䟋6-1: 芁玠数のみを指定しお宣蚀
    int[] scores = new int; // int型の芁玠5個分の配列
    // scoresの内容: {0, 0, 0, 0, 0} (intのデフォルト倀は0)
    scores = 85;
    scores = 92;
    println(scores); // 添字0の芁玠を参照 -> 出力: 85
    
  2. 初期倀を指定しお宣蚀: 波括匧{}で囲んで初期倀を指定したす。

    datatype[] array = {value_1, ..., value_n};
    
    // 䟋6-2: 初期倀を指定しお宣蚀
    String[] fruits = {"Apple", "Banana", "Cherry"};
    // fruitsの内容: {"Apple", "Banana", "Cherry"}
    println(fruits); // 出力: Apple
    println(fruits); // 出力: Cherry
    

配列の芁玠数配列長は、array.lengthで取埗できたす。

配列の走査

配列の各芁玠に順番にアクセスする操䜜を「走査トラバヌサル」ず呌びたす。ルヌプを䜿うず、配列の党芁玠ぞのアクセスが容易になりたす。

// 䟋6-3: 配列の党芁玠走査 (順方向)
int[] data = {10, 20, 30, 40, 50};
for (int i = 0; i < data.length; i++) {
  print(data[i] + " ");
}
println(); // 出力: 10 20 30 40 50 
// 䟋6-4: 配列の党芁玠走査 (逆方向)
int[] data = {10, 20, 30, 40, 50};
for (int i = data.length - 1; i >= 0; i--) { // 末尟から先頭ぞ
  print(data[i] + " ");
}
println(); // 出力: 50 40 30 20 10 

特定の範囲や1぀おきの芁玠を走査するこずも可胜です。

// 䟋6-5: 配列の䞀郚芁玠走査 (前半 - 䞭倮芁玠を含む)
int[] data = {10, 20, 30, 40, 50, 60, 70, 80, 90}; // 芁玠数9 (奇数)
// data.length / 2 は 9 / 2 = 4 (敎数陀算)
// <= data.length / 2 ずするこずで䞭倮の芁玠(data=50)も含む
for (int i = 0; i <= data.length / 2; i++) {
  print(data[i] + " ");
}
println(); // 出力: 10 20 30 40 50 
// 䟋6-6: 配列の䞀郚芁玠走査 (1぀おき)
String[] messages = {"Nihon", "Japan", "University", "School", "CHS", "Bunri"};
for (int i = 0; i < messages.length; i += 2) { // 2぀ず぀むンクリメント
  print(messages[i] + " ");
}
println(); // 出力: Nihon University CHS 

配列芁玠の操䜜

配列の芁玠を入れ替えたり、挿入したりするこずもできたす。

  • 芁玠の入れ替え: 2぀の芁玠を入れ替えるには、䞀時的に倀を退避させるためのバッファ倉数が必芁です。

    // 䟋6-7: 芁玠の入れ替え
    int[] data = {10, 20, 30, 40, 50};
    int buffer;
    
    // dataずdataを入れ替える
    buffer = data; // data (10) をbufferに退避
    data = data; // dataにdata (20) を代入 -> dataは{20, 20, 30, 40, 50}
    data = buffer; // dataにbuffer (10) を代入 -> dataは{20, 10, 30, 40, 50}
    
    for (int i = 0; i < data.length; i++) {
      print(data[i] + " ");
    }
    println(); // 出力: 20 10 30 40 50 
    
  • 芁玠順の反転: バッファ倉数を䜿った芁玠の入れ替えを応甚するず、配列の芁玠順を反転させるこずができたす。配列の半分たでを走査し、察称䜍眮にある芁玠同士を入れ替えたす。

    // 䟋6-8: 芁玠順の反転
    String[] strs = {"to", "have", "you", "before", "Change"};
    String buffer;
    
    for (int i = 0; i < strs.length / 2; i++) { // 配列の半分たで走査
      buffer = strs[i];
      strs[i] = strs[strs.length - 1 - i]; // strs.length - 1 - i で察称䜍眮の添字を蚈算
      strs[strs.length - 1 - i] = buffer;
    }
    
    for (int i = 0; i < strs.length; i++) {
      print(strs[i] + " ");
    }
    println(); // 出力: Change before you have to 
    
  • 芁玠の挿入: 配列の途䞭に新しい芁玠を挿入するには、既存の芁玠をずらす必芁がありたす。

    // 䟋6-9: 芁玠の挿入 (先頭から2番目の䜍眮に挿入し、末尟芁玠を削陀)
    int[] data = {10, 20, 30, 40, 50, 60, 70, 80, 90}; // 芁玠数9
    int targetPos = 2; // 挿入したい䜍眮 (dataの䜍眮)
    int newData = 1000; // 挿入したい新しいデヌタ
    
    // 挿入䜍眮より埌の芁玠を1぀ず぀埌ろにずらす
    // data.length - 1 (data=90) から targetPos + 1 (data=40) たで逆順にずらす
    for (int i = data.length - 1; i >= targetPos + 1; i--) {
      data[i] = data[i - 1];
    }
    data[targetPos] = newData; // 指定䜍眮に新しいデヌタを代入
    
    for (int i = 0; i < data.length; i++) {
      print(data[i] + " ");
    }
    println(); // 出力: 10 20 1000 30 40 50 60 70 80 
               // 元の90が削陀される圢になる
    

特定デヌタの怜玢

配列の䞭から、特定の倀を持぀デヌタを探すこずを「怜玢」ず呌びたす。

  • 線圢探玢: 配列の先頭から順番に、目的のデヌタず各芁玠を比范しおいく最も基本的な方法です。

    // 䟋6-10: 線圢探玢 (最初に登堎する䜍眮)
    int[] data = {10, 20, 30, 40, 50, 60, 40, 50, 50, 60};
    int target = 40;
    int i = 0;
    
    // 添字が配列範囲内であり、か぀、data[i]がtargetず等しくない限り繰り返す
    while (i < data.length && data[i] != target) {
      i++;
    }
    
    if (i < data.length) { // 芋぀かった堎合
      println(target + "は添字" + i + "にありたす。");
    } else { // 芋぀からなかった堎合
      println(target + "は芋぀かりたせんでした。");
    }
    // 出力: 40は添字3にありたす。
    
  • 特定デヌタの出珟回数を数える: for文を䜿っお配列党䜓を走査し、条件に合う芁玠が芋぀かるたびにカりンタを増やしたす。

    // 䟋6-11: 特定デヌタの出珟回数を数える
    int[] data = {10, 20, 30, 40, 50, 60, 40, 50, 50, 60};
    int target = 50;
    int count = 0;
    
    for (int i = 0; i < data.length; i++) {
      if (data[i] == target) {
        count++;
      }
    }
    println(target + "は" + count + "回出珟したす。");
    // 出力: 50は3回出珟したす。
    

7. 描画ずアニメヌション

Processingの倧きな魅力は、簡単なコヌドで図圢を描画したり、アニメヌションを実珟したりできる点です。

Windowず座暙系

  • size(w, h);: 描画領域Windowの幅wず高さhをピクセル単䜍で指定したす。
  • 座暙系: Windowの巊䞊が原点(0, 0)です。x軞は右方向、y軞は䞋方向が正の方向になりたす。
  • width, height: Processingが自動的にWindowの幅ず高さを保持する倉数です。

基本図圢の描画

  • ellipse(x, y, w, h);: 䞭心座暙(x, y)、幅w、高さhの楕円を描画したす。wずhを同じにするず円になりたす。
  • rect(x, y, w, h);: 巊䞊頂点座暙(x, y)、幅w、高さhの長方圢を描画したす。wずhを同じにするず正方圢になりたす。
  • line(x1, y1, x2, y2);: 2点(x1, y1)ず(x2, y2)を結ぶ線分を描画したす。
  • triangle(x1, y1, x2, y2, x3, y3);: 3点(x1, y1), (x2, y2), (x3, y3)を結ぶ䞉角圢を描画したす。

色の指定

  • color(r, g, b);: 赀R、緑G、青Bの各成分0〜255を指定しお色を䜜成したす。
  • background(color);: Windowの背景色を指定したす。
  • fill(color);: 図圢の内偎の塗り色を指定したす。
  • stroke(color);: 図圢の茪郭線の色を指定したす。
  • noStroke();: 図圢の茪郭線を衚瀺しないようにしたす。

䞀床指定した色は、新たに指定するたで有効です。

// 䟋7-1: 基本図圢ず色の描画
void setup() {
  size(600, 400); // Windowサむズを蚭定
  noLoop(); // draw()を1回だけ実行する (アニメヌションしない堎合)
}

void draw() {
  // 背景色を黒に蚭定
  background(color(0, 0, 0));

  // 緑色の円を描画
  fill(color(0, 255, 0)); // 塗り色を緑に蚭定
  ellipse(width / 4, height / 2, 100, 100); // Window巊半分に円

  // 青色の四角圢を描画
  fill(color(0, 0, 255)); // 塗り色を青に蚭定
  rect(width / 2, height / 4, 100, 100); // Window右䞊に四角圢

  // 茪郭線のある赀い䞉角圢
  stroke(color(255, 0, 0)); // 茪郭線を赀に蚭定
  strokeWeight(5); // 茪郭線の倪さを5に蚭定
  fill(color(255, 255, 0)); // 塗り色を黄色に蚭定
  triangle(width * 3 / 4, height * 3 / 4, width * 3 / 4 + 50, height * 3 / 4 - 100, width * 3 / 4 + 100, height * 3 / 4);
}

倉数を甚いた描画

描画においおも倉数を甚いるこずは重芁です。特に、オブゞェクトの䜍眮を管理する際に、基準点を倉数で定矩するず、党䜓の移動が容易になりたす。

// 䟋7-2: 倉数を䜿った家の描画
int houseX = 200; // 家の基準点X
int houseY = 300; // 家の基準点Y

void setup() {
  size(800, 600);
  noLoop();
}

void draw() {
  background(255, 255, 255); // 癜い背景

  // 屋根
  fill(color(200, 50, 50));
  triangle(houseX + 200, houseY - 100, houseX, houseY, houseX + 400, houseY);

  // 壁
  fill(color(150, 75, 0));
  rect(houseX, houseY, 400, 200);

  // 窓
  fill(color(50, 50, 200));
  ellipse(houseX + 50, houseY + 50, 50, 50);
  ellipse(houseX + 150, houseY + 50, 50, 50);

  // ドア
  fill(color(200, 200, 0));
  rect(houseX + 300, houseY + 100, 50, 100);
}

houseXやhouseYの倀を倉曎しお実行しおみおください。家党䜓が移動するのを確認できるでしょう。

アニメヌションの実珟

アニメヌションは、耇数の静止画を連続しお衚瀺するこずで、描画察象が動いおいるように芋せる技法です。Processingでは、「Activeモヌド」ずいう特別なモヌドを䜿いたす。

  • setup()関数: プログラム実行盎埌に1回だけ実行されたす。Windowの蚭定や初期化など、䞀床だけ行う準備凊理を蚘述したす。
  • draw()関数: setup()の埌に、手動で終了するたで氞遠に繰り返しお実行されたす。アニメヌションの各フレヌムごずの描画凊理を蚘述したす。
// 䟋7-3: ボヌルの移動アニメヌション
int ballX;    // ボヌルの䞭心x座暙
int ballY;    // ボヌルの䞭心y座暙
int ballD = 50; // ボヌルの盎埄
int xStep = 5;  // x方向の移動量
int yStep = 3;  // y方向の移動量

void setup() {
  size(800, 600);
  ballX = width / 2;  // 初期䜍眮をWindow䞭倮に蚭定
  ballY = height / 2;
}

void draw() {
  background(0); // 背景を黒でクリア (前のフレヌムを消す)

  // ボヌルの描画
  ellipse(ballX, ballY, ballD, ballD);

  // ボヌルの䜍眮を曎新
  ballX += xStep;
  ballY += yStep;

  // ボヌルがWindowの端に到達したら跳ね返る
  // x軞方向の跳ね返り (ボヌル党䜓がWindow内に収たるように)
  if (ballX < ballD / 2 || ballX > width - ballD / 2) {
    xStep *= -1; // 移動方向を反転
  }
  // y軞方向の跳ね返り (ボヌル党䜓がWindow内に収たるように)
  if (ballY < ballD / 2 || ballY > height - ballD / 2) {
    yStep *= -1; // 移動方向を反転
  }
}

このコヌドを実行するず、ボヌルがWindowの端で跳ね返りながら動き続けるアニメヌションが実珟できたす。draw()関数が繰り返し実行されるこずで、ボヌルの䜍眮が少しず぀曎新され、それが連続した動きに芋えるのです。

むンタラクティブアニメヌション

ナヌザヌの操䜜マりスの動きなどに応じお動きを倉える「むンタラクティブアニメヌション」も実珟できたす。

  • mouseX, mouseY: マりスポむンタの珟圚のx座暙ずy座暙を保持する倉数です。
  • dist(x1, y1, x2, y2);: 2点間の距離を蚈算する関数です。
// 䟋7-4: マりスポむンタず連動する円
void setup() {
  size(600, 400);
}

void draw() {
  background(220); // 薄い灰色で背景をクリア

  float circleX = width / 2;
  float circleY = height / 2;
  float circleDiameter = 100;

  // マりスポむンタが円の内郚にあるか刀定
  // dist()でマりスポむンタから円の䞭心たでの距離を蚈算し、半埄ず比范
  if (dist(mouseX, mouseY, circleX, circleY) < circleDiameter / 2) {
    fill(255, 0, 0); // 円の内郚にあれば赀
  } else {
    fill(0, 0, 255); // なければ青
  }

  ellipse(circleX, circleY, circleDiameter, circleDiameter);
}

このコヌドを実行し、マりスを円の䞊に乗せたり倖したりしおみおください。円の色が倉わるのを確認できるでしょう。

最埌に実践あるのみ

この蚘事の到達目暙は、プログラミング胜力ず論理的思考胜力の習埗です。
たずは実践ずしおコピペ、写経、そしおアレンゞを加えおみたしょう。

Discussion