情報システム設計論II ユーザインタフェース(1)

Similar documents
情報システム設計論II ユーザインタフェース(1)

Microsoft PowerPoint P演習 第10回 関数.ppt [互換モード]

問 1 図 1 の図形を作るプログラムを作成せよ 但し ウィンドウの大きさは と し 座標の関係は図 2 に示すものとする 図 1 作成する図形 原点 (0,0) (280,0) (80,0) (180,0) (260,0) (380,0) (0,160) 図 2 座標関係 問 2

スライド 1

情報システム設計論II ユーザインタフェース(1)

pp2018-pp9base

Processingをはじめよう

情報システム設計論II ユーザインタフェース(1)

pp2018-pp4base

Microsoft PowerPoint P演習 第5回 当たり判定(2)【課題】.pptx

Microsoft PowerPoint - [150421] CMP実習Ⅰ(2015) 橋本 CG編 第1回 幾何変換.pptx

設問 println はそこで指定されている内容を出力して改行するものである. 一方,print は内容を出力して改行しないものである. 下記のプログラムそれぞれについて出力結果がどうなるか回答せよ. 下記のプログラム - を実行すると, fms という文字列が 回表示される. プログラム - vo

課題


C プログラミング演習 1( 再 ) 2 講義では C プログラミングの基本を学び 演習では やや実践的なプログラミングを通して学ぶ

プログラミング演習 Ⅰ 第 14 回 2017/6/5( 月 ) ゲームを作る クイズ 担当 : 紅林林

<4D F736F F D B B83578B6594BB2D834A836F815B82D082C88C60202E646F63>

Processing入門マニュアル17

今回のプログラミングの課題 ( 前回の課題で取り上げた )data.txt の要素をソートして sorted.txt というファイルに書出す ソート (sort) とは : 数の場合 小さいものから大きなもの ( 昇順 ) もしくは 大きなものから小さなもの ( 降順 ) になるよう 並び替えること

アクション講座 第1回目

情報システム設計論II ユーザインタフェース(1)

大容量情報検索論

Processingをはじめよう

7 ポインタ (P.61) ポインタを使うと, メモリ上のデータを直接操作することができる. 例えばデータの変更 やコピーなどが簡単にできる. また処理が高速になる. 7.1 ポインタの概念 変数を次のように宣言すると, int num; メモリにその領域が確保される. 仮にその開始のアドレスを 1

Microsoft PowerPoint - 説柔5_間勊+C_guide5ï¼›2015ã•’2015æŒ°æŁŽæš’å¯¾å¿œç¢ºèª“æ¸‹ã†¿ã•‚.pptx

画像ファイルを扱う これまでに学んだ条件分岐, 繰り返し, 配列, ファイル入出力を使って, 画像を扱うプログラムにチャレンジしてみよう

Java講座

C#の基本2 ~プログラムの制御構造~

PowerPoint プレゼンテーション

Microsoft PowerPoint - diip ppt

PowerPoint プレゼンテーション

目次 1. アニメーションの軌跡の概要と仕組み 3 2. パノラマ写真にアニメーションの軌跡を設定 まとめ 課題にチャレンジ 19 レッスン内容 アニメーションの軌跡の概要と仕組み アニメーションの軌跡とは スライドに配置したオブジェクト ( テキストや図形 画像など ) を

マウス操作だけで本格プログラミングを - 世界のナベアツをコンピュータで - プログラムというと普通は英語みたいな言葉で作ることになりますが 今回はマウスの操作だけで作ってみます Baltie, SGP System 操作説明ビデオなどは 高校 情

Microsoft Word - macマニュアル【 】.doc

Mapmakerfor の手順下絵を準備 作者の設定した大きさで作成する場合 下絵にする地図を挿入 トリミングと大きさの調整 大きさを調整した画像を保存 下絵を背景に設定 作成画面の大きさを調整 1 自分で用意した下絵を背景にする場合 下絵を背景に設定 作成画面の大きさを調整 画像が大きい場合シート

目次 1. ログイン ログアウト デスクトップ ( 例 :Word Excel 起動中 ) Dock( 例 :Word Excel 起動中 ) Finder ウィンドウ メニューバー ( 例 :Word 起動中 )...

<4D F736F F D2089A E838D815B838B B838082C582C D834F F08A7782D42E646F6378>

スライド 1

プログラミング入門1

ToDo: 今回のタイトル

Word2007 Windows7 1 パンジーを描こう 暮らしのパソコンいろは 早稲田公民館 ICT サポートボランティア

初めてのプログラミング

CG

また RLF 命令は 図 2 示す様に RRF 命令とは逆に 各ビットを一つずつ 左方向に回転 ( ローテイト ) する命令である 8 ビット変数のアドレスを A とし C フラグに 0 を代入してから RLF A,1 を実行すると 変数の内容が 左に 1 ビットシフトし 最下位ビット (LSB)

Prog1_10th

Java言語 第1回

2 個の円の移動サンプル 9-2 float y0,y1; // 円の中心の Y 座標 float x0,x1; // 円の中心の X 座標 float v0,v1; // 円の縦方向の移動速度 int radius; size(300,400); radius = 10; v0 = random(

Microsoft PowerPoint - prog03.ppt

3

課題

20180308森の日県南支部 林

プログラミング入門1

PowerPoint プレゼンテーション

メソッドのまとめ

関数の定義域を制限する 関数のコマンドを入力バーに打つことにより 関数の定義域を制限することが出来ます Function[ < 関数 >, <x の開始値 >, <x の終了値 > ] 例えば f(x) = x 2 2x + 1 ( 1 < x < 4) のグラフを描くには Function[ x^

情報処理Ⅰ

<4D F736F F D2091E63589F182628CBE8CEA8D758DC08E9197BF2E646F6378>

Microsoft PowerPoint - [150428] CMP実習Ⅰ(2015) 橋本 CG編 第2回 ベジエ曲線とフラクタル.pptx

Microsoft PowerPoint - C4(反復for).ppt

PowerPoint プレゼンテーション

プログラミング方法論 II 第 14,15 回 ( 担当 : 鈴木伸夫 ) 問題 17. x 座標と y 座標をメンバに持つ構造体 Point を作成せよ 但し座標 は double 型とする typedef struct{ (a) x; (b) y; } Point; 問題 18. 問題 17 の

Microsoft Word - VBA基礎(3).docx

memo

Rerank-By-Example: Rerank Search Results by Operation

cp-7. 配列

14.event-handling

講習No.9

Microsoft PowerPoint - algo ppt [互換モード]

プログラミング基礎

Taro-再帰関数Ⅲ(公開版).jtd

情報システム設計論II ユーザインタフェース(1)

<4D F736F F D20438CBE8CEA8D758DC F0939A82C282AB2E646F63>

Microsoft Word - VB.doc

子ボックスや孫ボックスなどに position: absolute; と指定すると それぞれ親ボックスに対する絶対位置で配置できるので親ボックスの上に複数の子ボックスや孫ボックスを重ねて配置することができます トランジションやアニメーションを作成するときに非常に便利なので覚えておきましょう top

Prog1_6th

目次 1. フラッシュ型スライド教材を作ってみよう 2 2. 文字が順に消えていくスライド教材を作ってみよう 5 3. 文字が順に現れるスライド教材を作ってみよう 8 4. 音声とともに文字の色が変わるスライド教材を作ってみよう スライド教材を種類別にまとめてみよう 14 * 実践事例集

情報工学実験 C コンパイラ第 2 回説明資料 (2017 年度 ) 担当 : 笹倉 佐藤

Microsoft PowerPoint - OOP.pptx


サインイン 最初にサインインを行います サインインしたときとそうでないときでは 表示やメニューなどが少し違います アカウントがない場合 最初にアカウントを作りましょう サインインしていないとき サインインしたとき メッセージ 更新情報とお知らせがとどきます

PowerPoint2007基礎編

人工知能入門

2. 印刷対象のサイズの確認 大判印刷を行う場合 まず 印刷をする文書のサイズを確認する必要があります サイズの確認の方法はアプリケーションによって異なるので ここでは PowerPoint(2010/2013) と Adobe Acrobat を例に説明します PowerPoint2010 の場合

Microsoft Word - Scratch編_プログラム見本-Web用.docx

1. 花形の模様枠を作る 1 JTim の アイコンをクリックして起動します 2 背景色を 黒 にします 表示 背景色 黒 OK します 3 250*250 の 白 で新規作成します ファイル 新規作成 横 250*250 * キャンバスの色白 OK 4 範囲 60 で 円形 フェードアウトします

Microsoft Word - no11.docx

JavaプログラミングⅠ

Graphical User Interface 描画する

Wordでアルバム作成


課題

Taro-最大値探索法の開発(公開版

gengo1-8

仙台高等専門学校竹島研究室太田恭平 スイッチ教材ソフト ~ シャボン玉 ~ 今回はクリック教材としてシャボン玉というソフトを制作します クリックするとシャ ボン玉が膨らみ 飛んで行くというアニメーションです パワーポイント 2010 版で説明しています ( 操作によっては説明を端折っています ) 1

CG

Microsoft Word - 3new.doc

プログラミングA

PowerPoint プレゼンテーション

4 横髪と模様を描きます (1) 基本図形 月 を選び 図形を描きます 調整ハンドルを横方向いっぱいまでドラッグします 図形を細長く変形します 塗りつぶしの色 黒 (2) 線 曲線 を選び 下図の図形を描きます 黒い頂点の位置を確認しましょう 図形の塗りつぶし 標準の色 赤 コピー 変形 縮小 を繰

アプリケーション

Transcription:

プログラミング演習 (9) 多重配列 中村, 青山 小林, 橋本 1

目標 Processing で多重配列に挑戦! 2 次元のマス目に配置されたオブジェクトをどう扱っていくか? 課題 : オセロゲームを作ってみる ライツアウトを作ってみよう

2 次元配列の定義 int[][] square = new int [10][5]; 整数型で要素数が10x5 個の square という配列を作成 square の中に小箱が10x5できているイメージ square square[0][0] square[1][0]... square[9][0] square[0][1] square[1][1]... square[9][1] square[0][2] square[1][2]... square[9][2] square[0][3] square[1][3]... square[9][3] square[0][4] square[1][4]... square[9][4]

Tic Tac Toe Tic Tac Toe( マルバツゲーム ) を作ってみよう! と の変わりに, 白丸と黒丸で実現しよう! クリックする度に 何も置かれていない 白が置かれている 黒が置かれている と切り替える どうやってマス目に何が置かれているかを管理する? square という配列を用意し 何も置かれていないか 黒が置かれているか 白が置かれているか を管理する

どう考えるか? まずはマス目を描画してみよう line を 4 本引くことで描画することが可能 次に,1 つずつのマス目を配列で定義しよう square[3][3] という配列で管理する! 最初に配列を0で初期化し, 配列の値が0なら空白,1なら白色の丸,2なら黒色の丸を描画する. square[0][0] square[0][2] 2 1 2 1 1 2 square[2][0] square[2][2] 0 2 1

まず初期化! 2 次元配列の定義 変数の型 [][] 変数名 = new 変数の型 [ 要素数 ][ 要素数 ]; int [][] square = new int [3][3]; void setup(){ size( 300, 300 ); int x=0; while( x<3 ){ int y=0; while( y<3 ){ square[x][y] = 0; y++; x++; while 多重ループで 0 に初期化 3x3 の 2 次元配列の定義 int [][] square = new int [3][3]; void setup(){ size( 300, 300 ); for( int x=0; x<3; x++ ){ for( int y=0; y<3; y++ ){ square[x][y] = 0; for

描画する! square[x][y] の値に応じて描画 多重繰り返しで描画する ( 線の描画は省略 ) while void draw(){ background( 255 ); // ここで線を描画しておく int x=0; while( x<3 ){ int y=0; while( y<3 ){ if( square[x][y] == 0 ){ // 何も描画しない else if( square[x][y] == 1 ){ // 白丸を描画する else if( square[x][y] == 2 ){ // 黒丸を描画する y++; x++; for void draw(){ background( 255 ); // ここで線を描画しておく for( int x=0; x<3; x++ ){ for( int y=0; y<3; y++ ){ if( square[x][y] == 0 ){ // 何も描画しない else if( square[x][y] == 1 ){ // 白丸を描画する else if( square[x][y] == 2 ){ // 黒丸を描画する

マウスクリックでの変化 マウスクリックされた時に, そのクリックされた座標に応じて, どの配列の値を変更するかを考える! 1 マスが 100 ピクセルなので,mouseX 100 や,mouseY 100 の値 ( 値を切り捨てたもの ) が配列の添え字 ([] の中で指定する値 ) となる void mousepressed(){ // どこのマス目をクリックしたか // マス目の大きさが 100 なので int tx = mousex / 100; int ty = mousey / 100; square[tx][ty]++; if( square[tx][ty] > 2 ){ square[tx][ty] = 0;

Tic Tac Toe 改 Tic Tac Toe( マルバツゲーム ) を作ってみよう! と の変わりに, 白丸と黒丸で実現しよう! クリックするだけで白丸の後は黒丸, 黒丸の後は白丸を自動でおけるようにせよ 考え方 初期化とかは問題ない ターンという考え方を導入し, ターンに応じて置くコマを切り替える Tic Tac Toe のmousePressedだけを変更!

Tic Tac Toe 改 turn が0ならsquare[tx][ty] には1を,turnが1なら square[tx][ty] には2をセットする! クリックの度にturnの値を変化させる! int [][] square = new int [3][3]; int turn = 0; void setup(){ size( 300, 300 ); int x=0; while( x<3 ){ int y=0; while( y<3 ){ square[x][y] = 0; y++; x++; while for void mousepressed(){ int tx = mousex / 100; int ty = mousey / 100; if( turn == 0 ){ square[tx][ty] = 1; else { square[tx][ty] = 2; turn++; if( turn > 1 ){ turn = 0; もっと簡単に できないか?

Tic Tac Toe 改 turn を 1 と 2 が変化する変数にする turn が 1 なら square[tx][ty] には 1 を,turn が 2 なら square[tx][ty] には 2 をセットする! つまり turn を代入するだけで良い! int [][] square = new int [3][3]; int turn = 1; void setup(){ size( 300, 300 ); int x=0; while( x<3 ){ int y=0; while( y<3 ){ square[x][y] = 0; y++; x++; while void mousepressed(){ int tx = mousex / 100; int ty = mousey / 100; square[tx][ty] = turn; turn++; if( turn > 2 ){ turn = 1; for

Tic Tac Toe 改二 Tic Tac Toe( マルバツゲーム ) を作ってみよう! と の変わりに, 白丸と黒丸で実現しよう! クリックするだけで白丸の後は黒丸, 黒丸の後は白丸を自動でおけるようにせよ 他のコマが置かれている場所には置けないようにせよ 考え方 Tic Tac Toe 改をさらに改良するだけで良さそう! 置こうとしている場所に, すでにコマが置かれていたら ( 値が1 以上だったら ) 置けないようにする!

Tic Tac Toe 改二 そこに置かれているかどうかをチェックする! 0 なら置ける! 1 か 2 なら置けない! void mousepressed(){ int tx = mousex / 100; int ty = mousey / 100; if( square[tx][ty] == 0 ){ square[tx][ty] = turn; turn++; if( turn > 2 ){ turn = 1; else { // すでに置かれている場合は // なにもしないけど置けません! // と表示してもよい たったこれだけ! 勝敗判定をどうするかはもう少し学んでから

[ 演習 ] Lights Out 横 5 マス 縦 5 マスの盤面を作り そのマス目上をクリックするとクリックされたマス目の上下左右とそのマス目自体の色を反転させる Lights Out を作る まずは, クリックすると上下左右反転させるものを目指す

Lights Out 考え方 5x5 のマス目にそれぞれ黄色または黒色の正方形を描画する 5x5の配列を作る 配列の値が0の場合は黄色,1の場合は黒色とする マウスクリックされた座標がどのマス目に該当するかを計算する そのマス目および, 上下左右のマス目の値を反転させる 0と1の値の反転は square = 1 square を使うと簡単! だけど, もちろんif 文で書いても良い

まず初期化! 2 次元配列の定義 変数の型 [][] 変数名 = new 変数の型 [ 要素数 ][ 要素数 ]; int [][] square = new int [5][5]; void setup(){ size( 500, 500 ); int x=0; while( x<5 ){ int y=0; while( y<5 ){ square[x][y] = 0; y++; x++; while 多重ループで 0 に初期化 5x5 の 2 次元配列の定義 int [][] square = new int [5][5]; void setup(){ size( 500, 500 ); for( int x=0; x<5; x++ ){ for( int y=0; y<5; y++ ){ square[x][y] = 0; for

描画する! square[x][y] の値に応じて描画 多重繰り返しで描画する void draw(){ background( 255 ); while int x=0; while( x<5 ){ int y=0; while( y<5 ){ if( square[x][y] == 0 ){ // 黄色四角形を描画 else if( square[x][y] == 1 ){ // 黒色四角形を描画 y++; x++; 0 か 1 かで描画内容を変更 void draw(){ background( 255 ); for for( int x=0; x<5; x++ ){ for( int y=0; y<5; y++ ){ if( square[x][y] == 0 ){ // 黄色四角形を描画 else if( square[x][y] == 1 ){ // 黒色四角形を描画

マウスクリックでの変化 マウスクリックされた時に, そのクリックされた座標に応じて, どの配列の値を変更するかを考える! 1マスが100ピクセルなので,mouseX 100や,mouseY 100 の値 ( 値を切り捨てたもの ) が配列の添え字 ([] の中で指定する値 ) となる. また, その添え字の周辺が対象となる tx, ty を求めて, そこの周辺を考える! tx, ty-1 tx-1, ty tx, ty tx+1, ty tx, ty+1

マウスクリックでの変化 マウスクリックされた時に, そのクリックされた座標に応じて, どの配列の値を変更するかを考える! 1 マスが 100 ピクセルなので,mouseX 100 や,mouseY 100 の値 ( 値を切り捨てたもの ) が配列の添え字 ([] の中で指定する値 ) となる. また, その添え字の周辺が対象となる void mousepressed(){ // どこのマス目をクリックしたか // マス目の大きさが 100 なので int tx = mousex / 100; int ty = mousey / 100; square[tx][ty] = 1 - square[tx][ty]; square[tx-1][ty] = 1 - square[tx-1][ty]; square[tx+1][ty] = 1 - square[tx+1][ty]; square[tx][ty-1] = 1 - square[tx][ty-1]; square[tx][ty+1] = 1 - square[tx][ty+1]; 求めた tx, ty の周辺をそれぞれ 0 と 1 を反転させる if 文で書いても良いがここでは省略表記をしている

マウスクリックでの変化 上下左右を反転させようとするとエラーが出るのは配列の外を操作しようとしているから! つまり,tx-1やty-1,tx+1 やty+1が, 配列の外になっていないかをチェックする必要あり! if 文で判定してチェック! void mousepressed(){ int tx = mousex/100; int ty = mousey/100; square[tx][ty] = 1 - square[tx][ty]; if( tx-1 >= 0 ){ square[tx-1][ty] = 1 - square[tx-1][ty]; if( tx+1 < 5 ){ square[tx+1][ty] = 1 - square[tx+1][ty]; if( ty-1 >= 0 ){ square[tx][ty-1] = 1 - square[tx][ty-1]; if( ty+1 < 5 ){ square[tx][ty+1] = 1 - square[tx][ty+1]; このままでもよいけれど判定が少々面倒...

[ 演習 ] Lights Out 改 横 5マス 縦 5マス の盤面を作り そのマス目上をクリックするとクリックされたマス目の上下左右とそのマス目自体の色を反転させるLights Outを作る すべてが黒色になったらCLEAR! と表示する

考え方 黄色のマスの数を数えて, 合計が1 以上だったらクリアではなく, 合計が0だったらクリアと表示したら良い! やり方としては例えば下記の2つ mousepressedの時に数を数えて, その数が0だったらclearというフラグ変数を0から1にし,0の場合はゲームを表示し,1の場合は Clear! という画面を表示する drawの度に黄色の数を数えて, その数が1 以上だったらそのままゲームを表示し,0だったら Clear! という画面を表示する

clear 変数で管理 clear という変数を用意して, その変数の値を変化させる int clear = 0; void mousepressed(){ // 反転とかもろもろの処理は省略 while int clear = 0; void mousepressed(){ // 反転とかもろもろの処理は省略 for int total=0; int x=0; while( x<5 ){ int y=0; while( y<5 ){ if( square[x][y] == 0 ){ total++; y++; x++; if( total == 0 ){ clear = 1; int total=0; for( int x=0; x<5; x++ ){ for( int y=0; y<5; y++ ){ if( square[x][y] == 0 ){ total++; if( total == 0 ){ clear = 1;

clear 変数で管理 clear 変数の値に応じて表示を切り替える void draw(){ background( 255 ); if( clear == 0 ){ int x=0; while( x<5 ){ int y=0; while( y<5 ){ if( square[x][y] == 0 ){ // 黄色四角形を描画 else if( square[x][y] == 1 ){ // 黒色四角形を描画 y++; x++; else { text( "Clear!", 100, 200 ); while clear に応じて描画切り替え void draw(){ background( 255 ); if( clear == 0 ){ for( int x=0; x<5; x++ ){ for( int y=0; y<5; y++ ){ if( square[x][y] == 0 ){ // 黄色四角形を描画 else if( square[x][y] == 1 ){ // 黒色四角形を描画 else { text( "Clear!", 100, 200 ); for

draw に集約 void draw(){ background( 255 ); int total=0; int x=0; while( x<5 ){ int y=0; while( y<5 ){ if( square[x][y] == 0 ){ total++; y++; x++; if( total > 0 ){ x=0; while( x<5 ){ y=0; while( y<5 ){ if( square[x][y] == 0 ){ // 黄色四角形を描画 else if( square[x][y] == 1 ){ // 黒色四角形を描画 y++; x++; else { text( "Clear!", 100, 200 ); while 数を数えて 数に応じて描画切り替え void draw(){ background( 255 ); int total=0; for( int x=0; x<5; x++ ){ for( int y=0; y<5; y++ ){ if( square[x][y] == 0 ){ total++; if( total > 0 ){ for( int x=0; x<5; x++ ){ for( int y=0; y<5; y++ ){ if( square[x][y] == 0 ){ // 黄色四角形を描画 else if( square[x][y] == 1 ){ // 黒色四角形を描画 else { text( "Clear!", 100, 200 ); for

Lights Out を別の解法で 5x5のマス目からはみ出した処理が面倒! 配列を拡張して,7x7のマス目を作って, その一部を表示する!( 配列の溢れを防ぐため ) 左端右端, 上端下端の部分は表示せず, そこを除いた部分だけを表示する! 表示しない 表示する

初期化! 表示領域の外も 0 で初期化してしまう ( どうせ表示しないからなんでも良いけれど ) while int [][] square = new int [7][7]; 5x5 の 2 次元配列の定義 void setup(){ size( 500, 500 ); int x=0; while( x<7 ){ int y=0; while( y<7 ){ square[x][y] = 0; y++; x++; 多重ループで 0 に初期化 int [][] square = new int [7][7]; for void setup(){ size( 500, 500 ); for( int x=0; x<7; x++ ){ for( int y=0; y<7; y++ ){ square[x][y] = 0;

マウスクリックでの変化 マウスクリックされた時に, そのクリックされた座標に応じて, どの配列の値を変更するかを考える! 変更するマス目は, それぞれ +1したもの! txとtyは1~5の値を取るので,-1や +1してもはみ出ない! void mousepressed(){ // どこのマス目をクリックしたか // マス目の大きさが 100 なので int tx = mousex / 100 + 1; int ty = mousey / 100 + 1; square[tx][ty] = 1 - square[tx][ty]; square[tx-1][ty] = 1 - square[tx-1][ty]; square[tx+1][ty] = 1 - square[tx+1][ty]; square[tx][ty-1] = 1 - square[tx][ty-1]; square[tx][ty+1] = 1 - square[tx][ty+1];

描画するのはどこ? square[x][y] の値に応じて描画 多重繰り返しで描画する while for void draw(){ background( 255 ); void draw(){ background( 255 ); int x=1; while( x<=5 ){ int y=1; while( y<=5 ){ if( square[x][y] == 0 ){ // 黄色四角形を描画 else if( square[x][y] == 1 ){ // 黒色四角形を描画 y++; x++; 0 か 1 かで描画内容を変更 for( int x=1; x<=5; x++ ){ for( int y=1; y<=5; y++ ){ if( square[x][y] == 0 ){ // 黄色四角形を描画 else if( square[x][y] == 1 ){ // 黒色四角形を描画

電光掲示板を作る (Q) 600x400 のウインドウの上に, 半径 10 の円を敷き詰め, マウスカーソルが触れた場所が赤色に灯る電光掲示板のようなものを作るには?

電光掲示板を作る 考え方 600x400 に半径 10 の円を敷き詰める場合, 横に 30 個, 縦に 20 個敷き詰めることが可能 ライトが光っているか, 光っていないかを管理する 30x20 の整数の配列を用意する int [][] light = new int [30][20]; 光っていない場合は 0, 光っている場合は 1 とする 円の中心の座標は, 変数 i と j を利用した場合 (i*20+10, j*20+10) となる (i, jは0から1ずつ増やす ) [i, j] 番目の円の中心からマウスまでの距離を求めて中に入っていれば light[i][j] = 1; とする light[i][j] が 1 なら塗りつぶしを赤,0なら白とする

電光掲示板を作る int [][] light = new int [30][20]; void setup(){ size( 600, 400 ); // 最初にすべてを 0 にする int i=0; while( i<30 ){ int j=0; while( j<20 ){ light[i][j] = 0; j++; i++; void draw(){ background( 255, 255, 255 ); int i=0; while( i<30 ){ int j=0; while( j<20 ){ // 円の中に入っていれば 1 にする if( dist(i*20+10, j*20+10, mousex, mousey)<10 ){ light[i][j] = 1; // 1 なら赤色,0 なら白色にする if( light[i][j] == 1 ){ fill( 255, 0, 0 ); else { fill( 255, 255, 255 ); // 中心 (i*20+10, j*20+10) の円を描画 ellipse( i*20+10, j*20+10, 20, 20 ); j++; i++;

電光掲示板を作る int [][] light = new int [30][20]; void setup(){ size( 600, 400 ); // 最初にすべてを 0 にする for( int i=0; i<30; i++ ){ for( int j=0; j<20; j++ ) { light[i][j] = 0; for でも書ける! void draw(){ background( 255, 255, 255 ); for( int i=0; i<30; i++ ){ for( int j=0; j<20; j++ ){ // 円の中に入っていれば1にする if( dist(i*20+10, j*20+10, mousex, mousey)<10 ){ light[i][j] = 1; // 1なら赤色,0なら白色にする if( light[i][j] == 1 ){ fill( 255, 0, 0 ); else { fill( 255, 255, 255 ); // 中心 (i*20+10, j*20+10) の円を描画 ellipse( i*20+10, j*20+10, 20, 20 ); 数が明確な場合は for がわかりやすいかも

演習 電光掲示板のプログラムで, マウスでクリックされると ON/OFF を切り替えるようにしましょう ONなら赤色,OFFなら白色 マウスクリック mousepressed の時に距離の判定を行なって,ON/OFFを切り替えるライトを探す 電光掲示板のプログラムで, マウスのクリック回数で色を変えるようにしてみましょう ( 例 ) 白 赤 緑 青 白など

スクロールする電光掲示板 (Q) 600x400 のウインドウの上に, 半径 10 の円を敷き詰めた電光掲示板を, 右から左にスクロールさせていくにはどうするか?

スクロールする電光掲示板 考え方 30x20の整数の配列 light を用意して, まずは全てを 0 に設定する すべての [i, j] について, マウスカーソルの下にある場合は,light[i][j] = 1; とする dist( i*20+10, j*20+10, mousex, mousey ) light[i][j] が0なら白色,1なら赤色に塗り色を設定 [i, j] に相当する位置に円を描画する 一回 draw される毎に, 光っているライトの位置を右から左へ移動する (1つ左に,1つ右のを代入) light[i-1][j] = light[i][j];

スクロールする電光掲示板 light の配列のある j について... 0 1 2 3 27 28 29 0 1 0 0 0 1 1 1 番目を 0 番目に 2 番目を 1 番目に 3 番目を 2 番目に 4 番目を 3 番目に 27 番目を 26 番目に 28 番目を 27 番目に 29 番目を 28 番目に 0 light[i-1][j] = light[i][j]; 1 つずつ左へずらしていく 1 番右には 0 を入れる

配列のエラーに注意 light[i-1][j] = light[i][j] のため,i は 1 以上 i が 0 のとき,light[-1][j] = light[0][j] となってしまい, エラーになる!(-1 番目なんて無い!) 右を左にコピーするので, 左のものから順に処理をしていく i は順に 1 ずつ増やしていく 多重ループは j を外のループにして,i を内のループにしたほうがわかりやすい for( int j=0; j<20; j++ ){ for( int i=1; i<30; i++ ){ light[i-1][j] = light[i][j];

スクロールする電光掲示板 int [][] light = new int [30][20]; void setup(){ size( 600, 400 ); // 最初にすべてを 0 にする int i=0; while( i<30 ){ int j=0; while( j<20 ){ light[i][j] = 0; j++; i++; void draw(){ 明治大学総合数理学部 background( 255, 255, 255 ); 先端メディアサイエンス学科 int i=0; 中村研究室 int j=0; while( j<20 ){ i=1; while( i<30 ){ light[i-1][j] = light[i][j]; i++; light[29][j] = 0; j++; i=0; while( i<30 ){ j=0; while( j<20 ){ if( dist(i*20+10, j*20+10, mousex, mousey)<10 ){ light[i][j] = 1; if( light[i][j] == 1 ){ fill( 255, 0, 0 ); else { fill( 255, 255, 255 ); ellipse( i*20+10, j*20+10, 20, 20 ); j++; i++;

スクロールする電光掲示板 int [][] light = new int [30][20]; void setup(){ size( 600, 400 ); // 最初にすべてを 0 にする for( int i=0; i<30; i++ ){ for( int j=0; j<20; j++ ){ light[i][j] = 0; void draw(){ background( 255, 255, 255 ); for( int j=0; j<20; j++ ){ for( int i=1; i<30; i++ ){ light[i-1][j] = light[i][j]; light[29][j] = 0; for( int i=0; i<30; i++ ){ for( int j=0; j<20; j++ ){ if( dist(i*20+10, j*20+10, mousex, mousey)<10 ){ light[i][j] = 1; if( light[i][j] == 1 ){ fill( 255, 0, 0 ); else { fill( 255, 255, 255 ); ellipse( i*20+10, j*20+10, 20, 20 );

演習 先述のプログラムのスクロール方向を左から右にしてみましょう 先述のプログラムのスクロール方向を上から下にしてみましょう 先述のプログラムで文字を表示してみましょう どうやったら文字を表示できるでしょうか?

[ 演習 ] 左端から右端へ クリックによって赤 / 白の表示が切り替わる 1 次元の掲示板を,1 秒毎に順に左側に移動し, 左端のものを右端から登場させたい 単純に繰り返しで移動すると右端が白になってしまう

[ 演習 ] 左端から右端へ 考え方 値を順に右から左へコピーしていく status[0] = status[1]; status[1] = status[2]; : status[7] = status[8]; status[8] = status[9]; ここで,status[9] = status[0]; にするとすでに status[0] には status[1] の値が代入されてしまっているので駄目!

[ 演習 ] 左端から右端へ 考え方 左端の値を, 一時的に他の変数に保存しておいて, そこに保存していた値を右端に入れれば良い! temp = status[0]; status[0] = status[1]; status[1] = status[2]; : status[7] = status[8]; status[8] = status[9]; status[9] = temp; temp

int [] status = new int [10]; while 明治大学総合数理学部先端メディアサイエンス学科 for 中村研究室 int [] status = new int [10]; void draw(){ int temp = status[0]; int x=0; while( x < 9 ){ status[x] = status[x+1]; x++; status[9] = temp; x = 0; while( x < 10 ){ if( status[x] == 1 ){ fill( 255, 0, 0 ); else { fill( 255 ); rect( x*50, 0, 50, 50 ); x++; void draw(){ int temp = status[0]; for( int x=0; x<9; x++ ){ status[x] = status[x+1]; status[9] = temp; for( int x=0; x<10; x++ ){ if( status[x] == 1 ){ fill( 255, 0, 0 ); else { fill( 255 ); rect( x*50, 0, 50, 50 );

演習 右端のものを, 左端から登場させるにはどうするか? 2 次元の掲示板のアニメーションを行い, 左端から右端に登場させるようにするにはどうしたらよいだろうか?

[ 演習 ] 避けゲーム 400x800 のウインドウを作り,Y 座標が 100,200,300, 400,500,600,700 のところに, それぞれ円を 10 個ずつランダムに表示しましょう

円を一斉に動かす (Q) 400x400 の画面上の,Y 座標 100,Y 座標 200,Y 座標 300 の場所に円を 10 個ずつ表示された円を左から右に動かそう ( 直径 20) また, 速度はランダムにせよ

円を一斉に動かす 考え方 3x10 個のX 座標を格納する float 型の2 次元配列を用意 (float [][] posx = new float [3][10];) 3x10 個の速度を格納する float 型の2 次元配列を用意 (float [][] speedx = new float [3][10];) 3x10 個の配列に random で適当な値を代入 3x10 個の配列の値に応じて円を描画 1 回描画する度に, 配列のそれぞれのX 座標を speedx 分だけ右へ移動

円を一斉に動かす 3x10 の 2 次元配列を作成し, それをそのまま変化させる! float [][] posx = new float[3][10]; float [][] speedx = new float[3][10]; void setup(){ size( 400, 400 ); int i=0; while( i<3 ){ int j=0; while( j<10 ){ posx[i][j] = random(0,400); speedx[i][j] = random(5); j++; i++; void draw(){ background( 255 ); fill( 0, 255, 0 ); ellipse( mousex, mousey, 20, 20 ); fill( 255, 0, 0 ); int i=0; while( i<3 ){ int j=0; while( j<10 ){ posx[i][j] += speedx[i][j]; ellipse( posx[i][j], (i+1)*100, 20, 20 ); j++; i++;

円を一斉に動かす改 (Q) 先ほど作成した 400x400 の画面に 3 列に配置された 10 個の円を右方向に一斉に動く円は, 右端に来ると左端から出てくるようにしよう

円を一斉に動かす改 if( posx[i][j] > 400 ) なら posx[i][j] から 400 引く! float [][] posx = new float [3][10]; float [][] speed = new float [3][10]; void setup(){ size( 400, 400 ); int i=0; while( i<3 ){ int j=0; while( j<10 ){ posx[i][j] = random(0,400); speed[i][j] = random(0,5); j++; i++; void draw(){ background( 255 ); fill( 0, 255, 0 ); ellipse( mousex, mousey, 20, 20 ); fill( 255, 0, 0 ); int i=0; while( i<3 ){ int j=0; while( j<10 ){ posx[i][j] = posx[i][j] + speed[i][j]; if( posx[i][j] > 400 ){ posx[i][j] = posx[i][j] - 400; ellipse( posx[i][j], (i+1)*100, 20, 20 ); j++; i++;

演習 一斉に動く円との衝突判定をしてみましょう 一斉に動く円の数を,10 個から20 個に増やしてみましょう 一斉に動く円の数を,10 個から100 個に増やしてみましょう 一斉に動く円の方向を左方向にしてみましょう speed をマイナスにしたら OK! 一斉に動く円を, 右方向にも左方向にも動くようにしてみましょう speed を -5 から 5 までにしたら OK!