Question

In: Computer Science

Project #1 Designing and implementing the Game of Life The main task is to implement (in...

Project #1

Designing and implementing the Game of Life

The main task is to implement (in java) a 2-D (or 3-D) Graphic version of the Game of Life

Solutions

Expert Solution

NOTE: We get only 2 hours to solve a problem. In this limited time frame, I could only come up with the initial game setup without any graphics.

CODE

Grid.java

public class Grid {

    private static int DEFAULT_WIDTH = 8;
    private static int DEFAULT_HEIGHT = 7;

    private int[][] grid;
    private int rows;
    private int columns;

    /**
     * Constructor that creates a random state
     */
    public Grid() {
        grid = new int[DEFAULT_WIDTH][DEFAULT_HEIGHT];
        for (int i=0; i<DEFAULT_WIDTH; i++) {
            for (int j=0; j<DEFAULT_HEIGHT; j++) {
                grid[i][j] = (int) Math.round(Math.random());
            }
        }

        this.rows = this.grid.length;
        this.columns = this.grid[0].length;
    }

    /**
     * Constructor allowing for initial state to be passed in.
     *
     * @param grid Two dimensional array of state to start with
     * @throws IllegalArgumentException
     */
    public Grid(int[][] grid) {
        if (isJagged(grid)) {
            throw new IllegalArgumentException("Arrays passed in cannot be jagged");
        }
        this.grid = grid;
        this.rows = this.grid.length;
        this.columns = this.grid[0].length;
    }

    /**
     * Returns the current generation
     *
     * @return Returns two dimensional array representing current state
     */
    public int[][] currentGeneration() {

        return this.grid;
    }

    /**
     * Returns the number of rows in the grid
     *
     * @return Number of rows
     */
    public int rows() {
        return this.rows;
    }

    /**
     * Returns the number of columns in the grid
     *
     * @return Number of columns
     */
    public int columns() {
        return this.columns;
    }

    /**
     * Returns the next generation
     *
     * @return Returns two dimensional array representing next state
     */
    public int[][] nextGeneration() {

        int[][] futureGeneration = new int[grid.length][grid[0].length];
        int rows = grid.length;
        int columns = grid[0].length;

        // iterate through two dimensional array
        for (int i=0; i<rows; i++) {
            for(int j=0; j<columns; j++) {
                futureGeneration[i][j] = this.getNextStateForCell(i,j);
            }
        }
        return futureGeneration;
    }

    /**
     * Gets next state for a particular cell
     *
     * @param i Row index of the grid
     * @param j Column index of the grid
     * @return 1 is cell alive, 0 if cell is dead
     */
    private int getNextStateForCell(int i, int j) {

        // get living neighbors
        int aliveNeighbors = this.calculateLivingNeighbors(i,j);

        /**
         * Cell is lonely with less than two live neighbors and dies
         */
        if ((grid[i][j] == 1) && (aliveNeighbors < 2)) {
            return  0;
        }

        /**
         * Cell is overcrowded and dies
         */
        else if ((grid[i][j] == 1) && aliveNeighbors > 3) {
            return  0;
        }

        /**
         * Cell is dead but 3 lives neighbors causes it to be born
         */
        else if (grid[i][j] == 0 && aliveNeighbors == 3) {
            return  1;
        }

        /**
         * Nothing changes so copy that state
         */
        else {
            return grid[i][j];
        }
    }

    /**
     * Returns the count of living neighbors for a particular cell in the grid
     *
     * @param i Row index of the grid
     * @param j Column index of the grid
     * @return Count of living neighbors for particular cell
     */
    private int calculateLivingNeighbors(int i, int j) {
        int liveCount = 0;
        for (int x=-1; x<=1; x++) {
            for (int y = -1; y <= 1; y++) {
                // check for boundary conditions
                if (i + x < 0 || i + x > (this.rows - 1) || y + j < 0 || y + j > (this.columns - 1)) {
                    continue;
                }
                liveCount += grid[i + x][y + j];
            }
        }

        // remove since we may have counted ourselves
        liveCount -= grid[i][j];

        return liveCount;
    }

    /**
     * Determines if array is jagged.
     *
     * @param array Array to test if jagged
     * @return True if jagged, otherwise false
     */
    private boolean isJagged(int[][] array) {
        boolean isJagged = false;

        if (array != null) {
            Integer length = null;
            for (int i=0; i<array.length; i++) {
                if(length == null) {
                    length = array[i].length;
                }
                else if (length.equals(array[i].length)) {
                    continue;
                }
                else {
                    isJagged = true;
                    break;
                }
            }
        }

        return isJagged;
    }
}

GameOfLife.java

public class GameOfLife {

    public static void main(String[] args) {

        Grid grid = new Grid();
        int[][] currentGen = grid.currentGeneration();
        int[][] nextGen = grid.nextGeneration();
        System.out.println("Current Generation");
        printResults(currentGen);
        System.out.println("Next Generation");
        printResults(nextGen);
    }

    private static void printResults(int[][] results) {
        for (int i=0; i<results.length; i++) {
            for (int j=0; j<results[i].length; j++) {
                if (results[i][j] == 0) {
                    System.out.print(".");
                } else {
                    System.out.print("*");
                }
            }
            System.out.println();
        }
    }
}

Related Solutions

Assignment Implement Conway’s Game of Life. The Game of Life is a simple simulation that takes...
Assignment Implement Conway’s Game of Life. The Game of Life is a simple simulation that takes place in a grid of cells. Each cell can be either alive or dead, and it interacts with its neighbors (horizontally, vertically, or diagonally). In each iteration, a decision will be made to see if living cells stay alive, or if dead cells become alive. The algorithm is as follows: If a cell is alive: If it has less than two living neighbors, it...
Assignment Implement Conway’s Game of Life IN C The Game of Life is a simple simulation...
Assignment Implement Conway’s Game of Life IN C The Game of Life is a simple simulation that takes place in a grid of cells. Each cell can be either alive or dead, and it interacts with its neighbors (horizontally, vertically, or diagonally). In each iteration, a decision will be made to see if living cells stay alive, or if dead cells become alive. The algorithm is as follows: If a cell is alive: If it has less than two living...
Assignment Implement Conway’s Game of Life. The Game of Life is a simple simulation that takes...
Assignment Implement Conway’s Game of Life. The Game of Life is a simple simulation that takes place in a grid of cells. Each cell can be either alive or dead, and it interacts with its neighbors (horizontally, vertically, or diagonally). In each iteration, a decision will be made to see if living cells stay alive, or if dead cells become alive. The algorithm is as follows: If a cell is alive: If it has less than two living neighbors, it...
(C++ with main to test) 2.2 Task 1 You are going to implement a variant of...
(C++ with main to test) 2.2 Task 1 You are going to implement a variant of the standard linked list, the circular list. The circular linked list is a variant of the standard linked list that wraps around so that traversals through the list will wrap around to the beginning instead of simply reaching the end. This will consist of implementing two classes: cLL and item. 2.2.1 cLL The class is described according to the simple UML diagram below: 2cLL<T>...
C++ (With main to test) 2.2 Task 1 You are going to implement a variant of...
C++ (With main to test) 2.2 Task 1 You are going to implement a variant of the standard linked list, the doubly linked list. Doubly linked lists are because they enable a backwards and forwards traversal of the list through the addition of more pointers. By increasing the memory cost of the list, it enables a better access since the list does not need to be traversed in only one direction. This will consist of implementing two classes: dLL and...
List the three main goals of a project. Use an example of a project to implement...
List the three main goals of a project. Use an example of a project to implement a new billing procedure for a small lawn mowing business, describe how project management principles help achieve these goals.
In this project we will implement the Minesweeper game. Minesweeper is played on a rectangle grid....
In this project we will implement the Minesweeper game. Minesweeper is played on a rectangle grid. When the game starts, a number of bombs are hidden on random positions on the field. In every round, the player "touches" a cell of the field. If the cell contains a bomb, it explodes, the game ends, and the player loses. Otherwise, the cell is uncovered to show the number of bombs in the vicinity, that is, the number of neighboring cells that...
In this task you will complete the calculation and implement the Clear button. 1. When an...
In this task you will complete the calculation and implement the Clear button. 1. When an arithmetic operator is pressed retrieve the String from the JLabel, parse it to a Float value and assign it to a variable num1. Consult the Java API and the textbook to workout how to convert a String to a Float. Hint: use the same structure as when we convert a String to an Integer. 2. You should retrieve the operator and store it in...
Project 1—UNIX Shell This project consists of designing a C program to serve as a shell...
Project 1—UNIX Shell This project consists of designing a C program to serve as a shell interface that accepts user commands and then executes each command in a separate process. Your implementation will support input and output redirection, as well as pipes as a form of IPC between a pair of commands. Completing this project will involve using the UNIX fork(), exec(), wait(), dup2(), and pipe() system calls and can be completed on any Linux, UNIX, or macOS system. I....
The Company assists clients by designing and implementing solutions that reduce the overall costs of its...
The Company assists clients by designing and implementing solutions that reduce the overall costs of its customers’ supply chains. The Company provides Just-In-Time (JIT) inventory management of spare parts used in its customers’ manufacturing processes to reduce cycle times and lower inventory-related costs. The Company entered into a supply management contract (the “Agreement”) with the Customer, an unrelated third party, to provide spare parts , management services,(including sourcing, procurement, repair, transport and delivery), and warehouse management. ?The key terms of...
ADVERTISEMENT
ADVERTISEMENT
ADVERTISEMENT