Çözüldü Java kodu sonsuz döngüye giriyor

Bu konu çözüldü olarak işaretlenmiştir. Çözülmediğini düşünüyorsanız konuyu rapor edebilirsiniz.

riLke

Centipat
Katılım
3 Haziran 2022
Mesajlar
127
Çözümler
1
Daha fazla  
Cinsiyet
Erkek
Merhabalar,

Head First chapter 2'den bir alıştırma.

Kitabı okuyanlar hatırlayabilir, oop kavramına girildiği yerin başında, GuessGame, Player, GameLauncher diye üç sınıf oluşturup birine main'i, birine bir metot diğerine de asıl kodun yazıldığı küçük programcık.

Neden sonsuz döngüye giriyor anlayamıyorum, kitapta gördüğüm gibi yazdım.

Java:
package guessgame;


public class GuessGame {
      
              
     Player p1;
     Player p2;
     Player p3;
  
  
  
     public void startGame() {
         p1 = new Player();
         p2 = new Player();
         p3 = new Player();
      
         int guessp1 = 0;
         int guessp2 = 0;
         int guessp3 = 0;
      
         boolean p1isRight = false;
         boolean p2isRight = false;
         boolean p3isRight = false;
      
         int targetNumber = (int) (Math.random() * 10);
         System.out.println("I'm thinking of a number between 0 and 9...");
      
         while (true) {
             System.out.println("Number to guess is " + targetNumber);
      
          
             p1.guess();
             p2.guess();
             p3.guess();
          
             guessp1 = p1.number;
             System.out.println("Player one guessed " + guessp1);
             guessp2 = p2.number;
             System.out.println("Player two guessed " + guessp2);
             guessp3 = p3.number;
             System.out.println("Player three guessed " + guessp3);
          
             if (guessp1 == targetNumber) {
                 p1isRight = true;
                 }
                 if (guessp2 == targetNumber) {
                 p2isRight = true;
                 }
                 if (guessp3 == targetNumber) {
                 p3isRight = true;
                 }
              
                 if (p1isRight || p2isRight || p3isRight) {
                     System.out.println("We have a winner!");
                     System.out.println("Player one got it right? " + p1isRight);
                     System.out.println("Player two got it right? " + p2isRight);
                     System.out.println("Player three got it right? " + p3isRight);
                     System.out.println("Game is over.");
                     break; // game over, so break out of the loop
                     } else {
                     // we must keep going because nobody got it right!
                     System.out.println("Players will have to try again.");
            }}}}
 
Son düzenleme:
Çözüm
@riLke
Java:
package guessgame;

import java.util.Scanner;

public class GuessGame {


    Player p1;
    Player p2;
    Player p3;



    public void startGame() {
        Scanner sc = new Scanner(System.in);
        p1 = new Player();
        p2 = new Player();
        p3 = new Player();

        int guessp1 = 0;
        int guessp2 = 0;
        int guessp3 = 0;

        boolean p1isRight = false;
        boolean p2isRight = false;
        boolean p3isRight = false;

        int targetNumber = (int) (Math.random() * 10);
        System.out.println("I'm thinking of a number between 0 and 9...");

        while (true) {
            System.out.println("Number to guess is " + targetNumber);


            //p1.guess();
            //p2.guess();
            //p3.guess();
           
            System.out.printf("Player 1 write your guess:  ");
            guessp1 = sc.nextInt();
            System.out.printf("\nPlayer 2 write your guess:  ");
            guessp2 = sc.nextInt();
            System.out.printf("\nPlayer 3 write your guess:  ");
            guessp3 = sc.nextInt();
           
           
            //guessp1 = p1.number;
            System.out.println("Player one guessed " + guessp1);
            //guessp2 = p2.number;
            System.out.println("Player two guessed " + guessp2);
            //guessp3 = p3.number;
            System.out.println("Player three guessed " + guessp3);

            if (guessp1 == targetNumber) {
                p1isRight = true;
            }
            if (guessp2 == targetNumber) {
                p2isRight = true;
            }
            if (guessp3 == targetNumber) {
                p3isRight = true;
            }

            if (p1isRight || p2isRight || p3isRight) {
                System.out.println("We have a winner!");
                System.out.println("Player one got it right? " + p1isRight);
                System.out.println("Player two got it right? " + p2isRight);
                System.out.println("Player three got it right? " + p3isRight);
                System.out.println("Game is over.");
                break; // game over, so break out of the loop
            } else {
                // we must keep going because nobody got it right!
                System.out.println("Players will have to try again.");
            }
        }
    }
}
Elimde guessgame package olmadığından kodu çalıştıramıyorum lakin bu şekilde denerseniz düzelebilir.
Çok teşekkürler, bu şekilde çalışıyor gerçekten.

Yine de her şeyi kitaptaki gibi, hatta Youtube'ta da bulduğum bu alıştırmayla ilgili tutorial'leri de kontrol ederek yazdığım halde neden hep sıfır tahmin ediyorlardı orayı anlayamadım ama daha fazla düşünmeyeceğim.

Asıl çözümü buldum. Moderasyon okursa çözüm olarak bu cevabı işaretleyebilir.

Player sınıfının 10. satırındaki;

Kod:
(int)Math.random() * 10;

'da parantezi doğru kullanmadığımdan 0 alıyormuş tahminleri.

Kod:
(int) (Math.random() * 10);

şeklinde değiştirdiğimde doğru sonucu aldım.
Random numara oluşturduktan sonra while bloğunun şartına direkt true girerek kendini bahsettiğiniz sınırsız döngüye alıyor. While bloğunda bu döngünün sonlanmasını sağlayacak herhangi bir komutta yok.
 
Random numara oluşturduktan sonra while bloğunun şartına direkt true girerek kendini bahsettiğiniz sınırsız döngüye alıyor. While bloğunda bu döngünün sonlanmasını sağlayacak herhangi bir komutta yok.
Kodu komple kitaptan kopyalamadım bir kısmını kendim yazdım. Döngüyü kapatan satırı atlamış olabilirim. Şimdi kontrol edeceğim.

Soruyu kimse bilemediğinde zaten devam etmesi gerekiyor. Doğru cevap bulunduğunda döngü sona erecek.

Doğru cevap bulunsa bile devam mı ediyor sizde?
Şimdi tekrar çalıştırdım, bütün player'lar devamlı 0 tahmin ediyor. Guess metodunda bir problem var sanırım bir bakacağım.
 
@riLke Tahminleri method yerine kullanıcıdan alıp dener misiniz? Kısa bir araştırma yaptığımda aynı kütüphaneyi kullanan kişilerin çoğu kullanıcıdan almış girişi.
 
@riLke Tahminleri method yerine kullanıcıdan alıp dener misiniz? Kısa bir araştırma yaptığımda aynı kütüphaneyi kullanan kişilerin çoğu kullanıcıdan almış girişi.
Yani metodu iptal edip (comment out filan şeklinde) kullanıcıların tahminlerini manuel olarak girmem gibi bir durumu mu kast ediyorsunuz?

Siz biraz daha açın lütfen ben epey yoruldum, yarın uygulayacağım söylediklerinizi.
 
@riLke
Java:
package guessgame;

import java.util.Scanner;

public class GuessGame {


    Player p1;
    Player p2;
    Player p3;



    public void startGame() {
        Scanner sc = new Scanner(System.in);
        p1 = new Player();
        p2 = new Player();
        p3 = new Player();

        int guessp1 = 0;
        int guessp2 = 0;
        int guessp3 = 0;

        boolean p1isRight = false;
        boolean p2isRight = false;
        boolean p3isRight = false;

        int targetNumber = (int) (Math.random() * 10);
        System.out.println("I'm thinking of a number between 0 and 9...");

        while (true) {
            System.out.println("Number to guess is " + targetNumber);


            //p1.guess();
            //p2.guess();
            //p3.guess();
            
            System.out.printf("Player 1 write your guess:  ");
            guessp1 = sc.nextInt();
            System.out.printf("\nPlayer 2 write your guess:  ");
            guessp2 = sc.nextInt();
            System.out.printf("\nPlayer 3 write your guess:  ");
            guessp3 = sc.nextInt();
            
            
            //guessp1 = p1.number;
            System.out.println("Player one guessed " + guessp1);
            //guessp2 = p2.number;
            System.out.println("Player two guessed " + guessp2);
            //guessp3 = p3.number;
            System.out.println("Player three guessed " + guessp3);

            if (guessp1 == targetNumber) {
                p1isRight = true;
            }
            if (guessp2 == targetNumber) {
                p2isRight = true;
            }
            if (guessp3 == targetNumber) {
                p3isRight = true;
            }

            if (p1isRight || p2isRight || p3isRight) {
                System.out.println("We have a winner!");
                System.out.println("Player one got it right? " + p1isRight);
                System.out.println("Player two got it right? " + p2isRight);
                System.out.println("Player three got it right? " + p3isRight);
                System.out.println("Game is over.");
                break; // game over, so break out of the loop
            } else {
                // we must keep going because nobody got it right!
                System.out.println("Players will have to try again.");
            }
        }
    }
}
Elimde guessgame package olmadığından kodu çalıştıramıyorum lakin bu şekilde denerseniz düzelebilir.
 
@riLke
Java:
package guessgame;

import java.util.Scanner;

public class GuessGame {


    Player p1;
    Player p2;
    Player p3;



    public void startGame() {
        Scanner sc = new Scanner(System.in);
        p1 = new Player();
        p2 = new Player();
        p3 = new Player();

        int guessp1 = 0;
        int guessp2 = 0;
        int guessp3 = 0;

        boolean p1isRight = false;
        boolean p2isRight = false;
        boolean p3isRight = false;

        int targetNumber = (int) (Math.random() * 10);
        System.out.println("I'm thinking of a number between 0 and 9...");

        while (true) {
            System.out.println("Number to guess is " + targetNumber);


            //p1.guess();
            //p2.guess();
            //p3.guess();
           
            System.out.printf("Player 1 write your guess:  ");
            guessp1 = sc.nextInt();
            System.out.printf("\nPlayer 2 write your guess:  ");
            guessp2 = sc.nextInt();
            System.out.printf("\nPlayer 3 write your guess:  ");
            guessp3 = sc.nextInt();
           
           
            //guessp1 = p1.number;
            System.out.println("Player one guessed " + guessp1);
            //guessp2 = p2.number;
            System.out.println("Player two guessed " + guessp2);
            //guessp3 = p3.number;
            System.out.println("Player three guessed " + guessp3);

            if (guessp1 == targetNumber) {
                p1isRight = true;
            }
            if (guessp2 == targetNumber) {
                p2isRight = true;
            }
            if (guessp3 == targetNumber) {
                p3isRight = true;
            }

            if (p1isRight || p2isRight || p3isRight) {
                System.out.println("We have a winner!");
                System.out.println("Player one got it right? " + p1isRight);
                System.out.println("Player two got it right? " + p2isRight);
                System.out.println("Player three got it right? " + p3isRight);
                System.out.println("Game is over.");
                break; // game over, so break out of the loop
            } else {
                // we must keep going because nobody got it right!
                System.out.println("Players will have to try again.");
            }
        }
    }
}
Elimde guessgame package olmadığından kodu çalıştıramıyorum lakin bu şekilde denerseniz düzelebilir.
Çok teşekkürler, bu şekilde çalışıyor gerçekten.

Yine de her şeyi kitaptaki gibi, hatta Youtube'ta da bulduğum bu alıştırmayla ilgili tutorial'leri de kontrol ederek yazdığım halde neden hep sıfır tahmin ediyorlardı orayı anlayamadım ama daha fazla düşünmeyeceğim.

Asıl çözümü buldum. Moderasyon okursa çözüm olarak bu cevabı işaretleyebilir.

Player sınıfının 10. satırındaki;

Kod:
(int)Math.random() * 10;

'da parantezi doğru kullanmadığımdan 0 alıyormuş tahminleri.

Kod:
(int) (Math.random() * 10);

şeklinde değiştirdiğimde doğru sonucu aldım.
 
Son düzenleme:
Çözüm

Geri
Yukarı