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

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

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

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

Q&A

解決済

1回答

453閲覧

javaでプログラムをそのままフレームで表示できるようにしたい

kumathi

総合スコア7

Java

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

0グッド

0クリップ

投稿2022/05/28 15:29

素人質問かつ莫大な質問で申し訳ないです。下記にあるコードをのプログラムをフレーム上で表示したいのですがそうなったばあいやはり最初から作り直さなくてはいけないのでしょうか。何度か試行錯誤してみたのですがなかなかうまくいきません。アドバイスなどご教授いただけたら幸いです。ちなみにこちらのコードはユーザーかコンピュターどちらかが三勝した後にグリコの配点で勝敗を決定するっものになってます。

コード package myoriject; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.Random; import java.util.Scanner; public class Janken { public static void main(String[] args) throws IOException { BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); String[] rsp = {"Rock", "Scissors", "Paper"}; System.out.print("Please enter your Name:"); String playerName = reader.readLine(); String cpuName = "Computer"; int points1 = 0; int points2 = 0; int win = 0; int lose = 0; while (win < 3 && lose < 3) { int user = getUser(); int pc = getPc(); System.out.println(playerName + ":" + rsp[user] + " || " + cpuName + ":"+ rsp[pc]); if(pc==(user+1)%3) { System.out.println("Win"); win++; points1 += (user == 0) ? 3 : 6; } else if(pc == (user+1)%3) { System.out.println("Lose"); lose++; points2 += (pc == 0) ? 3 : 6; } else { System.out.println("Drew"); } System.out.println("<RESULT> " + "WIN:" + win + " LOSE:" + lose + " <SCORE> " + playerName + ":" + points1 + " || " + cpuName + ":" + points2 ); } System.out.println("\nFinish!!!"); System.out.println("Let's Judge.........."); if( points1 < points2 ) { System.out.println("You Lose..." + " <SCORE> " + playerName + ":" + points1 + " || " + cpuName + ":" + points2 ); } else if( points2 < points1) { System.out.println("Congratulations!! You Win!!" + " <SCORE> " + playerName + ":" + points1 + " || " + cpuName + ":" + points2 ); } else if( points1 == points2 ) { System.out.println("Wow... You Drew..." + " <SCORE> " + playerName + ":" + points1 + " || " + cpuName + ":" + points2 ); } } public static int getUser() { Scanner scan = new Scanner(System.in); while(true) { //outpu massages System.out.println("\nPlease enter your choice"); System.out.print("(ROCK:0,SCISSORS:1、PAPER:2) --> "); if(scan.hasNextInt()) { int number = scan.nextInt(); if(number<=-1 || number >=3) { System.out.println("【ERROR】You can choose only 0, 1 or 2"); } else return number; } else {System.out.println("【ERROR】You can enter only the number 0, 1 or 2"); scan.next(); } } } public static int getPc() { // ready for judge Random rand = new Random(); // get a value random return rand.nextInt(3); } }

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

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

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

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

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

hoshi-takanori

2022/05/28 18:43

「フレーム上で表示」のフレームとは何のことでしょうか? GUI 化したいってこと?
dodox86

2022/05/28 18:55

以下の質問を見ると、SwingでのJFrameのフレームを指しているのでしょうかね。 [JFrameでのwhileの不具合] https://teratail.com/questions/9l3rxftcib7ioa 一般的に「フレームで表示したい」といきなり言われても、話は通じません。
kumathi

2022/05/28 19:47

申し訳ありません、GUIです。
guest

回答1

0

ベストアンサー

CUI と GUI では、プログラムの構造に決定的な違いがあるため、書き直しが必要になります。それぞれのプログラムの構造を (フローチャートの代わりに) Scratch 風のブロックで描いてみました。

イメージ説明

CUI プログラムでは、基本的に自分が書いた通りに動くので、例えばどちらかが 3 勝するまでループして、ループの中で入力を受け付けるなど、書いた通りに動きます。

これに対して、GUI プログラムでは、GUI のフレームワークが色々なことをやってくれる (図のピンク色の部分) ので、自分で書くのは一部 (図の水色の部分) です。特に、入力 (イベント) はフレームワークが担当するため、自分でループして入力を受け付けることはできません。また、表示の更新に関しても、setText メソッドなどは表示すべき内容を設定するだけで、実際に画面が更新されるのは入力の処理が終わった後になります。このため、入力の処理の中でループすると、次の入力を受け取れないだけでなく、画面も更新されません。

イメージ説明

もう一つの質問のコードも図にしてみましたが、ボタンが押された時に呼ばれる処理の中でループしていて、この間は新しい入力を受け取ることはできないので、人間側は同じ手を出し続け、その間に CPU が次々に手を出して、どちらかが 3 勝したらそこでループを抜けて、画面を更新して次の入力を受け付けることになります。

正しい GUI プログラムの構造は、図の右側のように、ひとつの入力に対してループせずにその入力の処理だけすることです。

投稿2022/05/29 09:21

hoshi-takanori

総合スコア7895

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

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

kumathi

2022/06/02 03:20

なるほど、大変わかりやすく説明していただきありがとうございます。とても勉強になりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問