🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Processing

Processingは、オープンソースプロジェクトによるCGのためのプログラミング言語です。Javaをベースにしており、グラフィック機能に特化しています。イメージの生成やアニメーションなど、視覚的なフィードバックを簡単に得ることが可能です。

Q&A

解決済

1回答

2493閲覧

【Processing】オセロ作成 for文について

zoon555

総合スコア17

Processing

Processingは、オープンソースプロジェクトによるCGのためのプログラミング言語です。Javaをベースにしており、グラフィック機能に特化しています。イメージの生成やアニメーションなど、視覚的なフィードバックを簡単に得ることが可能です。

0グッド

0クリップ

投稿2019/10/06 09:23

###processingを使いオセロを作ろうとしています。盤上にオセロの駒を置くところでつまずいています。
盤を8×8に設定しクリックするとそのマス上に駒を置くようには出来ました。しかし、土台となる緑色のマス目がおそらくfor文のせいで何度も塗り替えられ、駒が消えていってしまいます。改善案や参考に出来るサイトなどを教えていただきたいです。

int x,y,count; int[][]board=new int[8][8]; void setup(){ size(400,400); background(255); noStroke(); x=-1;y=-1;count=0; } void draw(){} void move(){ for(int i=0;i<8;i++){ for(int j=0;j<8;j++){ fill(180,255,150); rect(i*50,j*50,48,48); if (count%2==0){ board[x][y]=-1; fill(0); ellipse(x*50+25,y*50+25,40,40); }else if(count%2==1){ board[x][y]=1; fill(255); ellipse(x*50+25,y*50+25,40,40); }else{ board[x][y]=0; } }}} void mousePressed(){ if(mouseButton==LEFT){ x=floor(mouseX/50); y=floor(mouseY/50); count++; move(); } }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

もちろん、"Processing オセロ"とか"Processing reversi"とかで検索すると結構な数のサイトがヒットして、それぞれ参考になるでしょう。

マス上に駒を置くようには出来ました

とはいえ、マス上にコマを置くことで全力を使い果たしちゃってますよね...このままだと、先へ行って苦労します。オセロだから、既に置かれていた駒がひっくり返って白になったり黒になったりするわけで。

それを考えると、「駒を置くこと」と「盤の画を描くこと」は全く別の作業(関数)に分離して考えるべきでしょう。改善というよりは作り直しに近くなるとも言えますが...今やっておかないと、先で困ります。

例えば

Processing

1void draw(){ 2 for(int i=0;i<8;i++){ 3 for( int j=0;j<8;j++){ 4 //i,jの位置を地色で塗りつぶす処理 5 //i,jのマスを調べて駒があれば描く処理 6 } 7 } 8 //勝負判定等 9} 10 11void mousePressed(){ 12 if(mouseButton==LEFT){ 13 //置かれた駒によって既存の敵駒をひっくり返す処理 14 //ひっくり返る駒があったら現在のマスに駒を置く処理(ひっくり返る駒がなかったら置けない), 先手/後手の切り替え 15 } 16}

みたいな構造でどうでしょう。

以下、本題ではないですが、
どこかのゲームから流用したのだと思いますが、moveという関数名、なにかをmoveしているのですか? 違うような気がします。変数でも関数でも、名が体を表すようにしましょう。

それと、

Processing

1 if (count%2==0){ 2 //処理A 3 }else if(count%2==1){ 4 //処理B 5 }else{ 6 //処理C 7 }

という構造がプログラム中にありますが、処理Cは絶対に行われないです。2で割った剰余は必ず0か1のどちらかで、それ以外ということはあり得ませんから。

投稿2019/10/06 13:45

編集2019/10/06 21:31
thkana

総合スコア7703

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Bongo

2019/10/06 22:08 編集

「move」は「一手指す」といった意味合いで使用されたのかもしれませんね。検索してみたところ、たとえば https://en.wikipedia.org/wiki/Reversi#Ruleshttps://www.worldothello.org/about/about-othello/othello-rules/official-rules/english では「move」という表現が使われているようでした。ボードゲームには疎いのですが、チェスなどと違って動かしている感じはなくても「move」と言うのもアリなのかもしれません。
thkana

2019/10/06 22:55

なるほど。失礼しました>質問者さん 「やさしい」言葉って守備範囲が広くて油断出来ませんね。ひとつ利口になりました。ありがとうございます。
zoon555

2019/10/08 12:04

回答ありがとうございます。参考にさせていただきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問