旧・課題集3(ブロック崩し、パックマン、横スクロールアクションゲーム、三目並べ、オセロ、テトリス)
1.ブロック崩しを作ろう 【レベル8】
- 画面内にボールが動き回るようにしよう
- ラケットを配置して、左右のキーで動かそう
- ラケットにボールが当たったら跳ね返らせよう
- ブロックを配置しよう(配列とfor文を使うと簡単です)
- ボールがブロックに当たったらブロックが消えるようにしよう
- 画面内に得点を表示させよう
- ブロックが全部消えたら終了画面を表示させよう
応用問題
- ブロックは3回当たってから消えるようにしよう
- ブロックに1回当たるごとにブロックの色が変わるようにしよう
- ブロックが10個(個数はいくつでもよい)消えたらボールを1つ増やそう
- 効果音を追加しよう
サンプル例(オリジナル作品)
(旧さいたま校 Nさん)
(旧さいたま校 K君)
2.パックマン風ゲームを作ろう 【レベル8】
- はじめにマップ(ステージ)を描こう(ヒント1)
- パックマン(自分)を配置して、上下左右のキーで動かそう
- パックマンが壁に衝突すると進めないようにしよう
- マップ上にパックマンが食べるドット(えさ)を追加しよう
- パックマンがドットを食べると、ドットが消えるようにしよう
- ドットを食べた数を得点として表示させよう
- 敵を追加して動かそう
- 敵が壁に当たるとランダムに向きを変えてから動くようにしよう
- なるべくパックマンに向かってくるようにしよう
- ある位置をパックマンが通過したら、別の位置へワープさせよう
- ある時間が経過したら敵の動きを速くしよう
- パックマンが敵に当たると終了画面を表示させよう
- パックマンがドットを全部食べたら、次のステージへ移動させよう
応用問題
- 画面をスクロールさせよう(ヒント2)
サンプル例
(黄:パックマン、白:敵、赤:ドット)
ヒント1
例えば、こんなマップを描きたいとします。青色が川、緑色が陸です。
このマップを正方形で分割して考えます。今回は、行数を5列数を6として分割しました。
分割したそれぞれの正方形を、緑色は値「0」、青色の正方形は値「2」とします。 これを2次元配列で表すと次のようになります。
int map1 [][] = { {0, 0, 0, 2, 2, 0}, {2, 2, 2, 2, 2, 0}, {2, 2, 2, 2, 2, 0}, {2, 2, 0, 0, 0, 0}, {2, 2, 0, 0, 0, 0}};
for文とif文を使えば、マップを簡単に描くことが出来ます。
for (int i = 0; i < 5; i++) { for (int j = 0; j < 6; j++) { if (map1[i][j] == 0) { fill(0, 255, 0); // 緑 } else if (map1[i][j] == 2) { fill(0, 0, 255); // 青 } noStroke(); rect(j*50, i*50, 50, 50); // 正方形の幅は50 }}
上の例では、行数が5列数が6の2次元配列ですが、行列の数を増やすことで、広大なステージを作成することが出来ます。
ヒント2
画面のスクロールを行うには幾つかの方法がありますが、関数 translate
を使うと簡単に実現出来ます。
https://processing.org/reference/translate_.html
3.横スクロールアクションゲームを作ろう 【レベル8】
- マップ(ステージ)を描こう
- 画面をスクロールさせよう(ヒント1)
- キャラクターをジャンプさせよう
- キャラクターの下が壁だったら止まるようにしよう
- キャラクターの上が壁だったら跳ね返るようにしよう
- キャラクターの右(左)が壁だったら進めないようにしよう
- 敵キャラを追加しよう
- アイテムを追加して、キャラクターがアイテムを取ったら10秒間(何秒でもよい)無敵にさせよう
- 別のマップ(2面)を作り、キャラクターがゴールしたら2面へ移るようにしよう
ヒント1
図の青い枠内が画面(見えている部分)だとすると、スクロール中はキャラクターが画面中央に常にいるようにします。但し画面の両端付近では、キャラクターは画面の左右に移動できるようにします。
※動画内の横スクロールアクションゲームのコードです。
zipファイル内の「sketch_to_TXTFile」はステージを作るためのプログラムです。 左クリック、右クリックでブロックを置いたり削除したりします。 また、sキーを押すとsketch_to_TXTFileフォルダ内に「field(数字).txt」という名前でtxtファイルが作られるので、中身をコピペするとステージ用の2次元配列の宣言が楽になると思います。 (コピペした時は末尾の「,」に注意してください) ステージの大きさを変えたい場合には、中のコードを書き換えてみてください。
4.三目並べを作ろう 【レベル8】
〇×ゲームと同じですね。
- 盤面を描こう(横3縦3で区切ります)
- マウスでクリックした位置に石を表示しよう
- 縦・横・斜めのどれかに同じ色の石が3つ揃ったら、終了するようにしよう
- コンピュータ対戦にしよう
応用問題
- 五目並べを作ろう(盤面は横19縦19で区切ります)
サンプル例
動画内の三目並べのコードです。
5.オセロを作ろう 【レベル8】
- 盤面を描こう(横8縦8に区切ります)
- 中央に白と黒の石を斜めに2つ並べよう
- 相手の石を挟む位置をクリックした時、自分の石を表示して挟んだ石を自分の石の色に変えよう
- コンピュータ対戦にしよう
サンプル例(オリジナル作品)
(旧さいたま校 S君) (ランダムな位置に石を配置してから、白の手番のみで行っています)
6.テトリスを作ろう 【レベル8】
- 画面を作ろう (ヒント1)
- 落ちてくるブロックを一つ作ろう (ヒント2)
- ブロックを画面内に表示させよう (ヒント3)
- ブロックを上から落下させよう
- 左右のキーでブロックを動かそう
- ブロックが左右及び下の壁を突き抜けないようにしよう
- ブロックを積もう
- 下の壁に触れたらブロックを固定させよう
- ブロックを固定させたら上からまた落ちてくるようにしよう
- ブロックを固定させたら別のブロックが落ちてくるようにしよう
- ブロックが横に揃ったらその行を消そう
- 得点を表示しよう
- ある時間が経過したらブロックの落下速度を変えよう
- シフトキーでブロックを回転させよう
サンプル例
(ブロックの種類は3つのみ、回転なし)
ヒント1
画面は2次元配列を使って描きます。 サンプル例では、25行12列の2次元配列にしました。 画面の左右及び下端を壁にすると、当たり判定が簡単になります。
int ROW = 25;int COL = 12;int map[][] = new int [ROW][COL];
// 画面を描く// 壁は値『1』その他は『0』として2次元配列mapの各データを設定する for (int i = 0; i < ROW; i++) { for (int j = 0; j < COL; j++) { /* ここに処理を書く */ } }
ヒント2
落ちてくるブロックも2次元配列で作ります。 サンプル例では、横4縦4の2次元配列で作りました。
int BLOCK_ROW = 4;int BLOCK_COL = 4;int block[][] = new int [BLOCK_ROW][BLOCK_COL];
// 正方形ブロックの場合 // 値『1』はブロック、値『0』は表示しないとすると for (int i = 0; i < BLOCK_ROW; i++) { for (int j = 0; j < BLOCK_COL; j++) { block[i][j] = 0; } } block[1][1] = 1; block[1][2] = 1; block[2][1] = 1; block[2][2] = 1;
ヒント3
例えばブロックを表す2次元配列全体を、map上の[0][4]の位置から表示させたい場合は、
int block_x = 4; // map上の位置xint block_y = 0; // map上の位置y
for (int i = 0; i < BLOCK_ROW; i++) { for (int j = 0; j < BLOCK_COL; j++) { if (block[i][j] == 1) { fill(255, 0, 0); // ブロックの色を赤に設定 /* 変数 block_x、block_yを使ってrect()を書く */ } }}
動画内のテトリスのコードです。