Files
basic-computer-games/56_Life_for_Two/csharp/Program.cs
2022-08-20 21:34:52 +10:00

147 lines
3.4 KiB
C#

global using Games.Common.IO;
global using static LifeforTwo.Resources.Resource;
var io = new ConsoleIO();
io.Write(Streams.Title);
var _cells = new int[7, 7];
var _willLive = new[] { 3, 102, 103, 120, 130, 121, 112, 111, 12, 21, 30, 1020, 1030, 1011, 1021, 1003, 1002, 1012 };
var _offsets = new[] { -1, 0, 1, 0, 0, -1, 0, 1, -1, -1, 1, -1, -1, 1, 1, 1 };
var X = new int[3];
var Y = new int[3];
int _player1Count, _player2Count;
void CalculateNeighbors()
{
for (var j = 1; j <= 5; j++)
{
for (var k = 1; k <= 5; k++)
{
if (_cells[j, k] > 99)
{
int B = _cells[j, k] > 999 ? 10 : 1;
for (var o = 0; o < 15; o += 2)
{
_cells[j + _offsets[o], k + _offsets[o + 1]] += B;
}
}
}
}
}
void CalculateAndDisplayNext()
{
_player1Count = _player2Count = 0;
for (var j = 0; j <= 6; j++)
{
io.WriteLine();
for (var k = 0; k <= 6; k++)
{
if (j % 6 == 0)
{
io.Write($" {k % 6} ");
}
else if (k % 6 == 0)
{
io.Write($" {j % 6} ");
}
else
{
CalculateAndDisplayCell(j, k);
}
}
}
return;
}
void CalculateAndDisplayCell(int j, int k)
{
if (_cells[j, k] >= 3)
{
for (var O1 = 0; O1 < 18; O1++)
{
if (_cells[j, k] == _willLive[O1])
{
if (O1 < 9)
{
_cells[j, k] = 100; _player1Count++; io.Write(" * ");
}
else
{
_cells[j, k] = 1000; _player2Count++; io.Write(" # ");
}
return;
}
}
}
_cells[j, k] = 0;
io.Write(" ");
}
for (var _player = 1; _player <= 2; _player++)
{
var P1 = _player == 2 ? 30 : 3;
io.WriteLine(Formats.InitialPieces, _player);
for (var i = 1; i <= 3; i++)
{
ReadCoordinates(_player);
_cells[X[_player], Y[_player]] = P1;
}
}
CalculateAndDisplayNext();
while (true)
{
io.WriteLine();
CalculateNeighbors();
CalculateAndDisplayNext();
if (_player1Count == 0 || _player2Count == 0) { break; }
for (var _player = 1; _player <= 2; _player++)
{
io.WriteLine(Formats.Player, _player);
if (ReadCoordinates(_player))
{
_cells[X[1], Y[1]] = 100;
_cells[X[2], Y[2]] = 1000;
}
}
}
if (_player1Count == 0 && _player2Count == 0)
{
io.Write(Streams.Draw);
}
else
{
io.WriteLine(Formats.Winner, _player2Count == 0 ? 1 : 2);
}
bool ReadCoordinates(int _player)
{
while (true)
{
io.WriteLine("X,Y");
var (y, x) = io.Read2Numbers("&&&&&&\r");
(Y[_player], X[_player]) = ((int)y, (int)x);
if (X[_player] <= 5 && X[_player] > 0 && Y[_player] <= 5 && Y[_player] > 0 && _cells[X[_player], Y[_player]] == 0)
{
break;
}
io.Write(Streams.IllegalCoords);
}
if (_player == 2 && X[1] == X[2] && Y[1] == Y[2])
{
io.Write(Streams.SameCoords);
// This is a bug existing in the original code. The line should be N[X[B], Y[B]] = 0;
_cells[X[_player] + 1, Y[_player] + 1] = 0;
return false;
}
return _player == 2;
}