Первый ход работает отлично, но после этого произошла ошибка. Подробности ниже: - PullRequest
0 голосов
/ 04 августа 2020

Есть два игрока. Сначала первый игрок сделает свой ход, затем второй игрок, затем первый игрок, затем второй игрок ... до завершения. Когда Первый игрок делает свой ход, он должен ждать, пока второй игрок не сыграет свой ход для своего (первого) хода. Аналогично для второго игрока. В моем коде первый ход первого игрока работает отлично, после того, как второй игрок делает свой ход, и он работает. Но после этого возникает ошибка. Ошибка: каждый игрок может двигаться дважды за свой ход, но я хочу сделать один ход за один ход.

               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 дня. Есть ли проблема в ветке?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...