Есть два игрока. Сначала первый игрок сделает свой ход, затем второй игрок, затем первый игрок, затем второй игрок ... до завершения. Когда Первый игрок делает свой ход, он должен ждать, пока второй игрок не сыграет свой ход для своего (первого) хода. Аналогично для второго игрока. В моем коде первый ход первого игрока работает отлично, после того, как второй игрок делает свой ход, и он работает. Но после этого возникает ошибка. Ошибка: каждый игрок может двигаться дважды за свой ход, но я хочу сделать один ход за один ход.
if(searching.iffirstplayer){
if(ismovedone){
TextViewDatabaseChecking.setText(Boolean.toString(ismovedone));
Toast.makeText(this, "move already completed", Toast.LENGTH_SHORT).show();
}
else{
ismovedone=true;
TextViewDatabaseChecking.setText(Boolean.toString(ismovedone));
((Button)v).setText("X");
((Button)v).setTextColor(Color.parseColor("#000000"));
((Button)v).setTextSize(50);
referencemove.child(Activity4.username).child("ismovedone").setValue("1");
referencemove.child(Activity4.username).child("ismovedoneagain").setValue("0");
referencemove.child(Activity4.username).child("player2").setValue("-1");
referencemove.child(Activity4.username).child("player1").setValue(FieldCreatorAndChangeDetector());
Thread thread=new Thread(checker2);
thread.setDaemon(true);
thread.start();
}
}
else {
boolean isallempty = true;
for (int i = 0; i < 3; i++) { // CHECKING IF FIRST MOVE OR NOT
for (int j = 0; j < 3; j++) {
if (!buttons[i][j].getText().toString().equals("")) {
isallempty = false; // NOT FIRST MOVE
break;
}
}
}
if (isallempty) {
Toast.makeText(this, "opponent turn", Toast.LENGTH_SHORT).show();
}
else {
if (ismovedoneagain) {
Toast.makeText(this, "move already done", Toast.LENGTH_SHORT).show();
}
else {
ismovedoneagain = true;
((Button) v).setText("O");
((Button) v).setTextColor(Color.parseColor("#FFFFFF"));
((Button) v).setTextSize(50);
referencemove.child(searching.otheruser).child("ismovedone").setValue("0");
referencemove.child(searching.otheruser).child("ismovedoneagain").setValue("1");
referencemove.child(searching.otheruser).child("player1").setValue("-1");
referencemove.child(searching.otheruser).child("player2").setValue(FieldCreatorAndChangeDetector());
Thread thread = new Thread(checker);
thread.setDaemon(true);
thread.start();
}
}
}
checker Thread:
private int moveint;
public Runnable checker=new Runnable() {
@Override
public void run() {
while(true)
{
referencemove.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot snapshot) {
if(!snapshot.child(searching.otheruser).child("player1").getValue().equals("-1")) {
moveint=Integer.parseInt(snapshot.child(searching.otheruser).child("player1").getValue().toString());
isopponentmovedone=true;
}
}
@Override
public void onCancelled(@NonNull DatabaseError error) {
}
});
if(isopponentmovedone)
{
PrinterFromDatabase(moveint,"X");
referencemove.child(searching.otheruser).child("ismovedone").setValue("1");
referencemove.child(searching.otheruser).child("ismovedoneagain").setValue("0");
isopponentmovedone=false;
ismovedoneagain=false;
break;
}
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
};
checker2 Thread:
private int moveint2;
public Runnable checker2=new Runnable() {
@Override
public void run() {
while(true)
{
referencemove.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot snapshot) {
if(!snapshot.child(Activity4.username).child("player2").getValue().equals("-1")) {
moveint2=Integer.parseInt(snapshot.child(Activity4.username).child("player2").getValue().toString());
isopponentmovedoneagain=true;
}
}
@Override
public void onCancelled(@NonNull DatabaseError error) {
}
});
if(isopponentmovedoneagain)
{
PrinterFromDatabase(moveint2,"O");
referencemove.child(Activity4.username).child("ismovedone").setValue("0");
referencemove.child(Activity4.username).child("ismovedoneagain").setValue("1");
isopponentmovedoneagain=false;
ismovedone=false;
break;
}
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
};
Дочерние движения Firebase: введите описание изображения здесь Я новичок. Я не понял, в чем моя ошибка. Пробую 2 дня. Есть ли проблема в ветке?