Academic Integrity: tutoring, explanations, and feedback — we don’t complete graded work or submit on a student’s behalf.

Topics: User Defined Functions and MATLAB Conditionals A Childrens game studio n

ID: 3856738 • Letter: T

Question

Topics: User Defined Functions and MATLAB Conditionals

A Childrens game studio needs you to write a MATLAB Program to allow two players to play the game Tic-Tac-Toe on a computer:

This is a two player (X's and O's) board game.

The game board is a 3 X 3 grid, where each location can hold either an 'X' an 'O' or a space (empty)

Note: we will linearize the grid and refer to the its locations as 1 - 9, for conveyance.

The players take turns placing their mark into one of the (empty) locations in the grid.

The game is won when a player has their mark in all three locations of any row, column, or diagonal.

The game can also reach a stalemate: neither player has won (by above criteria) however all there are no more empty locations in the grid.

Outline:

Create a MATLAB Script .m file

Establish variable(s) to represent the nine board locations

Create the game loop

i.Display the current state of the board – using separate displayBoard function

ii.Get a “valid” move location – note this can only be an empty location [1, 9]

iii.Modify the board variable(s)

iv.Check for a win and report it if so – game must end

v.Check for a stalemate – game must end

Create a MATLAB Function .m file

Establish its name (displayBoard), input(s) , and output (there really is not any)

Write the necessary MATLAB commands to display the Tic-Tac-Toe board, using the given input(s)

Make sure to test your script and function when they are done¸

Notes(s):

Keep track of the total number of moves, for an easy stalemate detection.

Your location choice user-validation loop must also not accept any location that is not currently empty.

At times things will feel very tedious - doing the "same" thing nine times ...

Sample Run(s):

Welcome to Tic-Tac-Toe : X goes first

-------------------------------------

    |     |   

---------------

    |     |   

---------------

    |     |   

Please enter location to move [1 - 9] : 10

Please enter location to move [1 - 9] : -1

Please enter location to move [1 - 9] : 1

X |     |   

---------------

    |     |   

---------------

    |     |   

Please enter location to move [1 - 9] : 1

Please enter location to move [1 - 9] : 2

X | O |   

---------------

    |     |   

---------------

    |     |   

Please enter location to move [1 - 9] : 3

X | O | X

---------------

    |     |   

---------------

    |     |   

Please enter location to move [1 - 9] : 4

X | O | X

---------------

O |     |   

---------------

    |     |   

Please enter location to move [1 - 9] : 5

X | O | X

---------------

O | X |   

---------------

    |     |   

Please enter location to move [1 - 9] : 6

X | O | X

---------------

O | X | O

---------------

    |     |   

Please enter location to move [1 - 9] : 7

X | O | X

---------------

O | X | O

---------------

X |     |   

Congrats - X Wins!

Explanation / Answer


state = [[-1 -1 -1]
         [-1 -1 -1]
         [-1 -1 -1]];
       

function displayBoard(state)
  
    for i = (1:3)
        for j = (1:3)
            if state(i,j) == -1
                fprintf('%c | ', ' ');
            elseif state(i,j) == 1  
                fprintf('%c | ', 'X');  
            else
                fprintf('%c | ', 'o');
            end  
        end
        disp(" -----------");
    end
end  
  

function valid = isValidMove(state, row, col)
    valid = false;
    if state(row,col) == -1
        valid = true;
    end
end


function won = won(state)
  
    % Horizontal Checks
    if (state(1,1) == state(1,2) && state(1,1) == state(1,3) && state(1,1) ~= -1)
        won = state(1,1);
    elseif (state(2,1) == state(2,2) && state(2,1) == state(2,3) && state(2,1) ~= -1)
        won = state(2,1);
    elseif (state(3,1) == state(3,2) && state(3,1) == state(3,3) && state(3,1) ~= -1)
        won = state(3,1);
    % Vertical Checks
    elseif (state(1,1) == state(2,1) && state(1,1) == state(3,1) && state(3,1) ~= -1)
        won = state(1,1);
    elseif (state(1,2) == state(2,2) && state(1,2) == state(3,2) && state(1,2) ~= -1)
        won = state(1,2);
    elseif (state(1,3) == state(2,3) && state(1,3) == state(3,3) && state(1,3) ~= -1)
        won = state(1,3);
    % Diagonal Check
    elseif (state(1,1) == state(2,2) && state(1,1) == state(3,3) && state(1,1) ~= -1)
        won = state(1,1);
    elseif (state(1,3) == state(2,2) && state(1,3) == state(3,1) && state(2,2) ~= -1)
        won = state(1,3);
    % If no more slots are open, it's a tie
    elseif ~ismember(state, -1)
        won = 0;
    else
        won = -1;
    end
end

player = 1;  
while (true)
  
    % take Input
    prompt = 'Please enter location to move [1 - 9] : ';
    pos = input(prompt);
  
    % Check if the input is within the range
    if (pos>9 && pos <1)
        disp("Incorrect option. Please re-enter");
        continue;
    end
  
    % Get the 2D, row and column
    row = fix((pos-1)/3)+1;
    col = mod(pos,3);
    if (col == 0)
        col = 3;
    end

    % 1. Check if the move is valid  
    % 2. Make the move
    % 3. Check if the game has ended
    if (isValidMove(state, row, col)==false)
        disp("Incorrect move. Please re-enter");
        continue;
    end
  
    state(row, col) = player;
  
    winner = won(state)
    if (winner == 1 || winner == 2)
        fprintf("Player %d has won! ", winner);
        displayBoard(state);
        break;
    end
    if (winner == 0)
        fprintf("The game has been a tie ");
        displayBoard(state);
        break;
    end
  
  
    % Flip Player  
    if (player == 1)
        player = 2;
    else
        player = 1;
    end  
  
  
    % Display current state of the Board
    displayBoard(state);
end