Beispiel #1
0
        public static int GetNextMove(difficulty dif, GFX.Player p = GFX.Player.O)
        {
            int d;

            if (dif == difficulty.Easy)
            {
                d = 1;
            }
            else
            {
                d = 9;
            }
            GFX.Player[] b;
            GFX.Player[] old = Logic.board;
            minimax(d, int.MinValue + 1, int.MaxValue - 1, true, p, Logic.board, out b);
            if (b != null)
            {
                Logic.board = b;
            }
            for (int i = 0; i < 9; i++)
            {
                if (old[i] != b[i])
                {
                    return(i);
                }
            }
            return(-1);
        }
Beispiel #2
0
        public static Logic.WinState checkWin(GFX.Player[] board, GFX.Player p)
        {
            // int[] temp = new int[3];
            bool full = true;

            for (int i = 0; i < 8; i++)
            {
                int[] z = GetFromWinArray(i);
                if (board[z[0]] == board[z[1]] && board[z[0]] == board[z[2]] && board[z[0]] != GFX.Player.Empty)
                {
                    return(Logic.WinState.Win);
                }
            }
            for (int i = 0; i < 9; i++)
            {
                if (board[i] == GFX.Player.Empty)
                {
                    full = false;
                    break;
                }
            }
            if (full == true)
            {
                return(Logic.WinState.Draw);
            }
            return(Logic.WinState.Nothing);
        }
Beispiel #3
0
 public static GFX.Player[] Clone(GFX.Player[] b)
 {
     GFX.Player[] t = new GFX.Player[b.Length];
     for (int i = 0; i < b.Length; i++)
     {
         t[i] = b[i];
     }
     return(t);
 }
Beispiel #4
0
 public static GFX.Player OppesitePlayer(GFX.Player p)
 {
     if (p == GFX.Player.X)
     {
         return(GFX.Player.O);
     }
     else
     {
         return(GFX.Player.X);
     }
 }
Beispiel #5
0
 public static void getAnime(GFX.Player p, Point p1 = new Point(), Point p2 = new Point(), Point p3 = new Point(), Point o = new Point(), Point o2 = new Point())
 {
     animData[animeind]    = new anim();
     animData[animeind].p1 = p1;
     animData[animeind].p2 = p2;
     animData[animeind].p3 = p3;
     animData[animeind].o  = o;
     animData[animeind].o2 = o2;
     animData[animeind].p  = p;
     animeind++;
 }
Beispiel #6
0
        private void Form1_MouseDown(object sender, MouseEventArgs e)
        {
            if (!game)
            {
                return;
            }
            int z = g.getBox(e.X, e.Y);

            if (z == -1)
            {
                return;
            }
            if (isFocused == false)
            {
                return;
            }
            // if (AIGame == true) t = GFX.Player.X;
            // this.Text = "Box = " + z;
            if (Logic.Win == false && Logic.board[z] == GFX.Player.Empty)
            {
                g.DrawPlayer(t, z);
                Logic.Move(z, t);
                check();
                if (AIGame == false)
                {
                    if (t == GFX.Player.X)
                    {
                        t = GFX.Player.O;
                    }
                    else
                    {
                        t = GFX.Player.X;
                    }
                }
                else
                {
                    if (Logic.checkWin() != Logic.WinState.Nothing)
                    {
                        return;
                    }
                    //t = GFX.Player.X;
                    int d;
                    d = AI.GetNextMove(allDif);
                    //if (d != null) Logic.board = d;
                    if (d != -1)
                    {
                        g.DrawPlayer(GFX.Player.O, d);
                    }
                }
                //check(
            }
        }
Beispiel #7
0
        public static int minimax(int depth, int alpha, int beta, bool maxing, GFX.Player ai, GFX.Player[] board, out GFX.Player[] bestOut)
        {
            bestOut = null;

            if (checkWin(board, ai) == Logic.WinState.Win || checkWin(board, ai) == Logic.WinState.Draw || depth == 0)
            {
                RecursiveScore = m_Score;
                return(m_Score);
            }
            // System.Diagnostics.Debug.WriteLine("Minimaxing...");
            for (int i = 0; i < 9; i++)
            {
                //  if (depth == 0) break;
                if (board[i] == GFX.Player.Empty)
                {
                    GFX.Player[] newboard = GetChild(board, ai, i);
                    GFX.Player[] dummy;
                    int          sc = minimax(depth - 1, alpha, beta, !maxing, OppesitePlayer(ai), newboard, out dummy);
                    if (!maxing)
                    {
                        if (beta > sc)
                        {
                            beta    = sc;
                            bestOut = newboard;
                            if (alpha >= beta)
                            {
                                break;
                            }
                        }
                    }
                    else
                    {
                        if (alpha < sc)
                        {
                            alpha   = sc;
                            bestOut = newboard;
                            if (alpha >= beta)
                            {
                                break;
                            }
                        }
                    }
                }
            }

            RecursiveScore = maxing ? alpha : beta;
            return(RecursiveScore);
        }
Beispiel #8
0
        public static GFX.Player[] GetChild(GFX.Player[] board, GFX.Player player, int i)
        {
            GFX.Player[] p = Clone(board);
            p[i] = player;
            bool ifX;

            if (player == GFX.Player.X)
            {
                ifX = true;
            }
            else
            {
                ifX = false;
            }
            ComputeScore(p, ifX);
            return(p);
        }
Beispiel #9
0
        private void Form1_KeyPress(object sender, KeyPressEventArgs e)
        {
            System.Diagnostics.Debug.WriteLine(e.KeyChar.ToString());
            if (!game)
            {
                return;
            }
            if (e.KeyChar > '9' || e.KeyChar < '1')
            {
                return;
            }
            int z = -1;

            switch (e.KeyChar)
            {
            case '1':
                z = 6;
                break;

            case '2':
                z = 7;
                break;

            case '3':
                z = 8;
                break;

            case '4':
                z = 3;
                break;

            case '5':
                z = 4;
                break;

            case '6':
                z = 5;
                break;

            case '9':
                z = 2;
                break;

            case '8':
                z = 1;
                break;

            case '7':
                z = 0;
                break;
            }
            if (z == -1)
            {
                return;
            }
            if (AIGame == true)
            {
                t = GFX.Player.X;
            }
            // this.Text = "Box = " + z;
            if (Logic.Win == false && Logic.board[z] == GFX.Player.Empty)
            {
                g.DrawPlayer(t, z);
                Logic.Move(z, t);
                check();
                if (AIGame == false)
                {
                    if (t == GFX.Player.X)
                    {
                        t = GFX.Player.O;
                    }
                    else
                    {
                        t = GFX.Player.X;
                    }
                }
                else
                {
                    if (Logic.checkWin() != Logic.WinState.Nothing)
                    {
                        return;
                    }
                    //t = GFX.Player.X;
                    int d;
                    d = AI.GetNextMove(allDif);
                    if (d != -1)
                    {
                        g.DrawPlayer(GFX.Player.O, d);
                    }
                }
                //check(
            }
        }
Beispiel #10
0
        public void Animations_Tick(object sender, EventArgs e)
        {
            Timer ti = (Timer)sender;

            if (curind == animeind)
            {
                return;
            }
            GFX.Player cur_ani = animData[curind].p;
            if (cur_ani == GFX.Player.X)
            {
                int plusfactor = 7;
                int h          = animData[curind].p2.Y - animData[curind].p1.Y;
                int w          = animData[curind].p2.X - animData[curind].p1.X;
                if (animData[curind].p3.X < w)
                {
                    animData[curind].p3 = new Point(animData[curind].p3.X + plusfactor, animData[curind].p3.Y);
                }
                if (animData[curind].p3.Y < h)
                {
                    animData[curind].p3 = new Point(animData[curind].p3.X, animData[curind].p3.Y + plusfactor);
                }
                if (animData[curind].p3.X > w)
                {
                    animData[curind].p3.X = w;
                }
                if (animData[curind].p3.Y > h)
                {
                    animData[curind].p3.Y = h;
                }

                Pen t = new Pen(Color.Red);
                t.Width = 10;
                g.g.DrawLine(t, animData[curind].p1, new Point(animData[curind].p1.X + animData[curind].p3.X, animData[curind].p1.Y + animData[curind].p3.Y));
                g.g.DrawLine(t, animData[curind].o, new Point(animData[curind].o.X - animData[curind].p3.X, animData[curind].o.Y + animData[curind].p3.Y));
                Point temp = new Point(animData[curind].p1.X + animData[curind].p3.X, animData[curind].p1.Y + animData[curind].p3.Y);
                if (temp.X == animData[curind].p2.X || temp.Y == animData[curind].p2.Y)
                {
                    //cur_ani = GFX.Player.Empty;
                    //animData[curind].p3 = new Point();
                    curind++;
                }
            }

            if (cur_ani == GFX.Player.O)
            {
                int plusfactor = 7;
                //int h = animData[curind].p2.Y - animData[curind].p1.Y;
                //int w = animData[curind].p2.X - animData[curind].p1.X;
                g.g.FillRectangle(new SolidBrush(this.BackColor), new Rectangle(animData[curind].p1.X, animData[curind].p1.Y, animData[curind].p2.X, animData[curind].p2.Y));
                //   g.g.DrawEllipse(new Pen(Color.Pink), new Rectangle(start, new Size(50, 50)));
                if (animData[curind].p3.X < animData[curind].p2.X)
                {
                    animData[curind].p3 = new Point(animData[curind].p3.X + plusfactor, animData[curind].p3.Y);
                }
                if (animData[curind].p3.Y < animData[curind].p2.Y)
                {
                    animData[curind].p3 = new Point(animData[curind].p3.X, animData[curind].p3.Y + plusfactor);
                }
                if (animData[curind].p3.X > animData[curind].p2.X)
                {
                    animData[curind].p3.X = animData[curind].p2.X;
                }
                if (animData[curind].p3.Y > animData[curind].p2.Y)
                {
                    animData[curind].p3.Y = animData[curind].p2.Y;
                }
                Pen t = new Pen(Color.Blue);
                t.Width = 10;
                start   = new Point(animData[curind].p1.X + (animData[curind].p2.X - animData[curind].p3.X), animData[curind].p1.Y + (animData[curind].p2.Y - animData[curind].p3.Y));
                end     = new Size((animData[curind].p3.X - animData[curind].o.X) * 2, (animData[curind].p3.Y - animData[curind].o.Y) * 2);
                g.g.DrawEllipse(t, new Rectangle(start, end));
                //  System.Diagnostics.Debug.WriteLine(start.X + "," + start.Y + "--->" + end.Width + "," + end.Height);
                //Point temp = new Point(animData[curind].p1.X + animData[curind].p3.X, animData[curind].p1.Y + animData[curind].p3.Y);
                if (animData[curind].p3.X == animData[curind].p2.X || animData[curind].p3.Y == animData[curind].p2.Y)
                {
                    curind++;
                    //animData[curind].p3 = new Point();
                }
            }
            if (IsWin == true)
            {
                g.DrawWin(sWin, eWin);
            }
        }