diff --git a/app/src/main/java/org/ntlab/irisclient/DrawingCardFragment.java b/app/src/main/java/org/ntlab/irisclient/DrawingCardFragment.java index e21c183..bb5199a 100644 --- a/app/src/main/java/org/ntlab/irisclient/DrawingCardFragment.java +++ b/app/src/main/java/org/ntlab/irisclient/DrawingCardFragment.java @@ -1,5 +1,6 @@ package org.ntlab.irisclient; import static android.os.Looper.getMainLooper; +import static android.view.View.INVISIBLE; import android.app.AlertDialog; import android.app.Dialog; @@ -64,6 +65,7 @@ private List map; //cno順にdnoを管理(要するに絵の並び) private List colorList; //cno順にr,g,b,dを管理:カードごとの色 private List nowOpenList; + private List nowQList; // コンストラクタ @@ -109,6 +111,28 @@ } }; + // 現在のQListを記録 + nowQList = new ArrayList(){ + { + add(false); + add(false); + add(false); + add(false); + add(false); + add(false); + add(false); + add(false); + add(false); + add(false); + add(false); + add(false); + add(false); + add(false); + add(false); + add(false); + } + }; + // ImageButton16個の型を使いまわしやすいように配列で使用 imageButtons = new ImageButton[] { (ImageButton) view.findViewById(R.id.imageButton0), @@ -168,6 +192,16 @@ } ); + // 疑われた画像ををObserveして、Viewに反映 + gameViewModel.getQLiveData().observe ( + getViewLifecycleOwner(), + QObserver -> { + System.out.println("kota: 疑われた。 疑われた配列: " + QObserver); + setQ(QObserver); + } + ); + + gameViewModel.getEndStateLiveData().observe ( getViewLifecycleOwner(), endStateObserver -> { @@ -393,16 +427,16 @@ // オープンだったときの描画 if (colorList.get(i).contains("r")) { backColors[i].setBackground(resources.getDrawable(R.drawable.red_image)); - imageButtons[i].setVisibility(View.INVISIBLE); + imageButtons[i].setVisibility(INVISIBLE); } else if (colorList.get(i).contains("b")) { backColors[i].setBackground(resources.getDrawable(R.drawable.blue_image)); - imageButtons[i].setVisibility(View.INVISIBLE); + imageButtons[i].setVisibility(INVISIBLE); } else if (colorList.get(i).contains("g")) { backColors[i].setBackground(resources.getDrawable(R.drawable.gray_image)); - imageButtons[i].setVisibility(View.INVISIBLE); + imageButtons[i].setVisibility(INVISIBLE); } else if (colorList.get(i).contains("d")) { backColors[i].setBackground(resources.getDrawable(R.drawable.black_image)); - imageButtons[i].setVisibility(View.INVISIBLE); + imageButtons[i].setVisibility(INVISIBLE); gameViewModel.sendEndState(); finishGameAlertMake(myTeam, nowTurn); } @@ -436,23 +470,19 @@ **/ private void setOpenRealTime(int cno, boolean isOK) { if(isOK == true) { + + nowQList.set(cno, false);//疑い関係 gameViewModel.sendOpenList(cno); if( colorList.get(cno).equals("d") ){ + //Game終了 gameViewModel.sendEndState(); - } else if ( colorList.get(cno).equals(myTeam) ){ -// System.out.println("チームと同じなのでまだ引けます"); - } else { - if( myTeam.equals("r") ){ - nowTurn = "b"; - } else if( myTeam.equals("b") ){ - nowTurn = "r"; - } + } else if ( !colorList.get(cno).equals(myTeam) ){ //ターン切り替え gameViewModel.addTurns(); } - //青と赤のカードが何枚めくれているか + //赤のカードが何枚めくれているか(6枚めくれていたら勝利) if( colorList.get(cno).equals("r") ){ OpenRedCard = 0; nowOpenList.set(cno, true); @@ -462,14 +492,12 @@ } } nowOpenList.set(cno, false); - System.out.println("OpenRedCard:" + OpenRedCard); - - if( OpenRedCard >= 6 ){ + if( OpenRedCard == 6 ){ nowTurn = "b"; finishGameAlertMake(myTeam, nowTurn); } - } + //青のカードが何枚めくれているか(5枚めくれていたら勝利) if( colorList.get(cno).equals("b") ){ OpenBlueCard = 0; nowOpenList.set(cno, true); @@ -479,10 +507,7 @@ } } nowOpenList.set(cno, false); - - System.out.println("OpenBlueCard: " + OpenBlueCard); - - if( OpenBlueCard >= 5 ){ + if( OpenBlueCard == 5 ){ nowTurn = "r"; finishGameAlertMake(myTeam, nowTurn); } @@ -508,8 +533,9 @@ iv.setAdjustViewBounds(true); builder.setView(iv); + builder.setNegativeButton("疑わない", (dialog, id) -> setDoubt(cno, false)); builder.setPositiveButton("疑う", (dialog, id) -> setDoubt(cno, true)); - builder.setNegativeButton("キャンセル", (dialog, id) -> setDoubt(cno, false)); + builder.setNeutralButton("閉じる", (dialog, id) -> setNone(cno, true)); builder.create(); builder.show(); } @@ -519,10 +545,31 @@ **/ private void setDoubt(int cno, boolean isOK) { // 疑う処理 - // 実はまだViewは書けてない - gameViewModel.sendQ(cno); + if( nowQList.get(cno) == false && isOK == true ){ + gameViewModel.sendQ(cno); + } else if( nowQList.get(cno) == true && isOK == false ){ + gameViewModel.sendQ(cno); + } } + //疑われたら枠の色をチームの色に変更(諜報員のみ) + private void setQ(List QList) { + for(int i = 0; i < QList.size(); i++) { + if ( QList.get(i) == true && nowQList.get(i) == false && isMaster.equals(false) ) { + if( nowTurn.equals("r") ){ + backColors[i].setBackground(resources.getDrawable(R.drawable.red_image)); + } else { + backColors[i].setBackground(resources.getDrawable(R.drawable.blue_image)); + } + nowQList.set(i, true); + } else if ( QList.get(i) == false && nowQList.get(i) == true && isMaster.equals(false)){ + backColors[i].setBackground(resources.getDrawable(R.drawable.skin_image)); + nowQList.set(i, false); + } + } + } + + /** * 相手のターンのときに、 * 画像だけ確認できるアラートを表示させるコード diff --git a/app/src/main/java/org/ntlab/irisclient/GameMasterActivity.java b/app/src/main/java/org/ntlab/irisclient/GameMasterActivity.java index fa83fda..4749565 100644 --- a/app/src/main/java/org/ntlab/irisclient/GameMasterActivity.java +++ b/app/src/main/java/org/ntlab/irisclient/GameMasterActivity.java @@ -194,23 +194,21 @@ EditText Hint = findViewById(R.id.GameHint); EditText HintMax = findViewById(R.id.GameHintMax); Button SendHintButton = (Button) findViewById(R.id.SendHint); - - Hint.setFocusableInTouchMode(false); - HintMax.setFocusableInTouchMode(false); - SendHintButton.setFocusableInTouchMode(false); - Hint.setFocusable(false); - HintMax.setFocusable(false); - SendHintButton.setFocusable(false); + Button FinishGuessButton = (Button) findViewById(R.id.finishGuessButton); //自分のチームのターンで、かつ「ヒント入力」時間の場合は行動可能 if(currentTeam.equals(myTeam) && turnState == 0){ isActive = true; - Hint.setFocusableInTouchMode(true); - HintMax.setFocusableInTouchMode(true); - SendHintButton.setFocusableInTouchMode(true); - Hint.setFocusable(true); - HintMax.setFocusable(true); - SendHintButton.setFocusable(true); + Hint.setEnabled(true); + HintMax.setEnabled(true); + SendHintButton.setEnabled(true); + } else { + Hint.setEnabled(false); + Hint.setTextColor(0xff000000); + HintMax.setEnabled(false); + HintMax.setTextColor(0xff000000); + SendHintButton.setEnabled(false); + FinishGuessButton.setEnabled(false); } //デバッグ用 diff --git a/app/src/main/java/org/ntlab/irisclient/GameMemberActivity.java b/app/src/main/java/org/ntlab/irisclient/GameMemberActivity.java index 389a7bd..ccd4ab0 100644 --- a/app/src/main/java/org/ntlab/irisclient/GameMemberActivity.java +++ b/app/src/main/java/org/ntlab/irisclient/GameMemberActivity.java @@ -153,15 +153,22 @@ boolean isActive = false; //非アクティブであれば推測終了の入力を禁止する + EditText Hint = findViewById(R.id.GameHint); + EditText HintMax = findViewById(R.id.GameHintMax); + Button SendHintButton = (Button) findViewById(R.id.SendHint); Button FinishGuessButton = (Button) findViewById(R.id.finishGuessButton); - FinishGuessButton.setFocusable(false); - FinishGuessButton.setFocusableInTouchMode(false); //自分のチームのターンで、かつ「ヒント入力」時間の場合は行動可能 if(currentTeam.equals(myTeam) && turnState == 1){ isActive = true; - FinishGuessButton.setFocusable(true); - FinishGuessButton.setFocusableInTouchMode(true); + FinishGuessButton.setEnabled(true); + } else { + Hint.setEnabled(false); + Hint.setTextColor(0xff000000); + HintMax.setEnabled(false); + HintMax.setTextColor(0xff000000); + SendHintButton.setEnabled(false); + FinishGuessButton.setEnabled(false); } //デバッグ用 @@ -175,4 +182,3 @@ return isActive; } } - diff --git a/app/src/main/java/org/ntlab/irisclient/resources/GameRest.java b/app/src/main/java/org/ntlab/irisclient/resources/GameRest.java index 3fde8c7..d7c388b 100644 --- a/app/src/main/java/org/ntlab/irisclient/resources/GameRest.java +++ b/app/src/main/java/org/ntlab/irisclient/resources/GameRest.java @@ -74,8 +74,9 @@ ); //----------------------------------------------- - @GET("rooms/{rid}/game/turns/{tno}/questions") - Call getQ( + //{tno}//questionsのスラッシュがサーバー側で1個多かったため機能していなかった + @GET("rooms/{rid}/game/turns/{tno}//questions") + Call> getQ( @Path("rid") String rid, @Path("tno") Integer tno ); diff --git a/app/src/main/java/org/ntlab/irisclient/viewmodels/GameViewModel.java b/app/src/main/java/org/ntlab/irisclient/viewmodels/GameViewModel.java index d2036a8..3690461 100644 --- a/app/src/main/java/org/ntlab/irisclient/viewmodels/GameViewModel.java +++ b/app/src/main/java/org/ntlab/irisclient/viewmodels/GameViewModel.java @@ -24,7 +24,6 @@ private Integer tno; final private MutableLiveData turnsMutableLiveData; - //final private MutableLiveData turnMutableLiveData; final private MutableLiveData hintMutableLiveData; final private MutableLiveData> openListMutableLiveData; final private MutableLiveData maxMutableLiveData; @@ -35,42 +34,37 @@ final private MutableLiveData> opensMutableLiveData; final private MutableLiveData> mapMutableLiveData; final private MutableLiveData imageMutableLiveData; - final private MutableLiveData QMutableLiveData; - final private MutableLiveData addTurnsMutableLiveData; + final private MutableLiveData> QMutableLiveData; private GameJson game = new GameJson(); final private GameRest gameRest; final private Retrofit retrofit; //更新比較用フィールド - private String turnsPreData = null; - - private String hintPreData = null; - private List openListPreData = null; - private Integer maxPreData = null; - private Integer turnNumberPreData = null; - private Integer turnStatePreData = null; private Integer endStatePreData = null; - + private String hintPreData = null; + private Integer maxPreData = null; + private List openListPreData = null; private List opensPreData = null; - private Boolean[] QPreData = null; - private Void addTurnsPreData = null; + private Integer turnNumberPreData = null; + private String turnsPreData = null; + private Integer turnStatePreData = null; + private List QPreData = null; //------------------------------------------------------------------ //コンストラクタ public GameViewModel() { - this.turnsMutableLiveData = new MutableLiveData<>(); - this.hintMutableLiveData = new MutableLiveData<>(); - this.openListMutableLiveData = new MutableLiveData<>(); - this.maxMutableLiveData = new MutableLiveData<>(); - this.turnNumberMutableLiveData = new MutableLiveData<>(); - this.turnStateMutableLiveData = new MutableLiveData<>(); - this.endStateMutableLiveData = new MutableLiveData<>(); - this.mapMutableLiveData = new MutableLiveData<>(); this.colorMutableLiveData = new MutableLiveData<>(); - this.opensMutableLiveData = new MutableLiveData<>(); + this.endStateMutableLiveData = new MutableLiveData<>(); + this.hintMutableLiveData = new MutableLiveData<>(); this.imageMutableLiveData = new MutableLiveData<>(); + this.mapMutableLiveData = new MutableLiveData<>(); + this.maxMutableLiveData = new MutableLiveData<>(); + this.openListMutableLiveData = new MutableLiveData<>(); + this.opensMutableLiveData = new MutableLiveData<>(); + this.turnNumberMutableLiveData = new MutableLiveData<>(); + this.turnsMutableLiveData = new MutableLiveData<>(); + this.turnStateMutableLiveData = new MutableLiveData<>(); this.QMutableLiveData = new MutableLiveData<>(); - this.addTurnsMutableLiveData = new MutableLiveData<>(); this.retrofit = new Retrofit.Builder() .baseUrl("http://nitta-lab-www.is.konan-u.ac.jp/iris/") @@ -87,8 +81,8 @@ //初期値呼び出し testGame(); // 通信をして game に値をセットさせる関数 startColor(); - startMap(); startImage(); + startMap(); } //-------------------------------------------------------------- @@ -120,16 +114,51 @@ public LiveData getImageLiveData() { return this.imageMutableLiveData; } - public LiveData getQLiveData() { + public LiveData> getQLiveData() { return this.QMutableLiveData; } - public LiveData getAddTurnsLiveData() { - return this.addTurnsMutableLiveData; - } public GameJson getGame() { return game; } + //ターン数変更 + public void addTurns() { + Call call = gameRest.addTurns(rid); + + call.enqueue(new Callback() { + @Override + public void onResponse(Call call, Response response) { + if (response.isSuccessful()){ + //System.out.println("通信成功:addTurns"); + } + } + @Override + public void onFailure(Call call, Throwable t) { + System.out.println("通信失敗:addTurns"); + System.out.println(t); + } + }); + } + + //現在のGameStateを送信 + public void sendEndState() { + Call call = gameRest.setEndState(rid, tno); + + call.enqueue(new Callback() { + @Override + public void onResponse(Call call, Response response) { + if (response.isSuccessful()){ + //System.out.println("通信成功:sendEndState"); + } + } + @Override + public void onFailure(Call call, Throwable t) { + System.out.println("通信失敗:sendEndState"); + System.out.println(t); + } + }); + } + //マスターのヒント、最大回答数を送信 public void sendHint(String hint, Integer max) { Call call = gameRest.putHint(rid, tno, hint, max); @@ -138,7 +167,7 @@ @Override public void onResponse(Call call, Response response) { if (response.isSuccessful()){ - System.out.println("通信成功:sendHint"); + //System.out.println("通信成功:sendHint"); } } @Override @@ -157,7 +186,7 @@ @Override public void onResponse(Call call, Response response) { if (response.isSuccessful()){ - System.out.println("通信成功:sendOpenList"); + //System.out.println("通信成功:sendOpenList"); } } @@ -169,44 +198,6 @@ }); } - //現在のTurnStateを送信 - public void sendTurnState() { - Call call = gameRest.setTurnState(rid, tno); - - call.enqueue(new Callback() { - @Override - public void onResponse(Call call, Response response) { - if (response.isSuccessful()){ - System.out.println("通信成功:sendTurnState"); - } - } - @Override - public void onFailure(Call call, Throwable t) { - System.out.println("通信失敗:sendTurnState"); - System.out.println(t); - } - }); - } - - //現在のGameStateを送信 - public void sendEndState() { - Call call = gameRest.setEndState(rid, tno); - - call.enqueue(new Callback() { - @Override - public void onResponse(Call call, Response response) { - if (response.isSuccessful()){ - System.out.println("通信成功:sendEndState"); - } - } - @Override - public void onFailure(Call call, Throwable t) { - System.out.println("通信失敗:sendEndState"); - System.out.println(t); - } - }); - } - //疑っているマスの番号を送信 public void sendQ(Integer cno) { Call call = gameRest.changeQ(rid, tno, cno); @@ -215,7 +206,7 @@ @Override public void onResponse(Call call, Response response) { if (response.isSuccessful()){ - System.out.println("通信成功:sendQ"); + //System.out.println("通信成功:sendQ " + cno); } } @Override @@ -226,20 +217,20 @@ }); } - //ターン数変更 - public void addTurns() { - Call call = gameRest.addTurns(rid); + //現在のTurnStateを送信(未使用) + public void sendTurnState() { + Call call = gameRest.setTurnState(rid, tno); call.enqueue(new Callback() { @Override public void onResponse(Call call, Response response) { if (response.isSuccessful()){ - System.out.println("通信成功:addTurns"); + //System.out.println("通信成功:sendTurnState"); } } @Override public void onFailure(Call call, Throwable t) { - System.out.println("通信失敗:addTurns"); + System.out.println("通信失敗:sendTurnState"); System.out.println(t); } }); @@ -265,26 +256,6 @@ }); } - //カードの並び順の取得 - private void startMap() { - Call> call = gameRest.getMap(rid); - - call.enqueue(new Callback>() { - @Override - public void onResponse(Call> call, Response> response) { - if (response.isSuccessful()) { - mapMutableLiveData.setValue(response.body()); - } - } - - @Override - public void onFailure(Call> call, Throwable t) { - System.out.println("通信失敗:updateMap"); - System.out.println(t); - } - }); - } - //カード(画像)の取得 private void startImage() { Call call = gameRest.getGame(rid); @@ -306,23 +277,42 @@ } + //カードの並び順の取得 + private void startMap() { + Call> call = gameRest.getMap(rid); + + call.enqueue(new Callback>() { + @Override + public void onResponse(Call> call, Response> response) { + if (response.isSuccessful()) { + mapMutableLiveData.setValue(response.body()); + } + } + + @Override + public void onFailure(Call> call, Throwable t) { + System.out.println("通信失敗:updateMap"); + System.out.println(t); + } + }); + } + //----------------------------------------------------------------------------- // updates @Override public void update() { - updateTurnNumber(); - updateTurnState(); updateEndState(); - updateTurns(); updateHint(); - updateOpenList(); updateMax(); + updateOpenList(); updateOpens(); + updateTurnNumber(); + updateTurns(); + updateTurnState(); updateQ(); } - //r,bの取得(今どちらのチームかの判別) public void updateTurns() { Call call = gameRest.getTeam(rid); @@ -335,9 +325,8 @@ //初回代入 try { turnsMutableLiveData.setValue(response.body().string()); - turnsPreData = turnsMutableLiveData.getValue(); - System.out.println("現在のチームは" + turnsPreData + "です"); + //System.out.println("現在のチームは" + turnsPreData + "です"); } catch (IOException e) { e.printStackTrace(); } @@ -353,7 +342,7 @@ e.printStackTrace(); } - System.out.println("現在のチームは" + turnsPreData + "です"); + //System.out.println("現在のチームは" + turnsPreData + "です"); } } } @@ -365,39 +354,6 @@ }); } - - //hint,openList,maxの更新(解体されました) - /* - public void updateTurn() { - Call call = gameRest.getTurns(rid, tno); - - call.enqueue(new Callback() { - @Override - public void onResponse(Call call, Response response) { - if (response.isSuccessful()){ - if(turnsPreData == null){ - //初回代入 - turnMutableLiveData.setValue(response.body()); - turnPreData = response.body(); - }else if(response.body().equals(turnPreData)){ - //値が一緒なら書き換えない - }else{ - //値が異なるときのみライブデータを上書き - turnMutableLiveData.setValue(response.body()); - turnPreData = response.body(); - } - } - } - - @Override - public void onFailure(Call call, Throwable t) { - System.out.println("通信失敗:updateTurn"); - System.out.println(t); - } - }); - } - */ - //Hintの更新 public void updateHint() { Call call = gameRest.getHint(rid, tno); @@ -410,9 +366,8 @@ if (hintPreData == null) { try { hintMutableLiveData.setValue(response.body().string()); - hintPreData = hintMutableLiveData.getValue(); - System.out.println("今回のヒントは" + hintPreData + "です(初回)" + hintMutableLiveData.getValue()); + //System.out.println("今回のヒントは" + hintPreData + "です(初回)" + hintMutableLiveData.getValue()); } catch (IOException e) { e.printStackTrace(); } @@ -425,8 +380,7 @@ } catch (IOException e) { e.printStackTrace(); } - - System.out.println("今回のヒントは" + hintPreData + "です"); + //System.out.println("今回のヒントは" + hintPreData + "です"); } } } @@ -632,28 +586,30 @@ //疑っているマス一覧の更新 public void updateQ() { - Call call = gameRest.getQ(rid, tno); + Call> call = gameRest.getQ(rid, tno); - call.enqueue(new Callback() { + call.enqueue(new Callback>() { @Override - public void onResponse(Call call, Response response) { + public void onResponse(Call> call, Response> response) { if (response.isSuccessful()){ - if(turnsPreData == null){ + if(QPreData == null){ //初回代入 QMutableLiveData.setValue(response.body()); QPreData = response.body(); + System.out.println("通信成功:updateQ初回"); }else if(response.body().equals(QPreData)){ //値が一緒なら書き換えない }else{ //値が異なるときのみライブデータを上書き QMutableLiveData.setValue(response.body()); QPreData = response.body(); + System.out.println("通信成功:updateQ"); } } } @Override - public void onFailure(Call call, Throwable t) { + public void onFailure(Call> call, Throwable t) { System.out.println("通信失敗:updateQ"); System.out.println(t); }