samedi 10 octobre 2020

Having trouble fixing this infinite loop in Bulgarian Solitaire

Im using Eclipse with Java8 to program this Bulgarian Solitaire game. However, when I run the code: Sometimes the compiler plays the game and Sometimes the compiler does a infinite loop. I've looked through the code and I dont know what's causing the occasional infinite loop.

I dont know if this is a compiler issue, or I am missing a semicolon or mistyped a variable somewhere.

Below is the code:

import java.util.ArrayList;
import java.util.Collections;
import java.util.Random;
public class Bulgarian_Solitaire {
    ArrayList<Integer> cards = new ArrayList<Integer>();
    Random rand = new Random();
    boolean cont = true;
    boolean cont2 = true;
    
    public static void main(String[] args) {
        Bulgarian_Solitaire game = new Bulgarian_Solitaire();
    }
    
    public Bulgarian_Solitaire() {
        System.out.println("Started");
        int sum = 0;
        while (cont) {
            if (sum < 45) {
                cards.add(rand.nextInt(46 - sum));
            } else {
                cont = false;
            }
            
            sum = 0;
            for (int i = 0; i < cards.size(); i++) {
                sum += cards.get(i);
            }
            
            removeZeros(cards);
            
            System.out.println(cards);
        }
        
        System.out.println("Finished Generating Start");
        while (cont2) {
            solitaireStep();
            System.out.println(cards);
            if (checkCards()) {
                cont2 = false;
            }
        }
        
        Collections.sort(cards);
        System.out.println("Cards are sorted");
        System.out.println(cards);
    }
    
    public void removeZeros(ArrayList<Integer> list) {
        for (int j = 0; j < list.size(); j++) {
            if (list.get(j) == 0) {
                list.remove(j);
            }
        }
    }
    
    public void solitaireStep() {
        int numberRemoved = 0;
        
        for (int i = 0; i < cards.size(); i++) {
            int value = cards.get(i);
            cards.set(i, value - 1);
            removeZeros(cards);
            numberRemoved++;
    }
        
        cards.add(numberRemoved);
}
    
    public boolean checkCards() {
        ArrayList<Integer> expectedCards = new ArrayList<Integer>();
        
        for (int i = 1; i < 10; i++) {
            expectedCards.add(i);
        }
        
        ArrayList<Integer> sortedCards = cards;
        Collections.sort(sortedCards);
        boolean equal = true;
        if (sortedCards.size() != expectedCards.size()) {
            equal = false;
        }
        
        for (int i = 0; i < sortedCards.size(); i++) {
            if (sortedCards.size() == expectedCards.size()) {
                if (sortedCards.get(i) != expectedCards.get(i)) {
                    equal = false;
                }
            }
        }
        return equal;
    }
}



Aucun commentaire:

Enregistrer un commentaire