function jaygolife() n=10; m=10; global Go ijcell ijlive ijdead man move Pointer Hfigure Himage Htitle if gcbo & n == inf if isequal(get(Hfigure,'SelectionType'),'normal') move = get(gca,'CurrentPoint'); move = round([move(1,2) move(1,1)]); uiresume end if isequal(get(Hfigure,'SelectionType'),'alt') move = [1 1]; man = ~man; if ~man uiresume end end if isequal(get(Hfigure,'SelectionType'),'extend') if isequal(get(Hfigure,'Renderer'),'zbuffer') set(Hfigure,'Renderer','painters') elseif isequal(get(Hfigure,'Renderer'),'painters') set(Hfigure,'Renderer','zbuffer') end end if isequal(get(Hfigure,'SelectionType'),'open') n = length(Go)-2; Go = zeros(n+2,n+2); Go(1,:) = inf; Go(n+2,:) = inf; Go(:,1) = inf; Go(:,n+2) = inf; set(Himage,'CData',Go+1) drawnow end return end if nargin == 1 man = 0; else man = m; end rand('state',sum(100*clock)) n = fix(n); Go = zeros(n+2,n+2); Go(1,:) = inf; Go(n+2,:) = inf; Go(:,1) = inf; Go(:,n+2) = inf; Hfigure = figure('Name','The Game of Go','NumberTitle','off','MenuBar','figure',... 'Pointer','custom','PointerShapeHotSpot',[8 8],... 'Renderer','zbuffer'); colormap([0.9 0.75 0.55; 0 0 0; 1 1 1; 0.5 0.5 0.5]) SetPointer Himage = image(Go+1,'ButtonDownFcn','jaygolife(inf)'); set(gca,'XColor',[0.5 0.5 0.5],'YColor',[0.5 0.5 0.5],... 'XTickLabel','','YTickLabel','',... 'XTick',1:n+2,'YTick',1:n+2,... 'GridLine','-') Htitle = title(''); axis image grid on drawnow xlabel(['left-click: make a move (in manual mode) '... 'right-click: toggle mode' char(10)... 'shift-left-click: toggle gridline '... 'double-click: restart'],... 'Color',[.5 .5 .5]) life = 1; while 1 kill = 0; life1 = 0; life2 = 0; for k = 1:(n+2)*(n+2) if Go(k) == 1 life1 = life1 + 1; end if Go(k) == 2 life2 = life2 + 1; end end if man set(Hfigure,'Name',['GoLife(' num2str(n) ') - manual']) else set(Hfigure,'Name',['GoLife(' num2str(n) ') - auto']) end set(Htitle,'String',['Black: ' num2str(life1) ' White: ' num2str(life2)]) set(gcf,'PointerShapeCData',Pointer(:,:,3-life)) if man uiwait end l = 0; for k = 1:(n+2)*(n+2) if ~Go(k) l = l + 1; end end k = 0; l = ceil(rand*l); while l k = k + 1; if ~Go(k) l = l - 1; end end if man l = (move(2)-1)*(n+2) + move(1); if Go(l) ~= inf k = l; end end if ~Go(k) life = 3-life; Go(k) = life; end set(Himage,'CData',Go+1) drawnow ijlive = []; ijdead = []; i = rem(k,n+2); j = ceil(k/(n+2)); ijcell = []; CheckLife(i,j); ijdead = [ijdead; ijcell]; ijcell = []; if i-1 < n CheckLife(i+1,j); ijdead = [ijdead; ijcell]; end ijcell = []; if i-1 > 1 CheckLife(i-1,j); ijdead = [ijdead; ijcell]; end ijcell = []; if j-1 < n CheckLife(i,j+1); ijdead = [ijdead; ijcell]; end ijcell = []; if j-1 > 1 CheckLife(i,j-1); ijdead = [ijdead; ijcell]; end l = 0; if ijdead l = length(ijdead(:,1)); end for k = 1:l if Go(ijdead(k,1),ijdead(k,2)) == 3-life kill = 1; Go(ijdead(k,1),ijdead(k,2)) = 0; end end for k = 1:l if Go(ijdead(k,1),ijdead(k,2)) == life & ~kill kill = 0; Go(ijdead(k,1),ijdead(k,2)) = 0; end end set(Himage,'CData',Go+1) drawnow end function CheckLife(i,j) global Go ijcell ijlive ijdead if ijdead & ~all(ijdead(:,1)-i | ijdead(:,2)-j) | ... ~all([Go(i,j) Go(i+1,j) Go(i-1,j) Go(i,j+1) Go(i,j-1)]) | ... 0; ijlive = [ijlive; ijcell]; ijcell = []; return end if ijlive & ~all(ijlive(:,1)-i | ijlive(:,2)-j) | ... ijlive & ~all(ijlive(:,1)-(i+1) | ijlive(:,2)-j) & Go(i+1,j) == Go(i,j) | ... ijlive & ~all(ijlive(:,1)-(i-1) | ijlive(:,2)-j) & Go(i-1,j) == Go(i,j) | ... ijlive & ~all(ijlive(:,1)-i | ijlive(:,2)-(j+1)) & Go(i,j+1) == Go(i,j) | ... ijlive & ~all(ijlive(:,1)-i | ijlive(:,2)-(j-1)) & Go(i,j-1) == Go(i,j) | ... 0; ijlive = [ijlive; ijcell]; ijcell = []; return end ijcell = [ijcell; i j]; if ijcell & all(ijcell(:,1)-(i+1) | ijcell(:,2)-j) & Go(i+1,j) == Go(i,j) CheckLife(i+1,j); end if ijcell & all(ijcell(:,1)-(i-1) | ijcell(:,2)-j) & Go(i-1,j) == Go(i,j) CheckLife(i-1,j); end if ijcell & all(ijcell(:,1)-i | ijcell(:,2)-(j+1)) & Go(i,j+1) == Go(i,j) CheckLife(i,j+1); end if ijcell & all(ijcell(:,1)-i | ijcell(:,2)-(j-1)) & Go(i,j-1) == Go(i,j) CheckLife(i,j-1); end function SetPointer() global Pointer Pointer(:,:,1) = [ NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 1 1 1 1 1 1 1 1 1 1 1 NaN NaN NaN NaN NaN 1 2 2 2 2 1 2 2 2 2 1 NaN NaN NaN NaN NaN 1 2 NaN 2 2 1 2 2 NaN 2 1 NaN NaN NaN NaN NaN 1 2 2 NaN NaN 1 NaN NaN 2 2 1 NaN NaN NaN NaN NaN 1 2 2 NaN NaN 1 NaN NaN 2 2 1 NaN NaN NaN NaN NaN 1 1 1 1 1 1 1 1 1 1 1 NaN NaN NaN NaN NaN 1 2 2 NaN NaN 1 NaN NaN 2 2 1 NaN NaN NaN NaN NaN 1 2 2 NaN NaN 1 NaN NaN 2 2 1 NaN NaN NaN NaN NaN 1 2 NaN 2 2 1 2 2 NaN 2 1 NaN NaN NaN NaN NaN 1 2 2 2 2 1 2 2 2 2 1 NaN NaN NaN NaN NaN 1 1 1 1 1 1 1 1 1 1 1 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ]; Pointer(:,:,2) = [ NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 1 1 1 1 1 1 1 1 1 1 1 NaN NaN NaN NaN NaN 1 1 2 2 2 2 2 2 2 1 1 NaN NaN NaN NaN NaN 1 2 1 2 2 NaN 2 2 1 2 1 NaN NaN NaN NaN NaN 1 2 2 1 NaN NaN NaN 1 2 2 1 NaN NaN NaN NaN NaN 1 2 2 NaN 1 NaN 1 NaN 2 2 1 NaN NaN NaN NaN NaN 1 2 NaN NaN NaN 1 NaN NaN NaN 2 1 NaN NaN NaN NaN NaN 1 2 2 NaN 1 NaN 1 NaN 2 2 1 NaN NaN NaN NaN NaN 1 2 2 1 NaN NaN NaN 1 2 2 1 NaN NaN NaN NaN NaN 1 2 1 2 2 NaN 2 2 1 2 1 NaN NaN NaN NaN NaN 1 1 2 2 2 2 2 2 2 1 1 NaN NaN NaN NaN NaN 1 1 1 1 1 1 1 1 1 1 1 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ];