2016-05-24 3 views
1

私は立ち往生しています。私が必要とするのは勝利の価値に反するものです。 私はこのチュートリアルでtictactoeをやった:http://hubpages.com/technology/tictactoe。私はそれを完了しました、そして今私は自分で何かを追加したいと思います、そして、それは誰かが何回勝ったかの単なるカウンターです。TicTacToe勝利を数える方法、カウンター助けが必要

//if mWinner = CIRCLE 
    //increase @+id/cross_wins by 1 
//if mWinner = CROSS 
    //increase @+id/circles_wins by 1 
//else increase @+id/draws by 1 

これはすべて私が欲しいものです。それを適切にコーディングする方法を教えてください。

I want the "0" on this to change, if crosses,circles wins the game or it's a draw, just to tick +1

package com.example.jkaminski.myapplication; 

import android.content.Intent; 
import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.view.View; 
import android.widget.ImageView; 
import android.widget.LinearLayout; 
import android.widget.TextView; 
import android.widget.Toast; 

public class GameActivity extends AppCompatActivity { 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    makeScreen(); 
    initialize(); 
} 

private void makeScreen() { 
    View decorView = getWindow().getDecorView(); 
    int uiOptions = View.SYSTEM_UI_FLAG_FULLSCREEN; 
    decorView.setSystemUiVisibility(uiOptions); 
    getSupportActionBar().hide(); 
} 

private ImageView[] mBlocks = new ImageView[9]; 
private TextView mDisplay; 
private LinearLayout mExit, mReplay; 

private enum TURN {CIRCLE, CROSS} 

private TURN mTurn; 
private int mExitCounter = 0; 
private int mStatusCounter = 0; 

private void initialize() { 
    mExit = (LinearLayout) findViewById(R.id.exit); 
    mExit.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      if (mExitCounter == 1) { 
       finish(); 
       System.exit(0); 
      } else { 
       mExitCounter++; 
       Toast.makeText(getApplicationContext(), "Naciśnij ponownie aby wyjść", Toast.LENGTH_SHORT).show(); 
      } 
     } 
    }); 
    mDisplay = (TextView) findViewById(R.id.display_board); 
    mReplay = (LinearLayout) findViewById(R.id.replay); 
    mReplay.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      Intent starter = getIntent(); 
      finish(); 
      starter.setFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION); 
      startActivity(starter); 
     } 
    }); 
    for (int position = 0; position < 9; position++) { 
     int resId = getResources().getIdentifier("block_" + (position + 1), "id", getPackageName()); 
     mBlocks[position] = (ImageView) findViewById(resId); 
     final int finalPosition = position; 
     mBlocks[position].setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       switchTurn(finalPosition); 
      } 
     }); 

    } 
} 

private void switchTurn(int position) { 
    if (mTurn == TURN.CIRCLE) { 
     mBlocks[position].setImageResource(R.drawable.circle); 
     mBlocks[position].setId(GameLogic.CIRCLE); 
     mTurn = TURN.CROSS; 
     mDisplay.setText("teraz KRZYŻYK"); 
    } else { 
     mBlocks[position].setImageResource(R.drawable.cross); 
     mBlocks[position].setId(GameLogic.CROSS); 
     mTurn = TURN.CIRCLE; 
     mDisplay.setText("teraz KÓŁKO"); 
    } 
    mBlocks[position].setEnabled(false); 
    mStatusCounter++; 
    if (GameLogic.isCompleted(position + 1, mBlocks)) { 
     mDisplay.setText(GameLogic.sWinner + " zostaje zwycięzcą!"); 
     displayStick(GameLogic.sSet); 
     disableAll(); 
    } else if (mStatusCounter == 9) { 
     mDisplay.setText("REMIS. Spróbuj ponownie ;)"); 
    } 
} 

private void displayStick(int stick) { 
    View view; 
    switch (stick) { 
     case 1: 
      view = findViewById(R.id.top_horizontal); 
      break; 
     case 2: 
      view = findViewById(R.id.center_horizontal); 
      break; 
     case 3: 
      view = findViewById(R.id.bottom_horizontal); 
      break; 
     case 4: 
      view = findViewById(R.id.left_vertical); 
      break; 
     case 5: 
      view = findViewById(R.id.center_vertical); 
      break; 
     case 6: 
      view = findViewById(R.id.right_vertical); 
      break; 
     case 7: 
      view = findViewById(R.id.left_right_diagonal); 
      break; 
     case 8: 
      view = findViewById(R.id.right_left_diagonal); 
      break; 
     default://which will never happen 
      view = findViewById(R.id.top_horizontal); 
    } 
    view.setVisibility(View.VISIBLE); 
} 

private void disableAll() { 
    for (int i = 0; i < 9; i++) 
     mBlocks[i].setEnabled(false); 
} 

@Override 
public void onBackPressed() { 

} 

private void showResults() { 
    if (GameLogic.mWinner == GameLogic.CIRCLE) { 

    } else if (GameLogic.mWinner == GameLogic.CROSS) { 

    } else { 

    } 
} 

}

package com.example.jkaminski.myapplication; 

import android.widget.ImageView; 

public class GameLogic { 

private static ImageView[] sBlocks; 
public static String sWinner; 
public static int sSet; 

public static final int CIRCLE = 0; 
public static final int CROSS = 1; 

public static int mWinner; 


private static boolean areSameInSet(int first, int second, int third, int set) { 
    boolean value = sBlocks[first - 1].getId() == sBlocks[second - 1].getId() && sBlocks[second - 1].getId() == sBlocks[third - 1].getId(); 
    if (value) { 
     if (sBlocks[first - 1].getId() == CIRCLE) { 
      mWinner = CIRCLE; 
      sWinner = "KÓŁKO"; 
     } else { 
      mWinner = CROSS; 
      sWinner = "KRZYŻYK"; 
     } 
     sSet = set; 
    } 
    return value; 
} 


public static boolean isCompleted(int position, ImageView[] blocks) { 
    GameLogic.sBlocks = blocks; 
    boolean isComplete = false; 
    switch (position) { 
     case 1: 
      isComplete = areSameInSet(1, 2, 3, 1) || 
        areSameInSet(1, 4, 7, 4) || 
        areSameInSet(1, 5, 9, 7); 
      break; 
     case 2: 
      isComplete = areSameInSet(1, 2, 3, 1) || 
        areSameInSet(2, 5, 8, 5); 
      break; 
     case 3: 
      isComplete = areSameInSet(1, 2, 3, 1) || 
        areSameInSet(3, 6, 9, 6) || 
        areSameInSet(3, 5, 7, 8); 
      break; 
     case 4: 
      isComplete = areSameInSet(4, 5, 6, 2) || 
        areSameInSet(1, 4, 7, 4); 
      break; 
     case 5: 
      isComplete = areSameInSet(4, 5, 6, 2) || 
        areSameInSet(2, 5, 8, 5) || 
        areSameInSet(1, 5, 9, 7) || 
        areSameInSet(3, 5, 7, 8); 
      break; 
     case 6: 
      isComplete = areSameInSet(4, 5, 6, 2) || 
        areSameInSet(3, 6, 9, 6); 
      break; 
     case 7: 
      isComplete = areSameInSet(7, 8, 9, 3) || 
        areSameInSet(1, 4, 7, 4) || 
        areSameInSet(3, 5, 7, 8); 
      break; 
     case 8: 
      isComplete = areSameInSet(7, 8, 9, 3) || 
        areSameInSet(2, 5, 8, 5); 
      break; 
     case 9: 
      isComplete = areSameInSet(7, 8, 9, 3) || 
        areSameInSet(3, 6, 9, 6) || 
        areSameInSet(1, 5, 9, 7); 
      break; 
    } 
    return isComplete; 
} 

}

+0

私はあなたが悲しいときGameLogic.isComplete() – Leo

答えて

1

私はあなたがそのようなカウンターを記録するために、静的なクラス変数を使用することができますね。 ちょうどゲームが終了する方法で、関連する変数を+1してください。

+0

いくつかの変数に1を追加しようとするべきだと思いますが、新しいゲームをタップした後、全体のアクティビティのリストア - グリッドだけでなく、私はそれを使うことができないと思います。それは私のカウントを削除します – rocendroll

0

あなたがこれを行うことができる最も簡単な方法は、いくつかの静的カウンタ変数をクラスに追加し、それらをインクリメントし、勝者を決定するときに画面を更新することです。

1

ゲームが完了したら、いくつかのカウンターを増やす必要があります。あなたにはたくさんの選択肢があります。あなたは他の人とstatic変数を使用する可能性があります示唆している:

private static int numWins = 0; 

... 

if (GameLogic.isCompleted(position + 1, mBlocks)) { 
    numWins++; 
    .... 

を私の提案はSharedPreferencesを使用して値を保持することです。カウンタの保存と読み込みのコードが必要になります。

public static int loadNumWins(Context context) 
{ 
    SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); 
    return prefs.getInt("numWins", 0); 
} 

public static void saveNumWins(Context context, int value) 
{ 
    SharedPreferences.Editor prefs = PreferenceManager.getDefaultSharedPreferences(context).edit(); 
    prefs.putInt("numWins", value); 
    prefs.commit(); 
} 

と、カウンタを使用するコード...

if (GameLogic.isCompleted(position + 1, mBlocks)) 
{ 
    int numWins = loadNumWins(this); // load value from prefs 
    numWins++;       // increment it 
    saveNumWins(this, numWins);  // save it back to prefs 
    .... 
+0

そのコメントのおかげで、あなたは私にこれらのことを指定することができますか? 3つの値がありますので、3つのコード例を作成する必要がありますか?どこに貼り付ける必要があるのでしょうか。その後、setContentViewでxmlに表示しますか? – rocendroll

+0

はい、上記のような値を格納/取得するコードが必要です。そのコードは値を識別するために使用されるキーを除いてほとんど同じです - 私は "numWins"を使用しましたが、 "numWinsX"、 "numWinsO"なども必要です。アクティビティクラスに静的関数を入れて呼び出しますwinが発生したかどうかを判断する 'if'ステートメントから' Context'をパラメータとして取ります。この場合、Contextはあなたの主なアクティビティです( 'this'を関数に渡します)。表示するにはXMLにTextViewが必要です。それを取得するために 'findViewById'を使い、' setText'を使います。 – trooper

関連する問題