Is it alive? No. But wait... Yes!

Started by
11 comments, last by L. Spiro 10 years, 10 months ago

Glorious code snippet from my old scrapped game. I just don't have the right words to describe this...


public boolean isAlive(){
    boolean alive = false;
    
    if(isDead() == true) alive = isDead();
    if(isDead() == false) alive = !isDead();
 
    return alive;
}

“There are thousands and thousands of people out there leading lives of quiet, screaming desperation, where they work long, hard hours at jobs they hate to enable them to buy things they don't need to impress people they don't like.”? Nigel Marsh
Advertisement
Nice, I wonder how "isDead" is implemented though...

Nice, I wonder how "isDead" is implemented though...

It just returns isDead boolean variable lol!

“There are thousands and thousands of people out there leading lives of quiet, screaming desperation, where they work long, hard hours at jobs they hate to enable them to buy things they don't need to impress people they don't like.”? Nigel Marsh

This sounds like something my friend would made on a regular basis XD

This is the class implementation for Schrodinger's cat.

“If I understand the standard right it is legal and safe to do this but the resulting value could be anything.”

hahaha Bacterius, good one!

amazing function, lets always return true! :)

On first read, I actually thought it did what it was supposed to. That is amusing, though. I always wonder when people give a variable an initial value, before assigning a value to it in all possible branches.

That is amusing, though. I always wonder when people give a variable an initial value, before assigning a value to it in all possible branches.

It's more foolproof in case you forget to initialize it later. It ensures the variable can't be used with an undefined value no matter what.

Also, compilers will complain if you don't do this. Most of the time they will detect if it's guaranteed to get initialized later (in which case they won't emit a warning), but in some cases they may fail to realize it (and in some cases it's guaranteed but it relies on code from outside which means the compiler outright can't tell).

Don't pay much attention to "the hedgehog" in my nick, it's just because "Sik" was already taken =/ By the way, Sik is pronounced like seek, not like sick.

Nice, I wonder how "isDead" is implemented though...

Why, the implementation of isDead() is obvious!

 
public boolean isDead() {
    boolean dead = false;
    
    if(isAlive() == true) dead = isAlive();
    if(isAlive() == false) dead = !isAlive();
 
    return dead;
}
 

And if you feel that is just leaving Schrödinger's cat in the box:

 
 
public class Critter {
 
    // Given
    public boolean isAlive(){
        boolean alive = false;
        
        if(isDead() == true) alive = isDead();
        if(isDead() == false) alive = !isDead();
     
        return alive;
    }
 
    private boolean dead = false;
 
    private int counter = 0;
    
    private boolean isDead() {
        if(dead) {
            ++counter;
            return dead && counter % 2 == 0;
        }
        return dead;
    }
    
    public void squish() {
        dead = true;
    }
 
}
 

Now we can take our critters for a quick spin:

 
 
public class Main {
 
    private static String describeStatus(Critter critter) {
        return critter.isAlive() ? "very much alive" : "a little worse for wear";
    }
    
    private static String describeStep() {
        double random  = Math.random();
        if(random < 1.0 / 3.0) {
            return "Squish!";
        } else if(random < 2.0 / 3.0) {
            return "Squelch!";
        }
        return "Crunch!";
    }
    
    public static void main(String [] args) {
        Critter critter = new Critter();
        System.out.println("What a lovely little critter! I sure hope nothing happens it!");
        if(Math.random() < 0.5) {
            System.out.println(describeStep());
            critter.squish();
            System.out.println("Oh dear, I accidentally stepped on it. Poor thing is looking " + describeStatus(critter) + " now...");
        } else {
            System.out.println("Close call, I narrowly avoided it. It is looking " + describeStatus(critter) + " now...");
        }
    }
    
}
 

I hate it when I find actual code which looks not unlike this, bugs in one area worked around by equally crazy stuff somewhere else.

And if you feel that is just leaving Schrödinger's cat in the box:


 
 
public class Critter {
 
    // Given
    public boolean isAlive(){
        boolean alive = false;
        
        if(isDead() == true) alive = isDead();
        if(isDead() == false) alive = !isDead();
     
        return alive;
    }
 
    private boolean dead = false;
 
    private int counter = 0;
    
    private boolean isDead() {
        if(dead) {
            ++counter;
            return dead && counter % 2 == 0;
        }
        return dead;
    }
    
    public void squish() {
        dead = true;
    }
 
}
 

i'm curious if you intended the counter to actually be useful in making sure isAlive return the correct result?

edit: actually, after re-reading the code several times, i'm not sure if it does actually fix it.

edit2: you'd use a pre-increment on it's own line? i tend to stick to post-increments if it's on it's own line.

Check out https://www.facebook.com/LiquidGames for some great games made by me on the Playstation Mobile market.

This topic is closed to new replies.

Advertisement