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

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

詳細はこちら
Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

button

HTMLで用いる<button>タグです。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

Android Emulator

Android EmulatorはアンドロイドのOSで起動しているアンドロイドのデバイスの機能をシミュレートするソフトウェアです。Emulatorは開発者に複数の違う設定を持ったデバイスを必要とすることなくアプリケーションを開発しテストすることが可能になります。

Q&A

解決済

1回答

1906閲覧

条件つきの繰り返し処理の仕方

htnk_4a

総合スコア3

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

button

HTMLで用いる<button>タグです。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

Android Emulator

Android EmulatorはアンドロイドのOSで起動しているアンドロイドのデバイスの機能をシミュレートするソフトウェアです。Emulatorは開発者に複数の違う設定を持ったデバイスを必要とすることなくアプリケーションを開発しテストすることが可能になります。

0グッド

0クリップ

投稿2020/12/11 08:17

編集2020/12/12 16:30

前提・実現したいこと

三回勝つor三回負けるでプログラム終了(連勝、連敗で作成できる場合はそちらを教えていただきたいです。)

andoroid studio を使用しています。じゃんけんアプリを作成しているのですが繰り返し処理の書き方がわかりません。
このアプリはじゃんけんを連続でできない仕組みになっているのですが「次へ」のボタンを設置し連続でじゃんけんをできるようにしたいです。

発生している問題・エラーメッセージ

nextButton.setOnClickListener{ }の{}の中身がどう書けばいいか分かりません。

エラーメッセージ

該当のソースコード

ソースコード

試したこと

forやwhile文を試しましたがコードが間違っているのかうまくいきませんでした。
「次へ」のボタンをレイアウトエディタで設置しましたがbackButtonのようにうまく表示できない

補足情報

///inputactivity///

package com.example.janken

import android.content.Intent
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.preference.PreferenceManager
import androidx.core.content.edit
import kotlinx.android.synthetic.main.activity_main.*
import android.view.View as View1

class MainActivity : AppCompatActivity() {

override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) gu.setOnClickListener{ onJankenButtonTapped(it) } choki.setOnClickListener { onJankenButtonTapped(it) } pa.setOnClickListener { onJankenButtonTapped(it) } val pref= PreferenceManager.getDefaultSharedPreferences(this) pref.edit { clear() } } fun onJankenButtonTapped(view: View1?){ val intent = Intent(this, ResultActivity::class.java) intent.putExtra("MY_HAND", view?.id) startActivity(intent) }

}

///resultactivity///

package com.example.janken

import android.os.Bundle
import android.preference.PreferenceManager
import androidx.appcompat.app.AppCompatActivity
import androidx.core.content.edit
import kotlinx.android.synthetic.main.activity_result.*

class ResultActivity : AppCompatActivity() {

val gu = 0
val choki = 1
val pa = 2

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_result)
val id = intent.getIntExtra("MY_HAND", 0)

val myHand: Int
myHand = when (id) {
R.id.gu -> {
myHandImage.setImageResource(R.drawable.gu)
gu
}
R.id.choki -> {
myHandImage.setImageResource(R.drawable.choki)
choki
}
R.id.pa -> {
myHandImage.setImageResource(R.drawable.pa)
pa
}
else -> gu
}

// コンピュータの手を決める
val comHand = getHand()
when (comHand) {
gu -> comHandImage.setImageResource(R.drawable.com_gu)
choki -> comHandImage.setImageResource(R.drawable.com_choki)
pa -> comHandImage.setImageResource(R.drawable.com_pa)
}

// 勝敗を判定する
val gameResult = (comHand - myHand + 3) % 3
when (gameResult) {
0 -> resultLabel.setText(R.string.result_draw) // 引き分け
1 -> resultLabel.setText(R.string.result_win) // 勝った場合
2 -> resultLabel.setText(R.string.result_lose) // 負けた場合
}
nextButton.setOnClickListener{ }
backButton.setOnClickListener { finish() }

saveData(myHand, comHand ,gameResult) }

private fun saveData(myHand: Int, comHand: Int, gameResult: Int) {
val pref = PreferenceManager.getDefaultSharedPreferences(this)
val gameCount = pref.getInt("GAME_COUNT", 0)
val winningStreakCount = pref.getInt("WINNING_STREAK_COUNT", 0)
val lastComHand = pref.getInt("LAST_COM_HAND", 0)
val lastGameResult = pref.getInt("GAME_RESULT", -1)

val edtWinningStreakCount: Int = when { lastGameResult == 2 && gameResult == 2 -> winningStreakCount + 1 else -> 0 } val editor = pref.edit() pref.edit { putInt("GAME_COUNT", gameCount + 1) putInt("WINNING_STREAK_COUNT", edtWinningStreakCount) putInt("LAST_MY_HAND", myHand) putInt("LAST_COM_HAND", comHand) putInt("BEFORE_LAST_COM_HAND", lastComHand) putInt("GAME_RESULT", gameResult) } } private fun getHand(): Int { var hand = (Math.random() * 3).toInt() val pref = PreferenceManager.getDefaultSharedPreferences(this) val gameCount = pref.getInt("GAME_COUNT", 0) val winningStreakCount = pref.getInt("WINNING_STREAK_COUNT", 0) val lastMyHand = pref.getInt("LAST_MY_HAND", 0) val lastComHand = pref.getInt("LAST_COM_HAND", 0) val beforeLastComHand = pref.getInt("BEFORE_LAST_COM_HAND", 0) val gameResult = pref.getInt("GAME_RESULT", -1) if (gameCount == 1) { if (gameResult == 2) { // 前回の勝負が1回目で、コンピュータが勝った場合、 // コンピュータは次に出す手を変える while (lastComHand == hand) { hand = (Math.random() * 3).toInt() } } else if (gameResult == 1) { // 前回の勝負が1回目で、コンピュータが負けた場合 // 相手の出した手に勝つ手を出す hand = (lastMyHand - 1 + 3) % 3 } } else if (winningStreakCount > 0) { if (beforeLastComHand == lastComHand) { // 同じ手で連勝した場合は手を変える while (lastComHand == hand) { hand = (Math.random() * 3).toInt() } } } return hand }

}

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

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

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

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

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

guest

回答1

0

ベストアンサー

コードを少し見ましたが、記載されている情報だけだといまいちどうしたいかが見えません。
ので記載されている情報だけである程度推測して回答させていただきます。

ResultActivityと言う名前でMY_HANDを前画面から受け取っているようなので
この前の画面にじゃんけんの手を決めるActivityがあるのではないでしょうか?
上記想定が正しいのであれば、じゃんけんの手を決めるのをInputActivityとしたとき
InputActivity→ResultActivity→InputActivity...と繰り返していくような作りになると思うので
forやwhileでの繰り返しではないのかなと思います。
(単純にこのような作りにしてしまうとActivityが積まれ続けてしまうので良くはありませんので、元のActivityを消したり、1個だけしかできないようにしたり、fragmentを使ったりするのが良いとは思いますが、質問に対する回答の本質ではないのでここでは一旦置いておきます)

nextButton.setOnClickListener{ }ではInputActivityにstartActivityをしてやって、何回連勝しているかを値で渡してやって、ある連勝まで達していたら連勝や連敗と止めると言う処理にしてやれば良いかと思います。

上記で解決しないようであれば追加で全体のコードや情報などをいただければと思います。

また、不明点や何かありましたらコメントをお願いいたします。

===
2020/12/13 01:33コメントに対する追記:
nextButton.setOnClickListener{ }でMainActivityにstartActivityをしてやって、何回連勝しているかを値で渡してやって、ある連勝まで達していたら連勝や連敗と止めると言う処理ではダメでしょうか。SharedPreferencesを使っているのであればそこに保存しておいても良いかもしれません。

MainActivity

class MainActivity: AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_test3) gu.setOnClickListener{ onJankenButtonTapped(it) } choki.setOnClickListener { onJankenButtonTapped(it) } pa.setOnClickListener { onJankenButtonTapped(it) } val pref= PreferenceManager.getDefaultSharedPreferences(this) pref.edit { clear() } } fun onJankenButtonTapped(view: View1?){ // 連勝、連敗を渡す val streak = this.intent.getIntExtra("streak", 0) val intent = Intent(this, ResultActivity::class.java) intent.putExtra("MY_HAND", view?.id) intent.putExtra("streak", streak) startActivity(intent) } }

ResultActivity

var streak = intent.getIntExtra("streak", 0) when (gameResult) { 0 -> { resultLabel.setText(R.string.result_draw) // 引き分け // 引き分けの場合はカウントを0に戻す streak = 0 } 1 -> { resultLabel.setText(R.string.result_win) // 勝った場合 // 連敗中の場合は値を0に戻す if(streak < 0){ streak = 0 } streak += 1 } 2 -> { // 連勝中の場合は値を0に戻す if(streak > 0){ streak = 0 } streak -= 1 resultLabel.setText(R.string.result_lose) // 負けた場合 } } // TODO: プログラム終了。何がしたいか、NEXTの遷移先を変えたい?それとも表示を変えたい? if(streak >= 3 || streak <= -3){ Log.d("TEST", "ゲーム終了") } nextButton.setOnClickListener { val intent = Intent(this, MainActivity::class.java) intent.putExtra("streak", streak) // TODO: Activityが積まれ続けるのを回避。画面の構成を考える必要があれば修正する intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP) startActivity(intent) }

上記のような遷移で目的は達成できないでしょうか。

また、蛇足であるかもしれませんが、同じAcitivty内でパーツの表示、非表示を切り替えて入力画面と結果画面にする方法やFragmentを使う方法なんかも考えられるかと思います。

以上、よろしくお願いいたします。

===追記
そのままコピーするだけだとエラーになってました。以下、修正点です。

class MainActivity: AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) // setContentView(R.layout.activity_test3) setContentView(R.layout.activity_main)

投稿2020/12/11 13:49

編集2020/12/15 11:24
razuma

総合スコア1313

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

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

htnk_4a

2020/12/12 16:33

情報を追加しました。回答をいただけたら幸いです。
htnk_4a

2020/12/15 11:17

回答遅れてしまい申し訳ございません。 今実行してみたところコードにエラーは起きなかったのですが、アンドロイドエミュレーターを起動すると『「janken」(アプリの名前)が繰り返し停止しています。』と出ます。。。解決法が分からないのでご教授ください。。
razuma

2020/12/15 11:25

あ、すみません。例で書いたコードが私の方で使ってたコードのままでした。 修正点を追記しましたのでご確認をお願いいたします。 それでも落ちるようでしたらLogcatに出ているエラーを貼っていただけますでしょうか。 以上、よろしくお願いいたします。
htnk_4a

2020/12/16 10:03

修正ありがとうございます。エラーは無事消えました!しかし実行してみるとグーチョキパーの画像が最初に出てくるはずなのですが出てこなくなってしましました。。。画像の表示の仕方を聞きたいのですがここでの聞き方が分かりません。どのようにすれば回答をいただけますか?
razuma

2020/12/16 10:20

画像が表示されない以外は想定通りの動きになっていますでしょうか? なぜ画像が表示されないのかについては現状のコードと、またはプロジェクトの状態まで確認しないとわからないかもしれないので長くなってしまうかもしれません。 回答が長くなってしまったので別に質問たてるか、プロジェクト自体をアップすることが可能であれば修正箇所は比較的簡単にわかるかもしれません。(プロジェクトをgithubにあげるなど)もしくはコードを追記いただくか、などかと思います。
htnk_4a

2020/12/16 11:02 編集

別に質問を作りました。御覧いただければ幸いです。 githubのほうでプロジェクトを挙げる場合の手順をネットで調べたのですがいまいちわからないので教えてください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問