diff --git a/TicTacToeEx/T3EBoard.cpp b/TicTacToeEx/T3EBoard.cpp index 5549bcd..512171e 100644 --- a/TicTacToeEx/T3EBoard.cpp +++ b/TicTacToeEx/T3EBoard.cpp @@ -70,6 +70,7 @@ { int place = 0; ; + do { place = rand() % BOARD_SIZE; } while (m_Board[place] != NONE); @@ -79,22 +80,53 @@ } //�ǂ̔Ֆʂ������Ɉ�ԑ傫���]���������炷���m�F�B -//����:int node �ǖ�, in turn ���, int depth ��ǂ݂̐[�� +//����:int node �ǖ�, in turn ���, int turn �^�[����,int depth ��ǂ݂̐[�� //�߂�l�F�]���l -int T3EBoard::Minmax(int *node, int turn, int depth) +int T3EBoard::Minmax(int *node, int NextPlayer,int turn, int depth) { //�t�̏ꍇ�]���l��Ԃ� - if (depth == 0) return this->CheckWin(node); + if (depth == 0) return this->CheckWin(node); + + int NextBoard[BOARD_SIZE]; + int NextNode; + int k = 0; //���̋ǖʊi�[�p�ϐ� //�m�[�h����i�߂� - //this->expand_node(node, NextTurn); + int *NextBoards; + //���̉”\�萔�𐔂��� + NextNode = this->count_zero(node); + //�萔�����Ԃɓ��I�z��Ɋi�[ + NextBoards = new int[NextNode*BOARD_SIZE]; + //�΂�u�����ǖʂ�S�Ċi�[ + for (int i = 0;i < BOARD_SIZE;i++) { + if (node[i] == 0) { + this->SetStone(node, i, NextPlayer, turn); + for (int j = 0;j < BOARD_SIZE;j++) { + NextBoards[k] = node[j]; + k++; + } + node[i] = 0; + } + } + + k = 0; int best = INT_MIN; - /*for (int i = 0;i < k;i++) { - int val = this->Minmax(ai, NextTurn, (depth - 1)); - if (turn == PLAYER1 && best < val) best = val; - if (turn == PLAYER2 && best < -val)best = -val; - }*/ + NextPlayer = 1 - NextPlayer; + if (NextPlayer == PLAYER1)turn++; + for (int i = 0;i < NextNode;i++) { + for (int j = 0;j < BOARD_SIZE;j++) { + NextBoard[j] = NextBoards[k]; + k++; + } + + int val = this->Minmax(NextBoard, NextPlayer,turn, (depth - 1)); + if (NextPlayer == PLAYER1 && best < val) best = val; + if (NextPlayer == PLAYER2 && best < -val)best = -val; + } + + //���I����������� + delete[] NextBoards; return best; } @@ -155,12 +187,33 @@ } -//�@�m�[�h����i�߂� -// ����:int *Board �ǖ� -//�߂�l:��‹ǖʂ�i�߂��ǖ� -int expandnode(int *Board) +// �����z��̉”\�萔���Z�o +// �����Fint *Board ��� +//�߂�l�F�”\�萔 +int T3EBoard::count_zero(int *Board) { - return 0; + int Count=0; + + for (int i = 0; i < BOARD_SIZE; i++) { + if (Board[i] == 0)Count++; + } + + return Count; +} + +//�΂�u�� +//�����Fint *Board �ǖ�, int place�@�u���ꏊ, int NextPlayer ���u���l, int turn �^�[���� +void T3EBoard::SetStone(int *Board, int place, int NextPlayer, int Turn) { + int sign = NextPlayer == PLAYER1 ? STONE1 : STONE2; + Board[place] = Turn * sign; + + // �Â��R�}������ + if (Turn > MAX_PIECE_ON_BOARD) { + int deleting = (Turn - MAX_PIECE_ON_BOARD) * sign; + for (int i = 0; i < BOARD_SIZE; i++) { + if (Board[i] == deleting) Board[i] = 0; + } + } } // �l�Ԃ̎�� @@ -168,6 +221,22 @@ int T3EBoard::Human() { int place = 0; + int NextBoard[BOARD_SIZE]; + int NextNextPlayer; + int NextTurn = m_Turn; + + NextNextPlayer = 1 - m_NextPlayer; + if (NextNextPlayer == PLAYER1)NextTurn++; + + for (int i = 0;i < BOARD_SIZE;i++) { + if (m_Board[i] == 0) { + for (int j = 0;j < BOARD_SIZE;j++) { + NextBoard[j] = m_Board[j]; + } + SetStone(NextBoard, i, m_NextPlayer, m_Turn); + printf("�u���ꏊ[%d]�̕]���l��[%d]�ł��B", i, Minmax(NextBoard, NextNextPlayer, NextTurn, 11)); + } + } while(1) { std::cout << "0:���� 1:�� 2:�E�� 3:�� 4:���� 5:�E 6:���� 7:�� 8:�E��" << std::endl << "�ǂ��ɑł��܂����H "; diff --git a/TicTacToeEx/T3EBoard.h b/TicTacToeEx/T3EBoard.h index 3da23e1..76c0422 100644 --- a/TicTacToeEx/T3EBoard.h +++ b/TicTacToeEx/T3EBoard.h @@ -22,9 +22,10 @@ void ShowBoard(); // �Օ\�� void SetStone(int place); // �R�}��u�� int CPU(); // CPU�̎v�l - int Minmax(int *node, int turn, int depth);//Minmax�@�̎��{ + int Minmax(int *node, int NextPlayer,int turn, int depth);//Minmax�@�̎��{ int CheckWin(int *Board); // �󋵂ɂ�鏟�s�`�F�b�N - int expandnode(int *Board); // �m�[�h��i�߂� + int count_zero(int *Board); // �����z��̉”\�萔���Z�o + void SetStone(int *Board, int place, int NextPlayer, int Turn); //�R�}��u�� int Human(); // �l�Ԃ̎�� int CheckWin(); // �������� public: