% Function: matlab_spider_solitare_move_card
% Created by Madison Welch Jan, 27, 2007
%
% Function: runs when a move is attemped.
% 1. checks to see if the move is a valid one
% 2. moves the card if appropriate
% 3. removes a set of cards if a complete King - Ace of suit is created
%
% Called when a card is attempted to be moved.
%
% Subfunction:
% make_sure_next_card_is_face_up - the name says it all. If necessary,
% uncovers the last card in the column
%
% passed in variables:
% orig_col - the column of the card (or set of cards) that is being moved
% orig_row - the row of the highest card that is begin moved
% new_col - the new col where you want to place the card (or set of cards)
%
function matlab_spider_solitare_move_card (orig_col,orig_row)
global game_board num_complete_sets
h = get(gco,'UserData');
% check to see if the card is a valid one to move
if game_board(orig_col).face_up(orig_row)
valid_move = true;
i = orig_row;
while (i < length(game_board(orig_col).number)) & valid_move
valid_move = (game_board(orig_col).number(i)-1 == game_board(orig_col).number(i+1)) && ...
(strcmp(char(game_board(orig_col).suit(i+1)),char(game_board(orig_col).suit(orig_row))));
i = i+1;
end
else
valid_move = false;
end
if valid_move
cur_point = ginput(1); % if the card can be moved, find out where it should be moved
new_col = ceil(0.0001+cur_point(1));
% check to see if the new column has a card exposed that is one higher
% than the one being moved
if isempty(game_board(new_col).number) | (new_col ~= orig_col && (game_board(new_col).number(end) - 1) == game_board(orig_col).number(orig_row))
for i = orig_row:length(game_board(orig_col).number)
number = game_board(orig_col).number(i);
suit = char(game_board(orig_col).suit(i));
new_h = cardplot(ceil(cur_point(1))-0.85,4-(length(game_board(new_col).number)+1)*0.2,1,number,suit);
game_board(new_col).number(end+1) = number;
game_board(new_col).suit(end+1) = {suit};
game_board(new_col).face_up(end+1) = true;
game_board(new_col).handles(end+1) = {new_h};
set(new_h,'UserData',new_h);
set(new_h,'ButtonDownFcn',['matlab_spider_solitare_move_card(',num2str(new_col),',',num2str(length(game_board(new_col).number)),')']);
h = game_board(orig_col).handles(i);
delete(h{1});
end
game_board(orig_col).number = game_board(orig_col).number(1:orig_row-1);
game_board(orig_col).suit = game_board(orig_col).suit(1:orig_row-1);
game_board(orig_col).face_up = game_board(orig_col).face_up(1:orig_row-1);
game_board(orig_col).handles = game_board(orig_col).handles(1:orig_row-1);
end
game_board = make_sure_next_card_is_face_up(game_board, orig_col);
end
%% check to see if we have a complete set
if valid_move & ~isempty(game_board(new_col).number)
complete_set = true;
for j = 1:13
if complete_set
if ((length(game_board(new_col).number) -j+1) > 0)
complete_set = (game_board(new_col).number(end - j+1) == j) && ...
(strcmp(char(game_board(new_col).suit(end - j+1)),char(game_board(new_col).suit(end))));
else
complete_set = false;
end
end
end
% if we do have a complete set move those cards to the bottom left of
% the screen
if complete_set
disp('Congrats a complete set!');
pause(0.5)
for i = 1:13
h = game_board(new_col).handles(end - i+1);
delete(h{1});
end
cardplot(1-0.85+num_complete_sets*0.15,0,1,13,char(game_board(new_col).suit(end)));
game_board(new_col).number(end-13+1:end) = [];
game_board(new_col).suit(end-13+1:end) = [];
game_board(new_col).face_up(end-13+1:end) = [];
game_board(new_col).handles(end-13+1:end) = [];
num_complete_sets = num_complete_sets + 1;
game_board = make_sure_next_card_is_face_up (game_board,new_col);
end
end
%% Uncovers the top card in the column
function game_board = make_sure_next_card_is_face_up(game_board,col)
if ~isempty(game_board(col).face_up)
if ~game_board(col).face_up(end)
delete(cell2mat(game_board(col).handles(end)))
h = cardplot(col-0.85, 4-length(game_board(col).number)*0.2,1,game_board(col).number(end),char(game_board(col).suit(end)));
game_board(col).face_up(end) = true;
game_board(col).handles(end) = {h};
set(h,'UserData',h);
set(h,'ButtonDownFcn',['matlab_spider_solitare_move_card(',num2str(col),',',num2str(length(game_board(col).number)),')']);
end
end