public void SetAlfa(float alfa, Vector2 newMove, Nodo nodo) { if (_isMaxNode) { if (alfa > _alfa) { _alfa = alfa; _value = alfa; _chosenMove = newMove; _chosenSon = nodo; // Debug.Log("Novo alfa "+newMove); if (_beta < _alfa) { _stop = true; } } } else { if (alfa > _alfa) _alfa = alfa; } }
public Nodo(int[][] board, bool isMaxNode, Nodo parent,Vector2 original, int level,float initAlfa,float initBeta) { _value = 0; _alfa = initAlfa; _beta = initBeta; _board = new int[15][]; _valuedBoard = new int[15][]; for (int i = 0; i < 15; i++) { _valuedBoard[i] = new int[15]; _board [i] = new int[15]; for (int j = 0; j < 15; j++) { _board[i][j] = board[i][j]; } } _isMaxNode = isMaxNode; _parent = parent; _originalMove = original; _level = level; _childPos = 0; _stop = false; }
public void MakePlay() { // if (_firstPlay) // { // FirstPlay(); // _firstPlay = false; // return; // } //Se a jogada do jogador estiver na previsão da ia n cria nova arvore, //utiliza o filho com o estado correspondente _node = new Nodo(Game.Instance.Board, true, null, new Vector2(-1, -1),0,-1000000,1000000); Vector2 move = _node.StartConstructionAndSearch(); Game.Instance.EndComputerTurn((int)move.x, (int)move.y); }
private void CreateChild() { if (_level < 1) { for (int i = 0; i < 225; i++) { Vector2 move = new Vector2((int)i % 15, (int)(i/15) % 15); if (_board[(int)move.x][(int)move.y] != 0) continue; int[][] newBoard = new int[15][]; for (int p = 0; p < 15; p++) { newBoard[p] = new int[15]; for (int q = 0; q < 15; q++) { newBoard[p][q] = _board[p][q]; } } newBoard[(int) move.x][(int) move.y] = 1; Nodo filho = new Nodo(newBoard, !_isMaxNode, this, move, _level + 1, _alfa ,_beta); filho.StartConstructionAndSearch(); _valuedBoard[(int) move.x][(int) move.y] = (int)filho._value; if (_stop) { //Debug.Log("STOP"); break; } } } else { _value = CheckHoriValue((int)_originalMove.x, (int)_originalMove.y) + CheckVertValue((int)_originalMove.x, (int)_originalMove.y) + CheckDiagAscValue((int)_originalMove.x, (int)_originalMove.y) + CheckDiagDescValue((int)_originalMove.x, (int)_originalMove.y); _chosenMove = _originalMove; } if (_parent != null) { if (_isMaxNode) { _parent.SetBeta(_value, _originalMove,this); return; } _parent.SetAlfa(_value, _originalMove,this); } }
public void SetBeta(float beta,Vector2 newMove, Nodo nodo) { if (!_isMaxNode) { if (beta < _beta) { _beta = beta; _value = beta; _chosenMove = newMove; _chosenSon = nodo; if (_beta < _alfa) { _stop = true; } } } else { if(beta < _beta) _beta = beta; } }