我是Android编程的新手,我想写一个TicTacToe游戏以获得更多学习,我跟着
这篇文章(enter link description here)并更改了本文的一部分以便更好地理解;)
我的问题在于validateGame()方法,当我在一条水平线上写交叉时(我的意思是
exapmle:coordinate [0] [0] = X,坐标0 = X,坐标[0] [2] = X),此方法应首先运行
'for'循环并写入日志和吐司“水平x”,但该方法第二次'for'循环和
在日志“vertical X”中写入。
无论如何,我的方法可以检测X或O但无法检测水平线或垂直线。 问题是什么?怎么解决这个问题?我无法理解本
中的validate_game()方法文章,我想自己写一个方法;)请帮助我。
干杯。
public boolean validateGame(){
Cell check=null;
int counter=0;
XSymbol xsym=new XSymbol();
OSymbol osym=new OSymbol();
//horizontal
for(int i=0;i<coordinate.length;i++){
check=null;
for(int j=0;j<coordinate.length;j++){
if(!coordinate[i][j].equals(check)||coordinate[i][j] instanceof Empty){
check=coordinate[i][j];
counter=0;
}
else
counter++;
if(counter==playerWin-1){
if(coordinate[i][j].equals(xsym)){
winX=true;
Log.e("horizontal", "x");
Toast.makeText(getContext(), "HORIZONTAL X", Toast.LENGTH_LONG).show();
}
else{
winO=true;
Log.e("horizontal", "o");
Toast.makeText(getContext(), "HORIZONTAL O", Toast.LENGTH_LONG).show();
}
return true;
}
}
counter=0;
}
//vertical
for(int i=0;i<coordinate.length;i++){
check=null;
counter=0;
for(int j=0;j<coordinate.length;j++){
if(!coordinate[j][i].equals(check)||coordinate[j][i] instanceof Empty){
check=coordinate[j][i];
counter=0;
}
else
counter++;
if(counter==playerWin-1){
if(coordinate[j][i].equals(osym)){
winO=true;
Log.e("vertical", "o");
Toast.makeText(getContext(), "VERTICAL O", Toast.LENGTH_LONG).show();
}
else{
winX=true;
Log.e("vertical", "x");
Toast.makeText(getContext(), "VERTIC" +"AL X", Toast.LENGTH_LONG).show();
}
return true;
}
}
counter=0;
}
return false;
}
抱歉我的英语不好:P
更新:我想回答我的问题并改变了我的问题,但网站不允许:(无论如何,我更新了我的第一个答案。
我写了你提出的方法,但我的程序没有再次运行:(我认为我的另一个问题 事情。我写了Cell and Empty和OSymbol和XSymbol课程,请阅读并告诉我,这是什么 问题??
你的方法,当我触摸我的屏幕第一次点击,吐司显示'水平O'!
Cell.java:
public abstract class Cell extends Point {
public Cell(int x, int y) {
super(x, y);
}
public Cell(){
super();
}
abstract public void draw(Canvas g,Resources res, int x, int y, int w, int h);
}
Empty.java:
public class Empty extends Cell {
public Empty(int x, int y) {
super(x, y);
}
public Empty(){
super();
}
public void draw(Canvas g, Resources res, int x, int y, int w, int h) {
Bitmap im = BitmapFactory.decodeResource(res, R.drawable.blank);
g.drawBitmap(im, null, new Rect(x*w, y*h, (x*w)+w, (y*h)+h), new Paint());
}
@Override
public boolean equals(Object obj) {
if (obj instanceof Empty) {
return true;
} else {
return false;
}
}
}
XSymbol.java:
public class XSymbol extends Cell {
public XSymbol(int x, int y) {
super(x, y);
}
public XSymbol(){
super();
}
public void draw(Canvas g, Resources res, int x, int y, int w, int h) {
Bitmap im = BitmapFactory.decodeResource(res, R.drawable.x);
g.drawBitmap(im, null, new Rect(x*w, y*h, (x*w)+w, (y*h)+h), new Paint());
}
@Override
public boolean equals(Object obj) {
if (obj instanceof XSymbol) {
return true;
} else {
return false;
}
}
}
OSymbol.java:
public class OSymbol extends Cell {
public OSymbol(int x, int y) {
super(x, y);
}
public OSymbol(){
super();
}
public void draw(Canvas g, Resources res, int x, int y, int w, int h) {
Bitmap im = BitmapFactory.decodeResource(res, R.drawable.o);
g.drawBitmap(im, null, new Rect(x*w, y*h, (x*w)+w, (y*h)+h), new Paint());
}
@Override
public boolean equals(Object obj) {
if (obj instanceof OSymbol) {
return true;
} else {
return false;
}
}
}
Game.java:
public class Game extends View{
.
.
.
@Override
public boolean onTouchEvent(MotionEvent event){
int x_touch=(int)(event.getX()/(this.getWidth()/x));
int y_touch=(int)(event.getY()/(this.getHeight()/y));
drawImage(x_touch,y_touch);
return super.onTouchEvent(event);
}
public void drawImage(int x_touch,int y_touch){
Cell cell=null;
if(whatDrawn){
cell=new XSymbol(x_touch,y_touch);
whatDrawn=false;
}else{
cell=new OSymbol(x_touch,y_touch);
whatDrawn=true;
}
coordinate[x_touch][y_touch]=cell;
validate();
}
public boolean validate(){
XSymbol xsym=new XSymbol();
OSymbol osym=new OSymbol();
boolean xWin=false;
boolean oWin=false;
for(int i=0;i<coordinate.length;i++){
boolean won=true;
for(int j=1;j<coordinate.length;j++){
if(!coordinate[i][j-1].equals(coordinate[i][j])){
won=false;
break;
}
}
if(won){
if(coordinate[i][0].equals(xsym)){
xWin=true;
Toast.makeText(getContext(), "horizontal X", Toast.LENGTH_LONG).show();
}
else{
oWin=true;
Toast.makeText(getContext(), "horizontal O", Toast.LENGTH_LONG).show();
}
}
}
//vertical
for(int i=0;i<coordinate.length;i++){
boolean won=true;
for(int j=1;j<coordinate.length;j++){
if(!coordinate[j-1][i].equals(coordinate[j][i])){
won=false;
break;
}
}
if(won){
if(coordinate[0][i].equals(xsym)){
xWin=true;
Toast.makeText(getContext(), "vertical X", Toast.LENGTH_LONG).show();
}
else{
oWin=true;
Toast.makeText(getContext(), "vertical O", Toast.LENGTH_LONG).show();
}
}
}
return false;
}
.
.
.
}
抱歉很长的问题:( 谢谢。 干杯
答案 0 :(得分:-1)
您的检查变量未正确初始化。当你测试差异时你应该打破:
//horizontal
for(int i=0;i<coordinate.length;i++){
boolean won = true;
for(int j=1;j<coordinate.length;j++){
if (!coordinates[i][j].equals(coordinates[i][j-1]) {
won = false;
break;
}
}
if (won) {
if(coordinate[i][0].equals(xsym)){
xWin = true;
} else {
oWin = true;
}
}
}
在英语中,其内容如下:
对于每一行,只要一个单元格与前一单元格不同,它就不是获胜线。
如果是获胜线,则获胜者是在该线的第一个单元格上放置符号的玩家。