Раздел «Sandbox ».JustForTest:
You can delete it if you want ))

Код алгоритма для крестиков-ноликов на относительно бесконечном поле:

using System;
using System.Windows.Forms;

namespace XOGame
{
   public class Comp2 : IComp
   {
      private byte[,] pole;
      private int[,] ves;
      private int pole_size;
      private byte side;
      private bool first;
      //
      public Comp2()
      {
         first=true;
         //MessageBox.Show("HeLlO!");
      }
      
      public void Init(byte s,int size)
      {
         pole=new byte[size,size];
         ves=new int[size,size];
         side=s;
         pole_size=size;
      }
      
      public void NewGame()
      {
         for(int x=0;x<pole_size;x++)
         for(int y=0;y<pole_size;y++)
         {
            pole[x,y]=0;
         }
      }
      
      public void EndGame()
      {
         //
      }
      
      public void DoPutComp(Coord c)
      {
         first=false;
         if(pole[c.x,c.y]!=0)
         {
            string s="x="+c.x.ToString()+" y="+c.y.ToString();
            throw new Exception("Comp::DoPutComp: pole[x,y]!=0 "+s);
         }
         pole[c.x,c.y]=side;
      }
      
      public void DoPutUser(Coord c)
      {
         first=false;
         if(pole[c.x,c.y]!=0)
         {
            string s="x="+c.x.ToString()+" y="+c.y.ToString();
            throw new Exception("Comp::DoPutUser: pole[x,y]!=0 "+s);
         }
         pole[c.x,c.y]=(byte)(3-side);
      }
      
      private void CalcLine(int x,int y,int dx,int dy,int sd)
      {
         int s=0;
         int f=1;
         for(int i=0;i<5;i++)
         {
            int x1 = x+i*dx;
            int y1 = y+i*dy;
            if((x1<pole_size)&&(y1<pole_size)&&(x1>=0)&&(y1>=0))
            {
               if(pole[x1,y1]==(3-sd))
                  f=0;
               if(pole[x1,y1]==sd)
                  if(s==0) s=1; else s*=10;
            }
         }
         s*=f;
         for(int i=0;i<5;i++)
         {
            int x1 = x+i*dx;
            int y1 = y+i*dy;
            if((x1<pole_size)&&(y1<pole_size)&&(x1>=0)&&(y1>=0))
            {
               if(pole[x1,y1]==0)
                  ves[x1,y1]=ves[x1,y1]+s;
            }
         }
      }
      
      public Coord Doom()
      {
         int x,y;
         //
         if(first)
         {
            return new Coord(pole_size/2,pole_size/2);
         }
         //
         for(x=0;x<pole_size;x++)
         for(y=0;y<pole_size;y++)
         {
            ves[x,y]=0;
         }
         for(x=0;x<pole_size;x++)
         for(y=0;y<pole_size;y++)
         {
            CalcLine(x,y,1,0,side);
            CalcLine(x,y,0,1,side);
            CalcLine(x,y,1,1,side);
            CalcLine(x,y,1,-1,side);
         }
         for(x=0;x<pole_size;x++)
         for(y=0;y<pole_size;y++)
         {
            CalcLine(x,y,1,0,3-side);
            CalcLine(x,y,0,1,3-side);
            CalcLine(x,y,1,1,3-side);
            CalcLine(x,y,1,-1,3-side);
         }
         int max=0;
         int xmax=0;
         int ymax=0;
         for(x=0;x<pole_size;x++)
         for(y=0;y<pole_size;y++)
            if(ves[x,y]>max)
            {
               max=ves[x,y];
               xmax=x; ymax=y;
            }
         return new Coord(xmax,ymax);
      }
      
      public string GetComment()
      {
         return "XO comp by gHosT";
      }
      
      public string GetName()
      {
         return "Comp::gHosT";
      }
      
      public void ShowSettings()
      {
      }
   }
}

Интерфейс, для алгоритмов, управляемых компьютером:

using System;

namespace XOGame
{
   public interface IComp
   {
      void Init(byte s,int size);
      
      void DoPutComp(Coord c);
      
      void DoPutUser(Coord c);
      
      Coord Doom();
      
      void NewGame();
      
      void EndGame();
      
      string GetComment();
      
      string GetName();
      
      void ShowSettings();
   }
}

Attachment sort Action Size Date Who Comment
XO.rar manage 93.7 K 20 Nov 2007 - 15:14 VadimKaushan Исходный код крестиков-ноликов