E. Final Program with Comments

% Made by Group L
clear
clc

my_scene = simpleGameEngine(‘retro_cards.png’,16,16,32,[0,100,0]); %import engine and cards
empty_sprite = 1; % empty background
blank_card_sprite = 2; % card backgroun
card_sprites = 1:72; % Card foregrounds
valid = 1; % Boolean value for if action is valid

for i = 1:52 % assigns card values
cardDex = 20 + i;
if mod(i,13) > 1 && mod(i,13)< 11
cardVal(cardDex) = mod(i,13); % Card Value Assignment Value
elseif mod(i,13) == 0 || mod(i,13) > 10
cardVal(cardDex) = 10;
else
cardVal(cardDex) = 11;
end
end

players = input(“Input number of players (Max 5): “) % input number of players
seated = players + 1; % adds dealer to total

fprintf(“Players, make your bets.\n”) % player bets made

for i = 1:players
fprintf(“Player %i please type your bet: $”, i) % players choose bets
playerBet(i) = input(“”);
fprintf(“\n”)
end

cards(1:seated) = 2; % initial card number set
position(1:seated) = 3; % initial card position set

% Setup player card point and aces array
playerVal(1:players) = 0; % Player holding values
playerAces(1:players) = 0; % Player Aces
playerBusted(1:players) = 0; % Boolean for busted
playerWon(1:players) = 0; % Boolean for won
playerNatural(1:players) = 0; % Boolean for natural blackjack
chosenAce(1:players) = 1; % Default value of ace

% Declare foreground and background
card_display = ones(seated, 8);
card_display(:,2:3) = blank_card_sprite; % Add card background
ShuffledDeck = ones(seated, 8);
for i = 1:players % fill array
ShuffledDeck(i, 1) = i + 11;
end

for i = 1:players
for j=2:3
ShuffledDeck(i ,j) = 20 + randi(52); % Random permeation of cards
end
end

% Dealer specific
ShuffledDeck(seated, 1) = 11; % special symbol
ShuffledDeck(seated, 2) = 20 + randi(52); % declares first card
ShuffledDeck(seated, 3) = 10; % declares second card as mystery (not rolled until flipped over)
dealerBust = 0; % boolean for if dealer busts
dealerAces = 0; % number of aces dealer is holding

for m = 1:seated % this monster is meant to discover if there are duplicates
for k = 2:3
for i = 1:seated
for j=2:3
if ShuffledDeck(m, k) == ShuffledDeck(i, j) %% find duplicates
if m == i && k == j
else
valid = 0;
while valid == 0
ShuffledDeck(m, k) = 20 + randi(52); %% reshuffle duplicates
valid = 1;
for p = 1:seated
for e = 2:3
if ShuffledDeck(m, k) == ShuffledDeck(p, e) && m ~= p && k ~= e %% check duplicates once more
valid = 0;
break
end
end
if ShuffledDeck(m, k) == ShuffledDeck(p, e) && m ~= p && k ~= e % check duplicates once more
break
end
end
end
end
end
end
end
end
end

% The second layer includes the faces of the cards
face_display = card_sprites(ShuffledDeck);

drawScene(my_scene,card_display,face_display) % draw up the scene in particular

dealerVal = cardVal(ShuffledDeck(seated, 2));

% player turns
fprintf(“BEGIN GAME.\n”)

% player loop
for i = 1:players
fprintf(“\nPlayer %i it is your turn.\n”, i)
for m = 1:position(i)
playerVal(i) = playerVal(i) + cardVal(ShuffledDeck(i, m));
end
fprintf(“Your current total is “) % output card total
if cardVal(ShuffledDeck(i, 2)) == 11 || cardVal(ShuffledDeck(i, 3)) == 11
if cardVal(ShuffledDeck(i, 2)) == 11 && cardVal(ShuffledDeck(i, 3)) == 11
fprintf (“%i or %i”, playerVal(i) – 10, playerVal(i) – 20)
playerAces(i) = 2;
else
fprintf (“%i or %i”, playerVal(i), playerVal(i) – 10)
playerAces(i) = 1;
end
else
fprintf(“%i”, playerVal(i))
end
fprintf(“.\n”)

if playerVal(i)== 21
playerNatural(i) = 1;
fprintf(“Blackjack. Your turn ends immediately and you win $%i.\n”, playerBet(i)* 1.5) %auto blackjack

continue
end

fprintf(“You have bet $%i\n”, playerBet(i))
holding = 0;
while holding == 0
playerDec = input(“What would you like to do?\nPress 1 to hit\nPress 2 to stand\n”); % Player makes decision
switch playerDec
case 1
newCard = 20 + randi(52);
cards(i) = cards(i) + 1;
position(i) = cards(i) + 1;
for x = 1:seated
for j=2:position(i)
if newCard == ShuffledDeck(x, j) %% find duplicates
if x == i && j == position(i)
else
valid = 0;
while valid == 0
newCard = 20 + randi(52); %% reshuffle duplicates
valid = 1;
for p = 1:seated
for e = 2:position(i)
if newCard == ShuffledDeck(p, e) && p ~= i && j ~= position(i) %% check duplicates once more
valid = 0;
break
end
end
if newCard == ShuffledDeck(p, e) && p ~= i && j ~= position(i) % check duplicates once more
break
end
end
end
end
end
end
end
card_display(i, position(i)) = blank_card_sprite; % update display
ShuffledDeck(i, position(i)) = newCard;
if cardVal(newCard) == 11
playerAces(i) = playerAces(i) + 1;
end
playerVal(i) = playerVal(i) + cardVal(newCard); % Add new card
face_display = card_sprites(ShuffledDeck);
drawScene(my_scene,card_display,face_display)
fprintf(“Your current total is “)
if playerAces(i) > 0
fprintf(“%i or %i”, playerVal(i) – (playerAces(i) – 1) * 10, playerVal(i) – playerAces(i) * 10)
else
fprintf(“%i”, playerVal(i))
end
fprintf(“.\n”)
if playerVal(i) – playerAces(i) * 10 > 21
fprintf(“You have busted and lost your bet.\n”) % Bust mechanic
playerBusted(i) = 1;
break
end

case 2 % Hold mechanic
holding = 1;
if playerAces(i) > 0 % check if holding ace
fprintf(“Use an ace as 1 or 11? (Other aces held will be set to 1): “) % ask player to choose value
chosenAce(i) = input(“”);
fprintf(“\nAce will be used as “)
if chosenAce(1) == 11
fprintf(“an 11”)
else
fprintf(“a 1”)
playerVal(i) = playerVal(i) – 10;
end
fprintf(“.\n”)
end
end

end
end

%% Dealer Turn

fprintf(“Dealer Turn.\n\n”)

% Dealer flips card, acknowledges value, stores value to dealerVal
i = seated;
newCard = 20 + randi(52);

for x = 1:seated
for j=2:position(i)
if newCard == ShuffledDeck(x, j) %% find duplicates
if x == i && j == position(i)
else
valid = 0;
while valid == 0
newCard = 20 + randi(52); %% reshuffle duplicates
valid = 1;
for p = 1:seated
for e = 2:position(i)
if newCard == ShuffledDeck(p, e) && p ~= i && j ~= position(i) %% check duplicates once more
valid = 0;
break
end
end
if newCard == ShuffledDeck(p, e) && p ~= i && j ~= position(i) % check duplicates once more
break
end
end
end
end
end
end
end

dealerVal = dealerVal + cardVal(newCard); % Add value of newcard to dealer value

% Update display
ShuffledDeck(seated, 3) = newCard;
face_display = card_sprites(ShuffledDeck);
drawScene(my_scene,card_display,face_display)
fprintf(“Dealer turns up %i.\n”, dealerVal)

if cardVal(ShuffledDeck(seated, 2)) == 11 || cardVal(ShuffledDeck(seated, 3)) == 11
if cardVal(ShuffledDeck(seated, 2)) == 11 && cardVal(ShuffledDeck(seated, 3)) == 11
dealerAces = 2;
else
dealerAces = 1;
end
end

if dealerVal > 16 – dealerAces * 10 % check if dealer should stand
fprintf(“Dealer stands on %i.\n”, dealerVal)
else
while dealerVal < 17 – dealerAces * 10 %dealer hits until they are 17 or over
fprintf(“Dealer hits.\n”)
cards(i) = cards(i) + 1;
position(i) = cards(i) + 1;
newCard = 20 + randi(52);
for x = 1:seated
for j=2:position(i)
if newCard == ShuffledDeck(x, j) %% find duplicates
if x == i && j == position(i)
else
valid = 0;
while valid == 0
newCard = 20 + randi(52); %% reshuffle duplicates
valid = 1;
for p = 1:seated
for e = 2:position(i)
if newCard == ShuffledDeck(p, e) && p ~= i && j ~= position(i) %% check duplicates once more
valid = 0;
break
end
end
if newCard == ShuffledDeck(p, e) && p ~= i && j ~= position(i) % check duplicates once more
break
end
end
end
end
end
end
end
% update display again
card_display(seated, position(i)) = blank_card_sprite;
ShuffledDeck(seated, position(i)) = newCard;
face_display = card_sprites(ShuffledDeck);
drawScene(my_scene,card_display,face_display)
if cardVal(newCard) == 11 % add ace if applicable
dealerAces = dealerAces + 1;
end

dealerVal = dealerVal + cardVal(newCard);

if dealerVal – dealerAces * 10 > 21 % check if dealer busts
fprintf(“Dealer busts on %i.\n”, dealerVal)
dealerBust = 1;
break
end
end
if dealerBust == 0 % value trimming
while dealerVal > 21 && dealerAces > 0 % trim value based on aces
dealerVal = dealerVal – 10
dealerAces = dealerAces – 1
end
fprintf(“Dealer stands on %i.\n”, dealerVal)
end
end

for i = 1:players
if playerBusted(i) == 1 || dealerBust == 0 && dealerVal > playerVal(i) % check if player lost
fprintf(“Player %i loses their bet.\n”, i)
elseif playerVal(i) == dealerVal % check if player tied
fprintf(“Player %i tied with dealer and recieve back their bet of $%i.\n”, i, playerBet(i))
elseif playerNatural(i) == 1 % check if player blackjack
fprintf(“Player %i got a blackjack and won %i!\n”, 1.5 * playerBet(i))
else % or player won
fprintf(“Player %i wins $%i!\n”, i, 2 * playerBet(i))
end
end

fprintf(“\nGAME ENDS.”) % game ends