Topics: User Defined Functions and MATLAB Conditionals A Childrens game studio n
ID: 3857382 • 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!
____________________________________________Here's what my assignment says, and Below is what I did so far...
fprintf('Welcome to Tic-Tac-Toe : X goes first ');
fprintf('------------------------------------- ');
loc1 = ' ';
loc2 = ' ';
loc3 = ' ';
loc4 = ' ';
loc5 = ' ';
loc6 = ' ';
loc7 = ' ';
loc8 = ' ';
loc9 = ' ';
for i = 1:5
displayBoard(loc1,loc2,loc3,loc4,loc5,loc6,loc7,loc8,loc9);
player1 = input('Please enter location to move [1 - 9] : ');
fprintf(' ');
while (player1<1 || player1>9)
player1 = input('Please enter location to move [1 - 9] : ');
fprintf(' ');
end
if player1 == 1
loc1 = 'X';
elseif player1 == 2
loc2 = 'X';
elseif player1 == 3
loc3 = 'X';
elseif player1 == 4
loc4 = 'X';
elseif player1 == 5
loc5 = 'X';
elseif player1 ==6
loc6 = 'X';
elseif player1 == 7
loc7 = 'X';
elseif player1 == 8
loc8 = 'X';
elseif player1 == 9
loc9 = 'X';
end
displayBoard(loc1,loc2,loc3,loc4,loc5,loc6,loc7,loc8,loc9);
player2 = input('Please enter location to move [1 - 9] : ');
fprintf(' ');
while (player2<1 || player2>9) && (player2~=player1)
player2 = input('Please enter location to move [1 - 9] : ');
fprintf(' ');
end
if player2 == 1
loc1 = 'O';
elseif player2 == 2
loc2 = 'O';
elseif player2 == 3
loc3 = 'O';
elseif player2 == 4
loc4 = 'O';
elseif player2 == 5
loc5 = 'O';
elseif player2 ==6
loc6 = 'O';
elseif player2 == 7
loc7 = 'O';
elseif player2 == 8
loc8 = 'O';
elseif player2 == 9
loc9 = 'O';
end
if (loc1==loc4==loc7)
fprintf('Congrats - %s Wins',loc1);
elseif(loc2==loc5==loc8)
fprintf('Congrats - %s Wins',loc2);
elseif(loc3==loc6==loc9)
fprintf('Congrats - %s Wins',loc3);
elseif(loc1==loc5==loc9)
fprintf('Congrats - %s Wins',loc1);
elseif(loc3==loc5==loc7)
fprintf('Congrats - %s Wins',loc3);
elseif(loc1==loc2==loc3)
fprintf('Congrats - %s Wins',loc1);
elseif(loc4==loc5==loc6)
fprintf('Congrats - %s Wins',loc4);
elseif(loc7==loc8==loc9)
fprintf('Congrats - %s Wins',loc7);
break;
end
end
if ~((loc1==loc4==loc7) || (loc2==loc5==loc8) || (loc3==loc6==loc9) || (loc1==loc5==loc9) || (loc3==loc5==loc7))
fprintf('Sorry, it''s stalemate');
end
function [] = displayBoard(loc1,loc2,loc3,loc4,loc5,loc6,loc7,loc8,loc9)
fprintf(' %s | %s | %s ', loc1, loc2, loc3);
fprintf('----------- ');
fprintf(' %s | %s | %s ', loc4, loc5, loc6);
fprintf('----------- ');
fprintf(' %s | %s | %s ', loc7, loc8, loc9);
end
Explanation / Answer
function [] = tictactoe() % Setup the figure/windows for the game close all figure('Name','Tic Tac Toe'); plot(-1. -1) axis([0 3 0 3]) set(gca,'xTick',0:3) set(gca,'yTick',0:3) set(gca,'xTickLabel','') set(gca,'yTickLabel','') xlabel('Player: X') grid on shg is_x = 1; % keeps track of the current player state = [[-1 -1 -1] [-1 -1 -1] [-1 -1 -1]]; % the state of the game (-1 none, 0 = O, 1 = X) winner = -1; % is there a winner? is it a tie? % The main game loop. Continue until the game ends with winner ~= -1 while winner == -1 next = play(is_x, state); % play a single round if next == -1 % if the player clicks on a filled in slot, ask them to try again title('Invalid move, please try again'); else state = next; % advance the current state title(''); is_x = mod(is_x + 1,2); % pick the next player and update the player label if is_x == 1 xlabel('Player: X'); else xlabel('Player: O'); end winner = won(state); % check to see if the game is in a winning state end end if winner == 0 % O won warndlg('O wins'); title('O wins'); xlabel(''); elseif winner == 1 % X won warndlg('X wins'); title('X wins'); xlabel(''); else % else it's a tie warndlg('Tie'); title('Tie'); xlabel(''); end end % The state function takes in the current player and the previous state the % game is in and simulates a single round. function state = play(is_x, state) [x y] = ginput(1); % get the mouse position with respect to the plot [col row] = position(x, y); % get the corresponding row/col (note row starts off with 0 at the bottom) row = 2 - row; % the actual row within the state matrix if state(col+1, row+1) ~= -1 % if the player tries to click on a filled spot state = -1; % invalid, ask the player to try again else state(col+1, row+1) = is_x; % set the state and draw the X and the O if is_x drawX(col, 2 - row); else drawO(col, 2 - row); end end end % The won function calculates if the current game state is in a winning % state. function won = won(state) % Horizontal 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 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 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 = 2; else won = -1; end end % Returns the rounded off position of the mouse function [col row] = position(x, y) col = floor(x); row = floor(y); if col > 2 % if we're right on the 3 line, we count it as 2 col = 2; end if row > 2 row = 2; end end function drawX(col, row) hold on x = 0:1; pos = 0:1; neg = 1-x; plot(x+col, pos+row) plot(x+col, neg+row) hold off end function drawO(col, row) hold on t = 0:0.1:2*pi; x = cos(t)/2+0.5; y = sin(t)/2+0.5; plot(x+col, y+row) hold off end
Related Questions
drjack9650@gmail.com
Navigate
Integrity-first tutoring: explanations and feedback only — we do not complete graded work. Learn more.