我是Android新手。我正在创建Tic Tac Toe游戏,单击按钮再次播放时出现错误。我附上我的代码。
我想了解为什么它不起作用,所以下次我可以更好地帮助自己。游戏逻辑运行正常。当玩家获胜时,会弹出一个布局,并与玩家和“再次播放”按钮组合,当我单击该按钮上的调用onClickfunction“ PlayAgain”时,它就会崩溃。
这是My MainActivity.java代码:
package com.example.kiran.tictactoegame;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.text.Layout;
import android.view.View;
import android.widget.GridLayout;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
//0 = Yellow and 1 = Red
int activePlayer = 0 ;
boolean gameIsActive=true;
// 2 means block is unplayed
int[] gameState={2,2,2,2,2,2,2,2,2};
int [][] winningPositions={{0,1,2},{3,4,5},{6,7,8},{0,3,6},{1,4,7},{2,5,8},{0,4,8},{2,4,6}};
public void dropIn(View view)
{
ImageView counter = (ImageView) view; //this is the tap where use tap on screen which we pass it in function
//System.out.println(counter.getTag().toString());
int tappedCounter = Integer.parseInt(counter.getTag().toString());
// if statement to see if that block is already played or not and if not then place dice
if(gameState[tappedCounter]==2 && gameIsActive) {
counter.setTranslationY(-1000f);
gameState[tappedCounter]=activePlayer;
// if statement to find whose chance is it to play
if (activePlayer == 0) {
counter.setImageResource(R.drawable.yellow);
activePlayer = 1;
} else {
counter.setImageResource(R.drawable.red);
activePlayer = 0;
}
counter.animate().translationYBy(1000f).setDuration(300);
}
// for loop to see if someone won
for(int[] winningPosition : winningPositions)
{
// we are checking if all 3 position are same (either 0 for player one or 1 for player 2) is same and not 2 (means empty)
if (gameState[winningPosition[0]]==gameState[winningPosition[1]] &&
gameState[winningPosition[1]]==gameState[winningPosition[2]] &&
gameState[winningPosition[0]]!=2) {
// someone won
gameIsActive=false;
String winner="Red";
if(gameState[winningPosition[0]]==0){
winner="Yellow";
}
TextView winnerMassage = (TextView) findViewById(R.id.winnerText);
winnerMassage.setText(winner + " Has Won!");
LinearLayout layout = (LinearLayout) findViewById(R.id.playAgainLayout);
layout.setVisibility(view.VISIBLE);
}
}
}
public void playAgain(View view)
{
Toast.makeText(MainActivity.this,"PlayAgain",Toast.LENGTH_LONG).show();
LinearLayout layout = (LinearLayout) findViewById(R.id.playAgainLayout);
layout.setVisibility(view.INVISIBLE);
//0 = Yellow and 1 = Red
activePlayer = 0 ;
gameIsActive=true;
// 2 means block is unplayed
//gameState={2,2,2,2,2,2,2,2,2}; cannot get again like this so for doing it we use Loop
for(int i=0;i<gameState.length;i++)
{
gameState[i]=2;
}
// to set all sources of dice to null
GridLayout gridLayout= (GridLayout) findViewById(R.id.gridLayout);
for(int i=0;i<gridLayout.getChildCount();i++)
{
((ImageView) gridLayout.getChildAt(i)).setImageResource(0); // it will get all the child of grid view(which is image view and set its source to NULL
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
}
这是错误,我正在获取ErrorLog
D/AndroidRuntime: Shutting down VM
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.kiran.tictactoegame, PID: 18702
java.lang.IllegalStateException: Could not execute method for android:onClick
at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:389)
at android.view.View.performClick(View.java:6597)
at android.view.View.performClickInternal(View.java:6574)
at android.view.View.access$3100(View.java:778)
at android.view.View$PerformClick.run(View.java:25883)
at android.os.Handler.handleCallback(Handler.java:873)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:193)
at android.app.ActivityThread.main(ActivityThread.java:6642)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
Caused by: java.lang.reflect.InvocationTargetException
at java.lang.reflect.Method.invoke(Native Method)
at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:384)
at android.view.View.performClick(View.java:6597)
at android.view.View.performClickInternal(View.java:6574)
at android.view.View.access$3100(View.java:778)
at android.view.View$PerformClick.run(View.java:25883)
at android.os.Handler.handleCallback(Handler.java:873)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:193)
at android.app.ActivityThread.main(ActivityThread.java:6642)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
Caused by: java.lang.ClassCastException: android.support.v7.widget.GridLayout cannot be cast to android.widget.GridLayout
at com.example.kiran.tictactoegame.MainActivity.playAgain(MainActivity.java:81)
at java.lang.reflect.Method.invoke(Native Method)
at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:384)
at android.view.View.performClick(View.java:6597)
at android.view.View.performClickInternal(View.java:6574)
at android.view.View.access$3100(View.java:778)
at android.view.View$PerformClick.run(View.java:25883)
at android.os.Handler.handleCallback(Handler.java:873)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:193)
at android.app.ActivityThread.main(ActivityThread.java:6642)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
I/Process: Sending signal. PID: 18702 SIG: 9
Application terminated.
更改
import android.widget.GridLayout;
至
import android.support.v7.widget.GridLayout;
因为错误显示强制转换异常。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句