Program hrající piškvorky
C# .NET
using static System.Console;
namespace Piškvorky
{
class Program
{
static void Main(string[] args)
{
Počítač pc = new Počítač('J', 'O', 3);
char[,] pole = new char[2, 1];
Tah t = pc.Hraj(pole);
WriteLine($"{t.X} {t.Y}");
WriteLine($"{pole[0, 0]} {pole[1, 0]}");
ReadKey();
}
}
}
namespace Piškvorky
{
struct Tah
{
public int X, Y, hodnota;
public char[,] vyslednePole;
public Tah(int X, int Y, int hodnota, char[,] vyslednePole)
{
this.X = X;
this.Y = Y;
this.hodnota = hodnota;
this.vyslednePole = vyslednePole;
}
}
}
using System;
namespace Piškvorky
{
class Počítač
{
public char ja, on;
public int obtiznost;
public Počítač(char ja, char on, int obtiznost)
{
this.ja = ja;
this.on = on;
this.obtiznost = obtiznost;
}
public Tah Hraj(char[,] pole)
{
return MiniMax(pole, obtiznost, true, ja, on);
}
private int Ohodnot(char[,] pole)
{
int body = 0;
//vodorovná kontrola všech pětic ve všech řádcích
for (int y = 0; y < pole.GetLength(1); y++)
{
for (int si = 0; si <= pole.GetLength(0) - 5; si++)
{
int petice = 0;
for (int i = si; i < si + 5; i++)
{
if (pole[i, y] == on && petice > 0 || pole[i, y] == ja && petice < 0)
{ petice = 0; break; }
if (pole[i, y] == ja) petice++;
if (pole[i, y] == on) petice--;
}
body += petice;
}
}
//svislá kontrola všech pětic ve všech sloupcích
for (int x = 0; x < pole.GetLength(0); x++)
{
for (int si = 0; si <= pole.GetLength(1) - 5; si++)
{
int petice = 0;
for (int i = si; i < si + 5; i++)
{
if (pole[x, i] == on && petice > 0 || pole[x, i] == ja && petice < 0)
{ petice = 0; break; }
if (pole[x, i] == ja) petice++;
if (pole[x, i] == on) petice--;
}
body += petice;
}
}
//kontrola rostoucích vrchních diagonál
for (int i = 4; i < pole.GetLength(1) - 1; i++)
{
for (int j = i, k = 0; j >= 4 && k <= pole.GetLength(0) - 5; j--, k++)
{
int petice = 0;
for (int l = j, m = k; l > j - 5 && m < k + 5; l--, m++)
{
if (pole[m, l] == on && petice > 0 || pole[m, l] == ja && petice < 0)
{ petice = 0; break; }
else if (pole[m, l] == ja) petice += 1;
else if (pole[m, l] == on) petice -= 1;
}
body += petice;
}
}
//rostoucí spodní
for (int i = 0; i <= pole.GetLength(0) - 5; i++)
{
for (int j = i, k = pole.GetLength(1) - 1; j <= pole.GetLength(0) - 5 && k >= 4; j++, k--)
{
int petice = 0;
for (int l = j, m = k; l < j + 5 && m > k - 5; l++, m--)
{
if (pole[l, m] == on && petice > 0 || pole[l, m] == ja && petice < 0)
{ petice = 0; break; }
else if (pole[l, m] == ja) petice += 1;
else if (pole[l, m] == on) petice -= 1;
}
body += petice;
}
}
//klesající spodní
for (int i = 1; i <= pole.GetLength(1) - 5; i++)
{
for (int j = i, k = 0; j <= pole.GetLength(1) - 5 && k < pole.GetLength(0) - 5; j++, k++)
{
int petice = 0;
for (int l = j, m = k; l < j + 5 && m < k + 5; l++, m++)
{
if (pole[m, l] == on && petice > 0 || pole[m, l] == ja && petice < 0)
{ petice = 0; break; }
else if (pole[m, l] == ja) petice += 1;
else if (pole[m, l] == on) petice -= 1;
}
body += petice;
}
}
//klesající vrchní
for (int i = 0; i <= pole.GetLength(0) - 5; i++)
{
for (int j = i, k = 0; j <= pole.GetLength(0) - 5 && k < pole.GetLength(1) - 5; j++, k++)
{
int petice = 0;
for (int l = j, m = k; l < j + 5 && m < k + 5; l++, m++)
{
if (pole[l, m] == on && petice > 0 || pole[l, m] == ja && petice < 0)
{ petice = 0; break; }
else if (pole[l, m] == ja) petice += 1;
else if (pole[l, m] == on) petice -= 1;
}
body += petice;
}
}
return body;
}
private char[,] Tahni(char[,] pole, int X, int Y, char hraje)
{
pole[X, Y] = hraje;
return pole;
}
private Tah MiniMax(char[,] pole, int cislo, bool max, char hraje, char nehraje)
{
Tah vysledek = new Tah();
vysledek.X = -1;
if (cislo == 0)
{
vysledek.hodnota = Ohodnot(pole);
}
else
{
int sirka = pole.GetLength(0), vyska = pole.GetLength(1);
for (int x = 0; x < sirka; x++)
{
for (int y = 0; y < vyska; y++)
{
if ((int)pole[x, y] == 0) //pokud je políčko prázdné
{
Tah aktualni = new Tah();
aktualni.X = x; aktualni.Y = y;
aktualni.vyslednePole = Tahni(pole, x, y, hraje);
aktualni.hodnota = MiniMax(aktualni.vyslednePole, cislo - 1, !max, nehraje, hraje).hodnota;
if (aktualni.hodnota > vysledek.hodnota && max || aktualni.hodnota < vysledek.hodnota && !max || vysledek.X == -1)
{
vysledek = aktualni;
}
}
}
}
}
return vysledek;
}
}
}
Neformátovaný
Přidáno: 29.3.2016
Expirace: Neuvedeno