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); }
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); }
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); }
public static GFX.Player OppesitePlayer(GFX.Player p) { if (p == GFX.Player.X) { return(GFX.Player.O); } else { return(GFX.Player.X); } }
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++; }
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( } }
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); }
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); }
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( } }
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); } }