# Minimax connect 4

This topic is 2377 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

## Recommended Posts

I have been programming Connect 4 using Matlab and im using the minimax algorithm and when I play it it blocks be on on the horizontals, and vertical, but when I can when using diagonals it wont block me at all and I have no reason why. Here is my code.

 function [ max ] = maxMove(BoardMax,depthMax,alphaMax,betaMax) %UNTITLED2 Summary of this function goes here % Detailed explanation goes here global bestMove; max = -inf; m = checkForWinner(BoardMax); if(m) max = m; elseif(depthMax >= 5) max = analysis(BoardMax); else %find all legal moves legalMoves = findAllLegalMoves(BoardMax); sizeOf = size(legalMoves,1); %loop through all the moves for i = 1:1:sizeOf %check for winner cMax = BoardMax; if(legalMoves(i,1) == 0) break; end cMax( legalMoves(i,1) , legalMoves(i,2) ) = 2; temp = minMove(cMax,depthMax + 1,alphaMax,betaMax); if(temp > max) max = temp; if(depthMax == 0) bestMove = [legalMoves(i,1),legalMoves(i,2)]; end end if(temp > alphaMax) alphaMax = max; end if(alphaMax > betaMax) max = alphaMax; end end end end 

 function [ min ] = minMove(BoardMin,depthMin,alphaMin,betaMin) %UNTITLED3 Summary of this function goes here % Detailed explanation goes here global bestMove;min = inf; m = checkForWinner(BoardMin); if(m) min = m; elseif(depthMin >= 5) min = analysis(BoardMin); else %find all legal moves legalMoves = findAllLegalMoves(BoardMin); sizeOf = size(legalMoves,1); %loop through all the moves for i = 1:1:sizeOf cMin = BoardMin; if(legalMoves(i,1) == 0) break; end cMin(legalMoves(i,1),legalMoves(i,2)) = 1; temp = maxMove(cMin,depthMin + 1,alphaMin,betaMin); if(temp < min) min = temp; if(depthMin == 0) bestMove = [legalMoves(i,1),legalMoves(i,2)]; end end if(temp < betaMin) betaMin = min; end if(alphaMin > betaMin) min = betaMin; end end endend 

 function [winner] = checkForWinner(Board) global bestMove; winner = 0; % check for vertical win % loop through each column for j = 1:1:7 % check for four together in that column for k = 1:1:3 % if four ones are together the human wins if((Board(k,j) == 1) && (Board(k + 1,j) == 1) && (Board(k+2,j) == 1) && (Board(k+3,j) == 1)) winner = -500000; %else if four twos are together the computer wins elseif((Board(k,j) == 2) && (Board(k + 1,j) == 2) && (Board(k+2,j) == 2) && (Board(k+3,j) == 2)) winner = 500000; end end end % check for horizontal win %loop through each row for i = 1:1:6 for k = 1:1:4 if((Board(i,k) == 1) && (Board(i,k + 1) == 1) && (Board(i,k + 2) == 1) && (Board(i,k + 3) == 1)) winner = -500000; elseif((Board(i,k) == 2) && (Board(i,k + 1) == 2) && (Board(i,k + 2) == 2) && (Board(i,k + 3) == 2)) winner = 500000; end end end % check for diagonal win left top to right down for row = 1:1:3 for column = 1:1:4 if((Board(row,column) == 1) && (Board(row + 1,column + 1) == 1) && (Board(row + 2,column + 2) == 1) && (Board(row + 3,column + 3) == 1)) winner = -500000; elseif((Board(row,column) == 2) && (Board(row + 1,column + 1) == 2) && (Board(row + 2,column + 2) == 2) && (Board(row + 3,column + 3) == 2)) winner = 500000; end end end %check for diagonal win right top to left down for row = 1:1:3 for column = 7:-1:4 if((Board(row,column) == 1) && (Board(row + 1,column - 1) == 1) && (Board(row + 2,column - 2) == 1) && (Board(row + 3,column - 3) == 1)) winner = -500000; elseif((Board(row,column) == 2) && (Board(row + 1,column - 1) == 2) && (Board(row + 2,column - 2) == 2) && (Board(row + 3,column - 3) == 2)) winner = 500000; end end end end

This still needs coded
 function [ whoWon ] = analysis(BoardAnalysis) %UNTITLED Summary of this function goes here % Detailed explanation goes here global bestMove; whoWon = 0; end 

 function [ coordinates ] = findAllLegalMoves(Board) %UNTITLED4 Summary of this function goes here % Detailed explanation goes here global bestMove; numberOfFutureMoves = 0; coordinates(numberOfFutureMoves + 1,1) = 1; coordinates(numberOfFutureMoves + 1,2) = 1; for i = 1:1:7 for j = 1:1:6 row = 0; if(j == 1) if(Board(j,i) ~= 0) break; end end if(Board(j,i) == 0) if(j == 6) row = j; break; end continue; elseif(Board(j,i) ~= 0) row = j - 1; break; end end if(row ~= 0) numberOfFutureMoves = numberOfFutureMoves + 1; coordinates(numberOfFutureMoves,1) = row; coordinates(numberOfFutureMoves,2) = i; end end coordinates(numberOfFutureMoves + 1,1) = 0; coordinates(numberOfFutureMoves + 1,2) = 0; end 

##### Share on other sites
I doubt that many people are going to be eager to debug your program for you. Especially given that Matlab is not a common language for game developers. Go back to basics, for example:

- Does it see diagonals as a legal move?
- Does it ever evaluate a configuration with diagonals?
- Force it to evaluate a known board one move away from a diagonal win. What happens?
- Test the values returned for known board configurations. Do they seem right?
- Is it evaluating win/loss conditions correctly?
- Is it performing the min/max correctly, e.g. if it finds a better configuration are variables being updated appropriately?

I don't know if Matlab has proper debugging, but printing output during execution always works.

1. 1
Rutin
29
2. 2
3. 3
4. 4
5. 5

• 13
• 13
• 11
• 10
• 13
• ### Forum Statistics

• Total Topics
632961
• Total Posts
3009482
• ### Who's Online (See full list)

There are no registered users currently online

×