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}}==