Honeycombs: Difference between revisions
Content added Content deleted
No edit summary |
|||
Line 2,398: | Line 2,398: | ||
End Function |
End Function |
||
</lang> |
</lang> |
||
=={{header|Mathematica}} / {{header|Wolfram Language}}== |
|||
Two players, 5 by 4. |
|||
<lang Mathematica>hexagon[{x_, y_}] := |
|||
Polygon[Transpose[{{1/2, 1/4, -1/4, -1/2, -1/4, 1/4} + |
|||
x, {0, Sqrt[3]/4, Sqrt[3]/4, 0, -Sqrt[3]/4, -Sqrt[3]/4} + y}]]; |
|||
off = Transpose[{ConstantArray[0, 20], {0, 0, 0, 0, Sqrt[3]/4, |
|||
Sqrt[3]/4, Sqrt[3]/4, Sqrt[3]/4, 0, 0, 0, 0, Sqrt[3]/4, |
|||
Sqrt[3]/4, Sqrt[3]/4, Sqrt[3]/4, 0, 0, 0, 0}}]; |
|||
DynamicModule[{letters = RandomSample[CharacterRange["A", "Z"], 20], |
|||
blue = False, cols = {}, |
|||
locs = Tuples[{Range[1, 4, 3/4], |
|||
Range[1, 1 + (3 Sqrt[3])/2, Sqrt[3]/2]}] - off}, |
|||
EventHandler[ |
|||
Dynamic[Graphics[{EdgeForm[{Thick, Black}], LightGray, |
|||
hexagon /@ locs, {#[[1]], hexagon[#[[2]]]} & /@ cols, Black, |
|||
MapThread[ |
|||
Text, {Style[#, FontSize -> Large] & /@ letters, locs}], Red, |
|||
Text[Style[ |
|||
StringJoin[ |
|||
letters[[FirstPosition[locs, #[[2]]][[1]]]] & /@ |
|||
Cases[cols, {Red, _}][[All, 2]]], |
|||
FontSize -> 40], {5/2, -1/2}, {Right, Center}], Blue, |
|||
Text[Style[ |
|||
StringJoin[ |
|||
letters[[FirstPosition[locs, #[[2]]][[1]]]] & /@ |
|||
Cases[cols, {Blue, _}][[All, 2]]], |
|||
FontSize -> 40], {5/2, -1/2}, {Left, Center}]}, |
|||
PlotRange -> {{-1, 6}, Automatic}, |
|||
ImageSize -> Large]], {"MouseClicked" :> |
|||
If[! MemberQ[cols[[All, 2]], |
|||
Nearest[locs, MousePosition["Graphics"]][[1]]], |
|||
AppendTo[ |
|||
cols, {If[blue, Blue, Red], |
|||
Nearest[locs, MousePosition["Graphics"]][[1]]}]; |
|||
blue = ! blue]}]]</lang> |
|||
=={{header|MATLAB}}== |
|||
Simple version |
|||
*Click-play, no entering letters |
|||
*One-player |
|||
*Prints choices list to figure title, no output |
|||
*Easy to change number of rows or columns |
|||
*No support for different numbers of hexagons in different columns |
|||
*Works for up to 26 hexagons before using lowercase labels, 52 hexagons before repeating letters |
|||
*Works off of mouse-click events, so program doesn't need to "quit" as it is not really running constantly |
|||
<lang MATLAB>function Honeycombs |
|||
nRows = 4; % Number of rows |
|||
nCols = 5; % Number of columns |
|||
nHexs = nRows*nCols; % Number of hexagons |
|||
rOuter = 1; % Circumradius |
|||
startX = 0; % x-coordinate of upper left hexagon |
|||
startY = 0; % y-coordinate of upper left hexagon |
|||
delX = rOuter*1.5; % Horizontal distance between hexagons |
|||
delY = rOuter*sqrt(3); % Vertical distance between hexagons |
|||
offY = delY/2; % Vertical offset between columns |
|||
genHexX = rOuter.*cos(2.*pi.*(0:5).'./6); % x-coords of general hexagon |
|||
genHexY = rOuter.*sin(2.*pi.*(0:5).'./6); % y-coords of general hexagon |
|||
centX = zeros(1, nHexs); % x-coords of hexagon centers |
|||
centY = zeros(1, nHexs); % y-coords of hexagon centers |
|||
for c = 1:nCols |
|||
idxs = (c-1)*nRows+1:c*nRows; % Indeces of hexagons in that column |
|||
if mod(c, 2) % Odd numbered column - higher y-values |
|||
centY(idxs) = startY:-delY:startY-delY*(nRows-1); |
|||
else % Even numbered column - lower y-values |
|||
centY(idxs) = startY-offY:-delY:startY-offY-delY*(nRows-1); |
|||
end |
|||
centX(idxs) = (startX+(c-1)*delX).*ones(1, nRows); |
|||
end |
|||
[MCentX, MGenHexX] = meshgrid(centX, genHexX); |
|||
[MCentY, MGenHexY] = meshgrid(centY, genHexY); |
|||
HexX = MCentX+MGenHexX; % x-coords of hexagon vertices |
|||
HexY = MCentY+MGenHexY; % y-coords of hexagon vertices |
|||
figure |
|||
hold on |
|||
letters = char([65:90 97:122]); |
|||
randIdxs = randperm(26); |
|||
letters = [letters(randIdxs) letters(26+randIdxs)]; |
|||
hexH = zeros(1, nHexs); |
|||
for k = 1:nHexs % Create patches individually |
|||
hexH(k) = patch(HexX(:, k), HexY(:, k), [1 1 0]); |
|||
textH = text(centX(k), centY(k), letters(mod(k, length(letters))), ... |
|||
'HorizontalAlignment', 'center', 'FontSize', 14, ... |
|||
'FontWeight', 'bold', 'Color', [1 0 0], 'HitTest', 'off'); |
|||
set(hexH(k), 'UserData', textH) % Save to object for easy access |
|||
end |
|||
axis equal |
|||
axis off |
|||
set(gca, 'UserData', '') % List of clicked patch labels |
|||
set(hexH, 'ButtonDownFcn', @onClick) |
|||
end |
|||
function onClick(obj, event) |
|||
axesH = get(obj, 'Parent'); |
|||
textH = get(obj, 'UserData'); |
|||
set(obj, 'FaceColor', [1 0 1]) % Change color |
|||
set(textH, 'Color', [0 0 0]) % Change label color |
|||
set(obj, 'HitTest', 'off') % Ignore future clicks |
|||
currList = get(axesH, 'UserData'); % Hexs already clicked |
|||
newList = [currList get(textH, 'String')]; % Update list |
|||
set(axesH, 'UserData', newList) |
|||
title(newList) |
|||
end</lang> |
|||
=={{header|Nim}}== |
=={{header|Nim}}== |
||
Line 2,593: | Line 2,696: | ||
discard app.run()</lang> |
discard app.run()</lang> |
||
=={{header|Mathematica}} / {{header|Wolfram Language}}== |
|||
Two players, 5 by 4. |
|||
<lang Mathematica>hexagon[{x_, y_}] := |
|||
Polygon[Transpose[{{1/2, 1/4, -1/4, -1/2, -1/4, 1/4} + |
|||
x, {0, Sqrt[3]/4, Sqrt[3]/4, 0, -Sqrt[3]/4, -Sqrt[3]/4} + y}]]; |
|||
off = Transpose[{ConstantArray[0, 20], {0, 0, 0, 0, Sqrt[3]/4, |
|||
Sqrt[3]/4, Sqrt[3]/4, Sqrt[3]/4, 0, 0, 0, 0, Sqrt[3]/4, |
|||
Sqrt[3]/4, Sqrt[3]/4, Sqrt[3]/4, 0, 0, 0, 0}}]; |
|||
DynamicModule[{letters = RandomSample[CharacterRange["A", "Z"], 20], |
|||
blue = False, cols = {}, |
|||
locs = Tuples[{Range[1, 4, 3/4], |
|||
Range[1, 1 + (3 Sqrt[3])/2, Sqrt[3]/2]}] - off}, |
|||
EventHandler[ |
|||
Dynamic[Graphics[{EdgeForm[{Thick, Black}], LightGray, |
|||
hexagon /@ locs, {#[[1]], hexagon[#[[2]]]} & /@ cols, Black, |
|||
MapThread[ |
|||
Text, {Style[#, FontSize -> Large] & /@ letters, locs}], Red, |
|||
Text[Style[ |
|||
StringJoin[ |
|||
letters[[FirstPosition[locs, #[[2]]][[1]]]] & /@ |
|||
Cases[cols, {Red, _}][[All, 2]]], |
|||
FontSize -> 40], {5/2, -1/2}, {Right, Center}], Blue, |
|||
Text[Style[ |
|||
StringJoin[ |
|||
letters[[FirstPosition[locs, #[[2]]][[1]]]] & /@ |
|||
Cases[cols, {Blue, _}][[All, 2]]], |
|||
FontSize -> 40], {5/2, -1/2}, {Left, Center}]}, |
|||
PlotRange -> {{-1, 6}, Automatic}, |
|||
ImageSize -> Large]], {"MouseClicked" :> |
|||
If[! MemberQ[cols[[All, 2]], |
|||
Nearest[locs, MousePosition["Graphics"]][[1]]], |
|||
AppendTo[ |
|||
cols, {If[blue, Blue, Red], |
|||
Nearest[locs, MousePosition["Graphics"]][[1]]}]; |
|||
blue = ! blue]}]]</lang> |
|||
=={{header|MATLAB}}== |
|||
Simple version |
|||
*Click-play, no entering letters |
|||
*One-player |
|||
*Prints choices list to figure title, no output |
|||
*Easy to change number of rows or columns |
|||
*No support for different numbers of hexagons in different columns |
|||
*Works for up to 26 hexagons before using lowercase labels, 52 hexagons before repeating letters |
|||
*Works off of mouse-click events, so program doesn't need to "quit" as it is not really running constantly |
|||
<lang MATLAB>function Honeycombs |
|||
nRows = 4; % Number of rows |
|||
nCols = 5; % Number of columns |
|||
nHexs = nRows*nCols; % Number of hexagons |
|||
rOuter = 1; % Circumradius |
|||
startX = 0; % x-coordinate of upper left hexagon |
|||
startY = 0; % y-coordinate of upper left hexagon |
|||
delX = rOuter*1.5; % Horizontal distance between hexagons |
|||
delY = rOuter*sqrt(3); % Vertical distance between hexagons |
|||
offY = delY/2; % Vertical offset between columns |
|||
genHexX = rOuter.*cos(2.*pi.*(0:5).'./6); % x-coords of general hexagon |
|||
genHexY = rOuter.*sin(2.*pi.*(0:5).'./6); % y-coords of general hexagon |
|||
centX = zeros(1, nHexs); % x-coords of hexagon centers |
|||
centY = zeros(1, nHexs); % y-coords of hexagon centers |
|||
for c = 1:nCols |
|||
idxs = (c-1)*nRows+1:c*nRows; % Indeces of hexagons in that column |
|||
if mod(c, 2) % Odd numbered column - higher y-values |
|||
centY(idxs) = startY:-delY:startY-delY*(nRows-1); |
|||
else % Even numbered column - lower y-values |
|||
centY(idxs) = startY-offY:-delY:startY-offY-delY*(nRows-1); |
|||
end |
|||
centX(idxs) = (startX+(c-1)*delX).*ones(1, nRows); |
|||
end |
|||
[MCentX, MGenHexX] = meshgrid(centX, genHexX); |
|||
[MCentY, MGenHexY] = meshgrid(centY, genHexY); |
|||
HexX = MCentX+MGenHexX; % x-coords of hexagon vertices |
|||
HexY = MCentY+MGenHexY; % y-coords of hexagon vertices |
|||
figure |
|||
hold on |
|||
letters = char([65:90 97:122]); |
|||
randIdxs = randperm(26); |
|||
letters = [letters(randIdxs) letters(26+randIdxs)]; |
|||
hexH = zeros(1, nHexs); |
|||
for k = 1:nHexs % Create patches individually |
|||
hexH(k) = patch(HexX(:, k), HexY(:, k), [1 1 0]); |
|||
textH = text(centX(k), centY(k), letters(mod(k, length(letters))), ... |
|||
'HorizontalAlignment', 'center', 'FontSize', 14, ... |
|||
'FontWeight', 'bold', 'Color', [1 0 0], 'HitTest', 'off'); |
|||
set(hexH(k), 'UserData', textH) % Save to object for easy access |
|||
end |
|||
axis equal |
|||
axis off |
|||
set(gca, 'UserData', '') % List of clicked patch labels |
|||
set(hexH, 'ButtonDownFcn', @onClick) |
|||
end |
|||
function onClick(obj, event) |
|||
axesH = get(obj, 'Parent'); |
|||
textH = get(obj, 'UserData'); |
|||
set(obj, 'FaceColor', [1 0 1]) % Change color |
|||
set(textH, 'Color', [0 0 0]) % Change label color |
|||
set(obj, 'HitTest', 'off') % Ignore future clicks |
|||
currList = get(axesH, 'UserData'); % Hexs already clicked |
|||
newList = [currList get(textH, 'String')]; % Update list |
|||
set(axesH, 'UserData', newList) |
|||
title(newList) |
|||
end</lang> |
|||
=={{header|Perl}}== |
=={{header|Perl}}== |