我正在编写tic tac toe游戏,其中我调用imageTapped图像被点击以改变其图像交叉然后它调用aiturn以找到有效的移动并将其图像更改为圆形。现在我的问题是如何从非静态方法imageTapped调用非静态方法,而不创建其对象。
package com.example.kapil.tictactoe;
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;
public class MainActivity extends AppCompatActivity {
private GameLogic gameLogic;
LinearLayout linearLayout;
TextView label;
public void imageTapped (View view) {
ImageView image = (ImageView) view;
label = findViewById(R.id.label);
String pos = image.getTag().toString();
//if button is already tapped
if (! gameLogic.setImage(Integer.valueOf(pos)))
return;
image.setImageResource(R.drawable.cross);
//return 1 for win 2 for draw otherwise 0
int win = gameLogic.logic();
if (win == 1) {
label.setText("You Win!!");
gameLogic.gameOver();
return;
} else if (win == 2) {
label.setText("Game Draws!!");
return;
}
aiturn();
}
public void aiturn () {
int move = gameLogic.aiMove();//return best move between 0 to 8
int rowNum = move/3;
int colNum = move%3;
if (rowNum == 0) {
linearLayout = findViewById(R.id.line1);
} else if (rowNum == 1) {
linearLayout = findViewById(R.id.line2);
} else if (rowNum == 2) {
linearLayout = findViewById(R.id.line3);
}
((ImageView) linearLayout.getChildAt(colNum)).setImageResource(R.drawable.circle);
label = findViewById(R.id.label);
//return 1 for win 2 for draw otherwise 0
int win = gameLogic.logic();
if (win == 1) {
label.setText("AI wins!!");
gameLogic.gameOver();
} else if (win == 2) {
label.setText("Game Draws!!");
}
}
//if play again button is pressed
public void Reset (View view) {
gameLogic.reset();
TextView label = findViewById(R.id.label);
label.setText("");
int ids[] = {R.id.line1,R.id.line2,R.id.line3};
for (int k=0;k<ids.length;k++) {
LinearLayout linearLayout = findViewById(ids[k]);
for (int i = 0; i < linearLayout.getChildCount(); i++) {
((ImageView) linearLayout.getChildAt(i)).setImageResource(R.mipmap.ic_launcher);
}
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
gameLogic = new GameLogic();
}
}
答案 0 :(得分:2)
这是有效的,因为Android框架会创建活动的实例。
答案 1 :(得分:0)
现在我的问题是如何从非静态方法
aiturn
调用非静态方法imageTapped
而不创建其对象。
Android应用程序不是使用public static void main(...)
方法启动的,就像传统的Java应用程序一样。
相反,当您的应用程序启动时,Android框架会自动创建应用程序活动类的实例,并将它们连接到用户界面(根据XML文件)。
然后,当用户点击&#34;时,框架会调用(现有)活动对象上的imageTapped
方法。然后在同一个对象上调用aiturn
。
或者至少,我认为这是编写该代码的人的 intent 。实际上,imageTapped
方法似乎不是MainActivity
类的超类层次结构中的API方法。所以我怀疑它不会被召唤。
我不确定你到底想要做什么,但也许你应该覆盖onTouchEvent(...)