Code not working. I need to move the image blocks by swapping cell's position inside the main image matrix. Help?

2 views (last 30 days)
clc;clear;close all;warning off;
imdata = imread('check.jpg');
new_dims = size(imdata) - rem(size(imdata), 3);
imdata = imdata(1:new_dims(1),1:new_dims(2), :);
figure(1)
image(imdata)
text(100,300,'You Have40 Secs To Solve it !','FontSize',14,'Color','y');
text(150,350,'Use Arrow Keys : ','FontSize',14,'Color','y');
text(295,400,'\uparrow','FontSize',20,'Color','y','FontWeight','Bold');
text(225,450,'\leftarrow \downarrow \rightarrow','FontSize',20,'Color','y','FontWeight','Bold');
pause(3)
%%Arrange into 3x3 cell
block_dims = new_dims./[3 3 1];
blocks = mat2cell(imdata, block_dims(1)*ones(3,1), block_dims(2)*ones(3,1), block_dims(3));
%blacking the 9th image first
blocks(9) = {zeros(block_dims, class(imdata))};
%%Rearrange randomly
blocks(1:9) = blocks(randperm(9));
%%Set one block to zero
%
%blocks(3) = {zeros(block_dims, class(imdata))};
%%Return to image
puzzle = cell2mat(blocks);
disp(blocks)
%%Plot input and output
figure(2)
subplot(2,1,1), image(puzzle), axis equal;
%subplot(2,1,2),implay(timer_examp()), axis equal;
%truesize
k=index(cell{blocks(9)})% i am just trying to index a cell
pause(3)
%* bold*timer_examp()
%play
tic
move = 0;k = ind(blocks(9))
while ~isequal(puzzle,[1:3;4:6;7:9])
move= move+1;
m=waitforbuttonpress;
key = get(gcf,'CurrentKey');
% only works for keyboardinput if m==0
; %if it doesn't works then try find (blocks==9)
if strcmp(key,'uparrow')
blocks{k}=blocks{k-1};
elseif strcmp(key,'leftarrow')&& (k>3)
blocks(k) =blocks(k-3);
elseif strcmp(key,'rightarrow')&&(k<3)
blocks(k)= blocks(k+3);
elseif strcmp(key,'downarrow')
blocks(k) = blocks(k+3);
else
blocks(k)
end
end
  2 Comments
Zurez
Zurez on 19 Apr 2013
Edited: Zurez on 19 Apr 2013
I hope that by now , you have understood that half of the code generates a scrambled image/ now I want the user to solve the image puzzle. Now whenever a user should press an arrow key/ let say suppose the uparrow , the black block of the image puzzle should move up. That can only happen if i swap the black cell with the picture block cell above it... I am just not able to do that. Also I want a timer to run , just below the image frame. timer_examp is the timer function.

Sign in to comment.

Answers (1)

Walter Roberson
Walter Roberson on 19 Apr 2013
other_k = k - 1;
blocks([k other_k]) = blocks([other_k k]);
  4 Comments
Zurez
Zurez on 19 Apr 2013
clc;clear;close all;warning off; imdata = imread('check.jpg'); new_dims = size(imdata) - rem(size(imdata), 3); imdata = imdata(1:new_dims(1),1:new_dims(2), :);
%% Arrange into 3x3 cell block_dims = new_dims./[3 3 1]; blocks = mat2cell(imdata, block_dims(1)*ones(3,1), block_dims(2)*ones(3,1), block_dims(3)); %blacking the 9th image first blocks(9) = {zeros(block_dims, class(imdata))}; % this has become iirelevnet now :p a=blocks;
%% Rearrange randomly blocks(1:9) = blocks(randperm(9)); %% Set one block to zero % %blocks(3) = {zeros(block_dims, class(imdata))}; %% Return to image puzzle = cell2mat(blocks); disp(blocks) %% Plot input and output figure(2) image(puzzle);
k=9% i am just trying give a value to 9
move = 0; while ~isequal(puzzle,[1:3;4:6;7:9]) move= move+1; m=waitforbuttonpress; key = get(gcf,'CurrentKey');
if strcmp(key,'uparrow')
other_k = k - 1;
blocks([k other_k]) = blocks([other_k k]);
puzzle = cell2mat(blocks);
image(puzzle);
%blocks(k)=blocks(k-1);
elseif strcmp(key,'leftarrow')
other_k = k - 3;
blocks([k other_k]) = blocks([other_k k]);
puzzle = cell2mat(blocks);
image(puzzle);
disp(key)
elseif strcmp(key,'rightarrow')
other_k = k +3;
blocks([k other_k]) = blocks([other_k k]);
puzzle = cell2mat(blocks);
image(puzzle);
disp(key)
% blocks(k)= blocks(k+3);
elseif strcmp(key,'downarrow')
other_k = k + 1;
blocks([k other_k]) = blocks([other_k k]);
puzzle = cell2mat(blocks);
image(puzzle);disp(key)
else
blocks(k)
puzzle = cell2mat(blocks);
image(puzzle);
end
end
Zurez
Zurez on 19 Apr 2013
The above is my updated code. I have remove or commented out what I don't need. The value of the blackened block should change every time. And therefore the value of k should also change. How should I do that?

Sign in to comment.

Categories

Find more on External Language Interfaces in Help Center and File Exchange

Products

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!