質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.37%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Processing

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

Q&A

解決済

1回答

2528閲覧

Processingで四択クイズを作りたい。

nyhahaha

総合スコア3

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Processing

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

1グッド

1クリップ

投稿2022/06/25 12:18

編集2022/06/25 16:06

学校の課題で、四択クイズを作っている者です。
条件としてテキストファイルにかかれている問題と選択肢を使うことが条件だったので、とりあえず問題の表示とその問題の選択肢の表示まではできたのですが、その問題が正解か不正解を判定させるのに困っています。
mouseX,mouseYを使えば、マウスをクリックした座標の取得ができるということは調べてわかりましたが、どうしても特定の座標のテキストで条件分岐させる方法が分かりません。
最初は、if文でmouseX,mouseYをmouseClicked()内で取得して、そこで正解のテキストが書かれている座標と同じであれば、status=2の正解に移動、それ以外であれば、status=3に移動させようかと書いては見たのですが、判定されず、マウスをクリックしたら次の問題に移動してしまいました。
自分の頭ではこれが限界です。ヒントをよろしくお願いします。

processing java
コード
//以下が現状のコードです。
//課題の要件は、問題→正解か不正解か表示→次の問題(これを計3問)→合計スコアを表示で終了です。
String[]a;
String[]b;
int c = 0;
int score = 0;//スコア
int status = 0;
int count = 0;//問題をやった回数

void setup(){
size(500, 500);
PFont font = createFont("Meiryo", 50);
textFont(font);
a = loadStrings("課題.txt");
}

void draw(){// ゲームシーンの処理

if(status == 0){//問題を表示
background(255);
fill(0);
textAlign(CENTER);
textSize(80);
text("問題!",250,250);//「問題」を表示
}

if(status == 2){
background(255);
textAlign(CENTER);
textSize(80);
text("正解!",250,250);//「正解」を表示
score++;
count++;
status = 1;
}

if(status == 3){
background(255);
textAlign(CENTER);
textSize(80);
text("不正解",250,250);//「不正解」を表示
count++;
status = 1;
}

if(status == 4){// クリアシーンの処理
background(255);
textAlign(CENTER);
textSize(40);
text("正解数は",180,250);
text(score,280,250);
text("です。",360,250);
}
}

void mouseClicked(){
if(status == 1){

if(c<3){
b = split(a[c],",");
c++;
}

textSize(30);
background(255);
text(b[0],250,150);
text(b[2],140,200);
text(b[3],140,250);//1番目の問題の答え
text(b[4],140,300);//2番目の問題の答え
text(b[5],140,350);//3番目の問題の答え

}
}

void mousePressed(){
if(status == 0){
status = 1;
}
if(count == 3){
status = 4;
}
}

TN8001👍を押しています

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

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

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

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

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

meg_

2022/06/25 15:18

コードは「コードの挿入」で記入しましょう。
nyhahaha

2022/06/25 16:07

使い方がよくわかっていないかったので、申し訳ないです。
guest

回答1

0

ベストアンサー

mouseX,mouseYを使えば、マウスをクリックした座標の取得ができるということは調べてわかりましたが、どうしても特定の座標のテキストで条件分岐させる方法が分かりません。

何か枠なり四角でも選択肢の後ろに描くようにすれば、ユーザーもわかりやすいですし判定も書きやすくなると思います。

最初は、if文でmouseX,mouseYをmouseClicked()内で取得して、そこで正解のテキストが書かれている座標と同じであれば、status=2の正解に移動、それ以外であれば、status=3に移動させようかと書いては見たのですが、判定されず、マウスをクリックしたら次の問題に移動してしまいました。

遷移処理がいろいろなところに出てきて、混乱されているように見受けられます。

遷移(statusの変更)は、mouseClicked内でのみするようにします。
そして描画(text等)は、draw内でのみするようににします。
そうすれば役割が明確になり、見通しが良くなります。


Processing

1if (status == 0) { } 2if (status == 1) { } 3if (status == 2) { } 4if (status == 3) { } 5if (status == 4) { }

と、

Processing

1if (status == 0) { } 2else if (status == 1) { } 3else if (status == 2) { } 4else if (status == 3) { } 5else if (status == 4) { }

は、等価でないことに注意してください(後者はswitchに変換可能です)

statusintだとわかりにくいので、enumをお勧めします。


正解の判定法が不明なので、b[1]に入っていると仮定しました^^;

Processing

1String[] a; 2String[] b; 3int score; 4int count; 5Status status = Status.TITLE; 6 7enum Status { 8 TITLE, QUESTION, CORRECT, INCORRECT, RESULT, 9} 10 11 12void setup() { 13 size(500, 500); 14 textFont(createFont("Meiryo", 50)); 15 textAlign(CENTER, CENTER); 16 rectMode(CENTER); 17 18 //a = loadStrings("課題.txt"); 19 a = new String[] { 20 "史上初の家庭用ゲーム機とされるものは?,オデッセイ(マグナボックス),カラーテレビゲーム15(任天堂),テレビブロック(エポック社),オデッセイ(マグナボックス),ホーム・ポン(アタリ)", 21 "「ドラゴンクエスト6 幻の大地」の定価(税抜)は?,11,400円,14,800円,11,400円,9,700円,5,900円", 22 "PlayStationの同時発売ソフトは?,リッジレーサー(ナムコ),グランツーリスモ(SCE),モータートゥーン・グランプリ(SCE),チョロQ(タカラ),リッジレーサー(ナムコ)", 23 }; 24} 25 26void draw() { 27 background(255); 28 fill(0); 29 30 switch(status) { 31 case TITLE: 32 textSize(80); 33 text("問題!", 250, 250); 34 break; 35 36 case QUESTION: 37 noFill(); // これなんでtext出るんだろう?? 38 textSize(20); 39 text(b[0], 250, 150); 40 41 rect(250, 200, width*0.8, 40); 42 text(b[2], 250, 200); 43 44 rect(250, 250, width*0.8, 40); 45 text(b[3], 250, 250); 46 47 rect(250, 300, width*0.8, 40); 48 text(b[4], 250, 300); 49 50 rect(250, 350, width*0.8, 40); 51 text(b[5], 250, 350); 52 break; 53 54 case CORRECT: 55 textSize(80); 56 text("正解!", 250, 250); 57 break; 58 59 case INCORRECT: 60 textSize(80); 61 text("不正解", 250, 250); 62 break; 63 64 case RESULT: 65 textSize(40); 66 text("正解数は" + score + "です。", 250, 250); 67 break; 68 } 69} 70 71void mouseClicked() { 72 switch(status) { 73 case TITLE: 74 case CORRECT: 75 case INCORRECT: 76 if (count < a.length) { 77 b = split(a[count], ","); 78 count++; 79 status = Status.QUESTION; 80 } else { 81 status = Status.RESULT; 82 } 83 break; 84 85 case QUESTION: 86 String ans = getAnswer(); 87 if (ans == null) break; // 選択肢範囲外 88 89 if (ans.equals(b[1])) { 90 score++; 91 status = Status.CORRECT; 92 } else { 93 status = Status.INCORRECT; 94 } 95 break; 96 97 case RESULT: 98 count = 0; 99 score = 0; 100 status = Status.TITLE; 101 break; 102 } 103} 104 105String getAnswer() { 106 if (isInside(250, 200, width*0.8, 40)) return b[2]; 107 if (isInside(250, 250, width*0.8, 40)) return b[3]; 108 if (isInside(250, 300, width*0.8, 40)) return b[4]; 109 if (isInside(250, 350, width*0.8, 40)) return b[5]; 110 return null; 111} 112 113// rectMode(CENTER)の場合での判定 114boolean isInside(float cx, float cy, float w, float h) { 115 return cx - w/2 < mouseX && mouseX < cx + w/2 && cy - h/2 < mouseY && mouseY < cy + h/2; 116}

アプリ動画

投稿2022/06/25 16:17

編集2023/08/16 04:18
TN8001

総合スコア9825

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

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

jimbe

2022/06/25 18:46

>enumをお勧め ついでに draw や mouseClicked での処理をそれぞれに含ませれば、 status の大きな switch が無くなりますね。
TN8001

2022/06/25 23:34

> ついでに draw や mouseClicked での処理をそれぞれに含ませれば、 status の大きな switch が無くなりますね。 ↓みたいな話ですよね? enum Status { TITLE { @Override void draw() { text("問題!", 250, 250); } }; abstract void draw(); } 「そういえばJavaはenumにメソッド書けるんだっけ」と思ってやってみたのですが、ネストしたenumはstaticになってしまいtext()が呼べなくなってしまいましたorz ※Processingの仕様上、コードはクラスの中に書いていることになります。 class App extends PApplet { // ここの中に書いていることになる } わたしはいまだにJavaのネストしたクラスがよくわかってませんw
nyhahaha

2022/06/26 03:40

TN8001さん、質問への詳しい解説ありがとうございます。 enumについては学校の授業内で出てこなかったと思うので、その考えは思いつきませんでした。 まだまだ知識不足であることを痛感し、この課題に再度、取り掛かる前にenumについて勉強しようと思います。 また、疑問が生まれたら、なるべく早くコメントしようと思います。 今回はありがとうございました。
TN8001

2022/06/26 03:55

習ってなくて使いづらければ↓のようなのでも構いません。 int status = TITLE; final int TITLE = 0, QUESTION = 1; 要は直接「if(status == 0)」・「status = 0」のように、数字が出てきてもわかんないよねって話です^^
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問