【问题标题】:how to add shared preferences to tic tac toe Android game?如何将共享偏好添加到井字游戏 Android 游戏?
【发布时间】:2014-03-02 15:56:30
【问题描述】:

我在表格布局中创建了一个井字游戏应用程序,该应用程序在三行中包含 9 个游戏按钮,一个显示轮到谁的文本视图和一个位于底部的新游戏按钮。 我想在代码中添加共享首选项,这样如果我切换方向,游戏就不会继续重启。我知道我需要一个 onPause 和 onResume 方法,但我不确定这些方法中的内容。有人可以帮助实现共享偏好的方法吗?以下是游戏的大部分代码:

private SharedPreferences prefs;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_tic_tac_toe);

    //get references to the widgets

    square1 = (Button) findViewById(R.id.square1);
    square2 = (Button) findViewById(R.id.square2);
    square3 = (Button) findViewById(R.id.square3);
    square4 = (Button) findViewById(R.id.square4);
    square5 = (Button) findViewById(R.id.square5);
    square6 = (Button) findViewById(R.id.square6);
    square7 = (Button) findViewById(R.id.square7);
    square8 = (Button) findViewById(R.id.square8);
    square9 = (Button) findViewById(R.id.square9);

    messageTextView = (TextView) findViewById(R.id.messageTextView);

   square1.setOnClickListener(this);
   square2.setOnClickListener(this);
   square3.setOnClickListener(this);
   square4.setOnClickListener(this);
   square5.setOnClickListener(this);
   square6.setOnClickListener(this);
   square7.setOnClickListener(this);
   square8.setOnClickListener(this);
   square9.setOnClickListener(this);

   prefs = PreferenceManager.getDefaultSharedPreferences(this);
};



@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}

protected void onPause(){


}

public void onResume() {
    super.onResume();


}


@Override
public void onClick(View v) {
    boolean flag;
    String lbl = messageTextView.getText().toString();
    Button btn = (Button) v;

    if (btn.getText().toString().equals("")){
        if (lbl.equals("Player X\'s turn")){
            btn.setText("X");
            messageTextView.setText("Player O\'s turn");
        }

        else{
            btn.setText("0");
            messageTextView.setText("Player X\'s turn");
        }
    }

    flag = determineWinner();

    if (!flag){
        checkAgain();
    }

}



public boolean determineWinner(){
    if (square1.getText().toString().equals("X") &&
            square2.getText().toString().equals("X")
            && square3.getText().toString().equals("X"))
    {
        message = "Player X wins";
        messageTextView.setText(message);   
        disableButtons();
        return true;

    }

    if (square1.getText().toString().equals("X")
            && square4.getText().toString().equals("X")
            && square7.getText().toString().equals("X"))

    {

        message = "Player X wins";
        messageTextView.setText(message);   
        disableButtons();
        return true;

    }

    if (square4.getText().toString().equals("X")
            && square5.getText().toString().equals("X")
            && square6.getText().toString().equals("X"))

    {

        message = "Player X wins";
        messageTextView.setText(message);   
        disableButtons();
        return true;

    }

    if (square7.getText().toString().equals("X")
            && square8.getText().toString().equals("X")
            && square9.getText().toString().equals("X"))

    {

        message = "Player X wins";
        messageTextView.setText(message);   
        disableButtons();
        return true;

    }

    if (square2.getText().toString().equals("X")
            && square5.getText().toString().equals("X")
            && square8.getText().toString().equals("X"))

    {

        message = "Player X wins";
        messageTextView.setText(message);   
        disableButtons();
        return true;

    }

    if (square3.getText().toString().equals("X")
            && square6.getText().toString().equals("X")
            && square9.getText().toString().equals("X"))

    {

        message = "Player X wins";
        messageTextView.setText(message);   
        disableButtons();
        return true;

    }

    if (square1.getText().toString().equals("X")
            && square5.getText().toString().equals("X")
            && square9.getText().toString().equals("X"))

    {

        message = "Player X wins";
        messageTextView.setText(message);   
        disableButtons();
        return true;

    }

    if (square3.getText().toString().equals("X")
            && square5.getText().toString().equals("X")
            && square7.getText().toString().equals("X"))

    {

        message = "Player X wins";
        messageTextView.setText(message);   
        disableButtons();
        return true;

    }

    if (square1.getText().toString().equals("0")
            && square2.getText().toString().equals("0")
            && square3.getText().toString().equals("0"))

    {

        message = "Player O wins";
        messageTextView.setText(message);   
        disableButtons();
        return true;

    }

    if (square4.getText().toString().equals("0")
            && square5.getText().toString().equals("0")
            && square6.getText().toString().equals("0"))

    {

        message = "Player O wins";
        messageTextView.setText(message);   
        disableButtons();
        return true;

    }

    if (square7.getText().toString().equals("0")
            && square8.getText().toString().equals("0")
            && square9.getText().toString().equals("0"))

    {

        message = "Player O wins";
        messageTextView.setText(message);   
        disableButtons();
        return true;

    }

    if (square1.getText().toString().equals("0")
            && square4.getText().toString().equals("0")
            && square7.getText().toString().equals("0"))

    {

        message = "Player O wins";
        messageTextView.setText(message);   
        disableButtons();
        return true;

    }

    if (square2.getText().toString().equals("0")
            && square5.getText().toString().equals("0")
            && square8.getText().toString().equals("0"))

    {

        message = "Player O wins";
        messageTextView.setText(message);   
        disableButtons();
        return true;

    }

    if (square3.getText().toString().equals("0")
            && square6.getText().toString().equals("0")
            && square9.getText().toString().equals("0"))

    {

        message = "Player O wins";
        messageTextView.setText(message);   
        disableButtons();
        return true;

    }

    if (square1.getText().toString().equals("0")
            && square5.getText().toString().equals("0")
            && square9.getText().toString().equals("0"))

    {

        message = "Player O wins";
        messageTextView.setText(message);   
        disableButtons();
        return true;

    }

    if (square3.getText().toString().equals("0")
            && square5.getText().toString().equals("0")
            && square7.getText().toString().equals("0"))

    {

        message = "Player O wins";
        messageTextView.setText(message);   
        disableButtons();
        return true;

    }

    return false;

}

【问题讨论】:

  • I want to add shared preferences to the code so the game doesn't keep restarting if i swtich orientations. - 为什么你的游戏会在方向改变时重新启动?
  • 我不会使用 SharedPreferences,而是使用 onPause/onResume 机制。
  • 不知道为什么换方向后游戏会重启

标签: java android eclipse sharedpreferences tic-tac-toe


【解决方案1】:

我看到的最简单的解决方案是您使用片段来构建您的应用。一旦您实现了单个片段活动(基本上是一个仅在其布局中加载片段的活动)和片段,您只需在片段onCreateView 方法中调用this.setRetainInstance(true)(被覆盖)。 在这种特殊情况下,片段和活动之间唯一重要的区别是视图不是在 onCreate 中创建的,而是在 setContentView 中创建的,而是在 onCreateView 中创建的。反正网上有很多例子。

【讨论】:

    【解决方案2】:

    例如

    @override
    protected void onResume() {
        super.onResume();
        square1.setText(pref.getString("square1", ""));
        square1.setTag("square1"); // you can define view tag in xml layout
        /*
         * to square9
         */
    }
    
    @Override
    public void onClick(View v) {
        pref.edit().putString((String)v.getTag(),currentPlayer).commit();
        if (currentPlayer.equal("X")
            currentPlayer = "O";
        else
            currentPlayer = "X";
    }
    

    在开始新游戏之前不要忘记重置值

    【讨论】:

    • 感谢代码示例。但是我没有 currentPlayer 的变量,所以变量 message 可以在那里工作吗?还有我需要在代码中哪里调用这个 onResume 方法?
    • 当我改变方向时游戏仍然重新启动
    猜你喜欢
    • 2019-05-14
    • 2015-06-12
    • 1970-01-01
    • 1970-01-01
    • 2015-01-08
    • 1970-01-01
    相关资源
    最近更新 更多