Okay Perl sucks so I'm doing C# instead. I like this language... it's weird not using streams all the time though.
I made ultimate tic tac toe. It could be made shorter but fuck my life I can't be bothered.
I'll put an exe up tomorrow or something or maybe now idk.
C# code:
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Ultimate_Tic_Tac_Toe
{
class Program
{
static PStats[] player;
static Metaspace[] mgrid;
class Metaspace
{
public char[] gspaces;
public char winner;
public Metaspace()
{
gspaces = new char[9];
for(int i = 0; i < 9; i++)
{
gspaces[i] = ' ';
}
winner = ' ';
}
}
static void getstats()
{
while (true)
{
Console.WriteLine("How many players?: ");
UInt32.TryParse(Console.ReadLine(), out PStats.num);
player = new PStats[PStats.num];
if (PStats.num > 0)
{
break;
}
else
{
Console.WriteLine("Invalid input");
}
}
ArrayList symb = new ArrayList();
for(uint i = 1; i <= PStats.num; i++)
{
while (true)
{
Console.WriteLine("Player{0} name and symbol:", i);
player[i-1].username = Console.ReadLine();
ConsoleKeyInfo temp = Console.ReadKey();
if(symb.Count >= 1)
{
bool gate = false;
for(int j = 0; j < symb.Count; j++)
{
gate = false;
if(temp.KeyChar == Convert.ToChar(symb[j]))
{
Console.WriteLine("\r\nThat symbol is already taken!");
gate = true;
break;
}else if(temp.KeyChar == '~')
{
Console.WriteLine("\r\n'~' is a reserved symbol, try something different.");
gate = true;
break;
}
}
if (gate == true)
{
continue;
}
}
player[i-1].symbol = temp.KeyChar;
symb.Add(temp.KeyChar);
Console.WriteLine("\nIs {0} with the symbol {1} correct? [y/n]", player[i - 1].username, player[i - 1].symbol);
temp = Console.ReadKey();
Console.WriteLine("\n");
if(temp.KeyChar == 'y' || temp.KeyChar == 'Y')
{
Console.WriteLine('\n');
break;
}
}
}
}
static void drawmetagrid()
{
Console.Out.NewLine = "";
Console.WriteLine("\r\n");
Console.WriteLine("Metagrid:\r\n");
for (uint i = 0; i < 3; i++)
{
for (uint k = 0; k < 3; k++)
{
for (uint m = 1; m < 22; m++)
{
Console.WriteLine("-");
if (m % 7 == 0 && m != 0)
{
Console.WriteLine(" ");
}
}
Console.WriteLine("\r\n");
for (uint j = i * 3; j < i * 3 + 3; j++)
{
Console.WriteLine("|");
for (uint l = k * 3; l < k * 3 + 3; l++)
{
Console.WriteLine(Convert.ToString(mgrid[j].gspaces[l]));
Console.WriteLine("|");
}
Console.WriteLine(" ");
}
Console.WriteLine("\r\n");
if (k == 2)
{
for (uint m = 1; m < 22; m++)
{
Console.WriteLine("-");
if(m % 7 == 0 && m != 0)
{
Console.WriteLine(" ");
}
}
Console.WriteLine("\r\n");
}
}
}
Console.Out.NewLine = "\r\n";
}
static uint playerturn(uint who, uint which)
{
Console.Out.NewLine = "";
Console.WriteLine("{0}, pick a square in grid {1} [0..8]:", player[who].username, which);
ConsoleKeyInfo temp;
while (true)
{
int index = -1;
do
{
temp = Console.ReadKey();
int.TryParse(Convert.ToString(temp.KeyChar), out index);
Console.WriteLine("\r\n");
} while (index == -1);
if(index > 8 || index < 0)
{
Console.WriteLine("Must be a number from 1-8!\r\n");
continue;
}else if (mgrid[which].gspaces[index] == ' ')
{
mgrid[which].gspaces[index] = player[who].symbol;
break;
}else
{
Console.WriteLine("That square is already taken\r\n");
continue;
}
}
Console.WriteLine("\r\n");
uint utemp;
uint.TryParse(temp.KeyChar.ToString(), out utemp);
return utemp;
}
static bool checkgamewon(uint who)
{
char[] gspaces = new char[9];
for (uint i = 0; i < 9; i++)
{
gspaces[i] = mgrid[i].winner;
}
bool gate = true;
for (uint i = 0; i < 9; i++)
{
if (mgrid[i].winner == ' ')
{
gate = false;
}
}
if(gspaces[0] == gspaces[1] && gspaces[0] == gspaces[2] && gspaces[0] != ' ' && gspaces[0] != '~'
|| gspaces[0] == gspaces[3] && gspaces[0] == gspaces[6] && gspaces[0] != ' ' && gspaces[0] != '~'
|| gspaces[0] == gspaces[4] && gspaces[0] == gspaces[8] && gspaces[0] != ' ' && gspaces[0] != '~'
|| gspaces[8] == gspaces[5] && gspaces[8] == gspaces[2] && gspaces[8] != ' ' && gspaces[8] != '~'
|| gspaces[8] == gspaces[7] && gspaces[8] == gspaces[6] && gspaces[8] != ' ' && gspaces[8] != '~'
|| gspaces[3] == gspaces[4] && gspaces[3] == gspaces[5] && gspaces[3] != ' ' && gspaces[3] != '~'
|| gspaces[1] == gspaces[4] && gspaces[1] == gspaces[7] && gspaces[1] != ' ' && gspaces[1] != '~')
{
Console.WriteLine("\r\nWe have a winner!");
Console.WriteLine("{0} wins!", player[who]);
return true;
}
if (gate)
{
Console.WriteLine("The game is a draw!");
Console.WriteLine(":[");
return true;
}
return false;
}
static bool checkgridwin(uint who, uint which)
{
char[] gspaces = new char[9];
for (uint i = 0; i < 9; i++)
{
gspaces[i] = mgrid[which].gspaces[i];
}
bool gate = true;
for(uint i = 0; i < 9; i++)
{
if(gspaces[i] == ' ')
{
gate = false;
}
}
if(gspaces[0] == gspaces[1] && gspaces[0] == gspaces[2] && gspaces[0] != ' '
|| gspaces[0] == gspaces[3] && gspaces[0] == gspaces[6] && gspaces[0] != ' '
|| gspaces[0] == gspaces[4] && gspaces[0] == gspaces[8] && gspaces[0] != ' '
|| gspaces[8] == gspaces[5] && gspaces[8] == gspaces[2] && gspaces[8] != ' '
|| gspaces[8] == gspaces[7] && gspaces[8] == gspaces[6] && gspaces[8] != ' '
|| gspaces[3] == gspaces[4] && gspaces[3] == gspaces[5] && gspaces[3] != ' '
|| gspaces[1] == gspaces[4] && gspaces[1] == gspaces[7] && gspaces[1] != ' ')
{
for (uint i = 0; i < 9; i++)
{
mgrid[which].gspaces[i] = player[who].symbol;
}
mgrid[which].winner = player[who].symbol;
return true;
}
if(gate)
{
Console.WriteLine("Grid {0} is a draw!", which);
for (uint i = 0; i < 9; i++)
{
mgrid[which].gspaces[i] = '~';
}
mgrid[which].winner = '~';
}
return false;
}
static uint gridchoice()
{
uint utemp;
while (true)
{
Console.WriteLine("Pick a grid, {0} [0..8]", player[0].username);
ConsoleKeyInfo temp = Console.ReadKey();
UInt32.TryParse(Convert.ToString(temp.KeyChar), out utemp);
if (utemp < 0 && utemp >= 9)
{
Console.WriteLine("Must be from 0 to 8");
continue;
}
Console.WriteLine("\r\n");
break;
}
return utemp;
}
struct PStats
{
static public uint num;
public string username;
public char symbol;
public uint games_won;
public uint games_lost;
}
static void Main(string[] args)
{
Console.WriteLine("Ultimate TTT. Rules are pretty complcated so you'd better google em'.");
Console.WriteLine("Or go here: http://mathwithbaddrawings.com/2013/06/16/ultimate-tic-tac-toe/");
Console.WriteLine("The 'big grid' here is called the 'metagrid' by the way.");
getstats();
while (true)
{
mgrid = new Metaspace[9];
for (int i = 0; i < 9; i++)
{
mgrid[i] = new Metaspace();
}
drawmetagrid();
uint pick = gridchoice();
uint turn = 0;
while (true)
{
drawmetagrid();
uint temp = pick;
pick = playerturn(turn, pick);
if (mgrid[pick].winner == '~')
{
Console.WriteLine("grid {0} is already closed, you can pick any grid you like!", pick);
pick = gridchoice();
}
if (checkgridwin(turn, temp))
{
Console.WriteLine("{0} wins the grid!", player[turn].username);
if (checkgamewon(turn))
{
break;
}
}
turn++;
if (turn > (PStats.num - 1))
{
turn = 0;
}
}
for(uint i = 0; i < PStats.num; i++)
{
Console.WriteLine("{0} has {1} wins and {2} losses,", player[i].username, player[i].games_won, player[i].games_lost);
}
Console.WriteLine("Play again? [y/n]");
ConsoleKeyInfo again = Console.ReadKey();
if(again.KeyChar == 'n')
{
break;
}
}
Console.WriteLine("Press any key to exit.");
Console.ReadKey();
}
}
}
I think C# might be Windows specific so I'm sorry Unix people.
Pastebin.