I have this code that is supposed to play connect 4. The problem is that it hangs almost right away. Nothing ever get printed to the board. Can anyone help?

Code:#include <stdio.h> #include <stdlib.h> #include <curses.h> #define BOARDROW 7 #define BOARDCOLUMN 7 #define pos_infinity 50000 #define neg_infinity -50000 #define MAX 1 #define MIN 0 int changeboard(int oldboard[BOARDROW][BOARDCOLUMN],int newboard[BOARDROW][BOARDCOLUMN], int position, int player) { int i, j; // Initialize the newboard for(i = 0; i < BOARDROW; i++) for(j = 0; j < BOARDCOLUMN; j++) newboard[i][j] = oldboard[i][j]; i = 1; // Check if the column is full if (newboard[BOARDROW - i][position] != 0) return(0); else { // Drop the piece down the column while ((newboard[BOARDROW - i][position] == 0) && (i >= BOARDROW)) i++; newboard[BOARDROW -i + 1][position] = player; } return(1); } int key(int number, int number2, int of, int obf, int ob, int obb, int m, int mb, int player, int computer, int direction) { if (direction == 2) { if (number >= 4) return(pos_infinity); else if ((number == 3) && (obf >= 1)) { return(600); } else return(0); } else if (number2 > 0) { if ((number2 >=4) || (number >= 4)) return(pos_infinity); if ((number2 + number) >= 3) { if (obf == 1) { return(700); } else if (of == 1) return(600); else if (obf == 2) return(100); else if ((ob == 2) && (mb > 0) && (obb > 0)) return(20); else return(10); } else if ((number2 + number) == 2) { if ((obf == 1) && (mb > 0) && (obb > 0)) return(100); else if ((obf == 1) && ((mb > 0) || (obb > 0))) return(80); else if ((obf == 1) && ((m > 0) || (ob > 0))) return(20); else if ((of == 1) && (mb > 0) && (obb > 0)) return(20); else if ((of == 1) && ((mb > 0) || (obb > 0))) return(10); else if ((of == 1) && ((m > 0) || (ob > 0))) return(5); else if (of == 1) return(0); else if (obf == 2) return(25); else if ((ob == 2) && (mb > 0) && (obb > 0)) return(5); else return(0); } else return(0); } if (number >= 4) return(pos_infinity); else if ((of == 0) && (ob == 0)) return(0); else if (number == 3) { if ((obb > 0) && (obf > 0)) return(3000); else return(600); } else if (number == 2) { if ((ob + of) < 2) return(0); else if ((obb > 1) && (obf > 1)) return(100); else if (((obb > 1) || (obf > 1)) && (((ob > 1) && (obb > 1)) || ((of > 1) && (obf > 1)))) return(50); else if (((obb > 0) || (obf > 0)) && (((ob > 1) && (obb > 0)) || ((of > 1) && (obf > 0)))) return(40); else if ((obb > 0) || (obf > 0)) return(20); else if ((of > 1) && (ob > 1)) return(10); else if ((of > 1) || (ob > 1)) return(5); else if ((of > 0) || (ob > 0)) return (3); else return(2); } else if (number == 1) { if ((ob + of) < 3) return(0); else if ((obb > 1) && (obf > 1)) return(10); else return(0); } player = player + 1; computer = computer + 1; return(0); } int analyze(int i, int j, int computer, int plyr, int EMPTY, int *of, int *ob, int *whos, int *obf, int *obb1, int *obb2, int *lastpiece, int *number, int *number2, int *compscore, int *plyrscore, int *m, int *mb, int board[BOARDROW][BOARDCOLUMN], int direction) { int newscore; if (board[i][j] == EMPTY) // checks if position is empty { if (((i == 0) || (board[i-1][j] != EMPTY)) && (*obb1 == *ob)) (*obb1)++; // Check if the position underneath is occupied and increment paramters else if ((i == 0) || (board[i-1][j] != EMPTY)) (*obb2)++; else *obb2 = 0; *ob = *ob + 1; *lastpiece = EMPTY; } else if (board[i][j] == computer) // If the position is occupied by computer piece { if (*lastpiece == computer) (*number)++; // If the last piece was computer increment number in sequence else if (*lastpiece == plyr) // If the last piece was players find score for player sequence and reinitalize parameters { newscore = key(*number,*number2,*of,*obf, 0,0, *m, *mb, plyr, computer, direction); if (newscore == pos_infinity) return(neg_infinity); else { *plyrscore = *plyrscore + newscore; *number = 1; *of = 0; *obf = 0; *ob = 0; *obb1 = 0; *obb2 = 0; *whos = computer; *lastpiece = computer; *m = 0; *mb = 0; *number2 = 0; } } /* If the last piece was empty and the last sequence was players then find the score for plyr sequence. If the last sequence was computers then there are middle positions empty bewteen the sequence.*/ else if (*lastpiece == EMPTY) { if (*whos == computer) { if (*number2 > 0) { newscore = key(*number,*number2, *of,*obf, *ob, *obb1, *m, *mb, computer, computer, direction); if (newscore == pos_infinity) return(pos_infinity); else *compscore = *compscore + newscore; *number2= 0; *m = 0; *mb = 0; } else { *number2 = *number; *m = *of; *mb = *obf; } } else if (*whos == plyr) { newscore = key(*number,*number2, *of,*obf, *ob, *obb1, *m, *mb, plyr, computer, direction); if (newscore == pos_infinity) return(neg_infinity); else *plyrscore = *plyrscore + newscore; *m = 0; *mb = 0; *number2 = 0; } *of = *ob; if (*ob == *obb1) *obf = *obb1; else *obf = *obb2; *obb1 = 0; *obb2 = 0; *ob = 0; *lastpiece = computer; *number = 1; *whos = computer; } } else if (board[i][j] == plyr) // If the position is occupied by player piece { // If the last piece was players then update the number in the sequence if (*lastpiece == plyr) (*number)++; // If the last piece was computers find score for computer sequence. else if (*lastpiece == computer) { newscore = key(*number,*number2, *of,*obf, 0,0, *m, *mb, computer, computer, direction); if (newscore == pos_infinity) return(pos_infinity); else { *compscore = *compscore + newscore; *number = 1; *of = 0; *obf = 0; *ob = 0; *obb1 = 0; *obb2 = 0; *whos = plyr; *lastpiece = plyr; *mb = 0; *m = 0; *number2 = 0; } } // If the last piece was empty if the last sequence was computers then find the // score for computer sequence and initialize parameters. If the last sequence // was players then there are middle positions empty bewteen the sequence. else if (*lastpiece == EMPTY) { if (*whos == plyr) { if (*number2 > 0) { newscore = key(*number,*number2,*of,*obf, *ob, *obb1, *m, *mb, plyr, computer, direction); if (newscore == pos_infinity) return(neg_infinity); else *plyrscore = *plyrscore + newscore; *number2 = 0; *m = 0; *mb = 0; } else { *number2 = *number; *m = *of; *mb = *obf; } } else if (*whos == computer) { newscore = key(*number,*number2, *of,*obf, *ob, *obb1, *m, *mb, computer, computer, direction); if (newscore == pos_infinity) return(pos_infinity); else *compscore = *compscore + newscore; *number2 = 0; *m = 0; *mb = 0; } *of = *ob; if (*ob == *obb1) *obf = *obb1; else *obf = *obb2; *obb1 = 0; *obb2 = 0; *ob = 0; *lastpiece = plyr; *whos = plyr; *number = 1; } } return(0); } int score_direction(int board[BOARDROW][BOARDCOLUMN], int computer, int plyr, int EMPTY, int direction) { int k,i,j; int compscore=0; // Score of computer positions on board int plyrscore=0; // Score of player positions on board int number; // Number of consecutive pieces of board int number2; // If spaces seperate two sequences of one kind of pieces this will contain the first number of pieces */ int lastpiece; // The last piece visited int whos; // Was the last sequence of pieces computers or players? int of; // Number of open spaces in front of a sequence of pieces int ob; // Number of open spaces in behind of a sequence of pieces int obf; // Number of open spaces in front of a sequence that have pieces underneath them */ int obb1; // Number of open spaces in behind of a sequence that have pieces underneath them */ int obb2; // Same as above, but to be able to keep data on two sequencs int m; // Number of open spaces bewteen two sequences of the same player int mb; // Number of open spaces bewteen two sequences of the same player with pieces underneath them int check; // Check for return of pos_infinity int newscore; // The score of a sequence of pieces on the board for (k = 0; k < 7; k++) // Go through the lines of the board { if (direction == 1) // If checking horizontal each line starts at (k,0) { i = k; j = 0; } else if (direction == 2) // If checking horizontal each line starts at (0,k) { j = k; i = 0; } else if (direction == 3) // If checking diagonally we have to go through the cases { switch(k) { case 0: i = 0; j = 3; break; case 1: i = 0; j = 2; break; case 2: i = 0; j = 1; break; case 3: i = 0; j = 0; break; case 4: i = 1; j = 0; break; case 5: i = 2; j = 0; break; case 6: i = -1; j = -1; break; } } else if (direction == 4) // If checking diagonally we have to go through the cases { switch(k) { case 0: i = 0; j = 3; break; case 1: i = 0; j = 4; break; case 2: i = 0; j = 5; break; case 3: i = 0; j = 6; break; case 4: i = 1; j = 6; break; case 5: i = 2; j = 6; break; case 6: i = -1; j = -1; break; } } // Initialize varibales each time through the loop m = 0; mb = 0; ob = 0; of = 0; obf = 0; obb1 = 0; obb2 = 0; number = 0; number2 = 0; whos = EMPTY; lastpiece = EMPTY; while ((j < BOARDCOLUMN) && (i < BOARDROW) && (i >= 0) && (j >= 0)) //go through until outside the board { check = analyze(i,j,computer,plyr,EMPTY,&of,&ob,&whos,&obf, &obb1,&obb2,&lastpiece,&number,&number2, &compscore,&plyrscore,&m,&mb,board, direction); if ((check == pos_infinity) || (check == neg_infinity)) //this returns a win or loss after the check return(check); else { if (direction == 1) //move on to next piece j++; else if (direction == 2) i++; else if (direction == 3) { i++; j++; } else if (direction == 4) { i++; j--; } } } // When finished getting the score for one line of the last sequence of dropped pieces, add the score to the correct player's score if (whos == computer) { newscore = key(number,number2,of,obf,ob,obb1,m,mb,computer,computer, direction); if (newscore == pos_infinity) return(pos_infinity); compscore = compscore + newscore; } else { newscore = key(number,number2,of,obf,ob,obb1,m,mb,plyr,computer, direction); if (newscore == pos_infinity) return(neg_infinity); plyrscore = plyrscore + newscore; } } return(compscore - plyrscore); //returns the total score } int score(int board[BOARDROW][BOARDCOLUMN], int computer, int plyr, int EMPTY) { int horiz; // horizontal score int vert; //vertical score int diag1; //diagonal score int diag2; //other diagonal score // checks the score returns the score for each direction horiz = score_direction(board, computer, plyr, EMPTY,1); if ((horiz == pos_infinity) || (horiz == neg_infinity)) return(horiz); vert = score_direction(board, computer, plyr, EMPTY, 2); if ((vert == pos_infinity) || (vert == neg_infinity)) return(vert); diag1 = score_direction(board, computer, plyr, EMPTY,3); if ((diag1 == pos_infinity) || (diag1 == neg_infinity)) return(diag1); diag2 = score_direction(board, computer, plyr, EMPTY,4); if ((diag2 == pos_infinity) || (diag2 == neg_infinity)) return(diag2); return(horiz + vert + diag1 + diag2); //total score } int quickcheck(int board[BOARDROW][BOARDCOLUMN], int computer, int plyr, int EMPTY) { int scoreboard; scoreboard = score(board, computer, plyr, EMPTY); //score of the board if ((scoreboard == pos_infinity) || (scoreboard == neg_infinity)) //tells if someone has won return(scoreboard); else return(0); } int minimaxAB(int computer, int plyr, int EMPTY, int depth, int max_depth, int min_or_max, int board[BOARDROW][BOARDCOLUMN], int A, int B, int *position, int player) { int alpha; int newalpha; //alpha of child node int beta; int newbeta; //beta of child node int newboard[BOARDROW][BOARDCOLUMN]; //creates a new board with new piece dropped int i; int legal; //checks if move is legal. i.e. if the space is empty or not int finished; //reached a leaf node with a win or loss int newposition; //best score position for child nodes if (depth == max_depth) //if max depth is reached, get the score return(score(board, computer, plyr, EMPTY)); else { finished = quickcheck(board, computer, plyr, EMPTY); //checks for win or loss if ((finished == pos_infinity) || (finished == neg_infinity)) return(finished); alpha = A; beta = B; if (min_or_max == MIN) //looks to see if node is a max or a min { for (i = 0; i < BOARDCOLUMN; i++) { legal = changeboard(board, newboard, i, player); if (legal) { newbeta = minimaxAB(computer, plyr, EMPTY, depth + 1, max_depth, MAX, newboard, alpha, beta, &newposition, -player); if (newbeta < beta) //if beta score of child is < beta score of parent, change parent beta and record the position { beta = newbeta; *position = i; } if (alpha >= beta) //if alpha > beta, prune return(alpha); } } return(beta); //returns the min score of child beta } else { for(i = 0; i < BOARDCOLUMN; i++) { legal = changeboard(board, newboard, i, player); if (legal) { newalpha = minimaxAB(computer, plyr, EMPTY, depth + 1, max_depth, MIN, newboard, alpha, beta, &newposition, -player); if (newalpha > alpha) // if alpha score of child > parent alpha, change parent alpha and record the position { alpha = newalpha; *position = i; } if (alpha >= beta) //if alpha > beta, prune return(beta); } } return(alpha); //return max score of child alpha } } } int play(int computer, int plyr, int EMPTY, int previousColumn, int board[BOARDROW][BOARDCOLUMN]) { int position=-1; int score; int k; if (previousColumn == -1) //returns the middle of the board on the first move of the game position =3; else { score = minimaxAB(computer, plyr, EMPTY, 0, 1, MAX, board, neg_infinity, pos_infinity, &position, computer); //checks for the win if (score == pos_infinity) return(position); else position = -1; minimaxAB(computer, plyr, EMPTY, 0, 5, MAX, board, neg_infinity, pos_infinity, &position, computer); //looks ahead 5 moves using alphabeta if (position == -1) //finds move to avoid a quick loss { minimaxAB(computer, plyr, EMPTY, 0, 4, MAX, board, neg_infinity, pos_infinity, &position, computer); } if (position == -1) { minimaxAB(computer, plyr, EMPTY, 0, 3, MAX, board, neg_infinity, pos_infinity, &position, computer); } if (position == -1) { minimaxAB(computer, plyr, EMPTY, 0, 2, MAX, board, neg_infinity, pos_infinity, &position, computer); } if (position == -1) { minimaxAB(computer, plyr, EMPTY, 0, 1, MAX, board, neg_infinity, pos_infinity, &position, computer); } if (position == -1) { for (k=0; position == -1; k++) { if (board[BOARDROW-1][k] == EMPTY) // checks for valid column position = k; //chooses a column with empty space } } } return(position); } int new_board(int board[BOARDROW][BOARDCOLUMN], int position, int player) { int i; i = 1; if (board[BOARDROW - i][position] != 0) //checks to see if column is full return(0); else { while ((board[BOARDROW - i][position] == 0) && (i >= BOARDROW)) //put piece in column i++; board[BOARDROW -i + 1][position] = player; } return(1); } void drawboard(int board[BOARDROW][BOARDCOLUMN]) { int i; int j; system("clear"); printf(" 1 2 3 4 5 6 7\n"); for (i = BOARDROW - 1; i >= 0; i--) { printf("| "); for (j = 0; j < BOARDCOLUMN; j++) { if (board[i][j] == -1) printf("O"); else if (board[i][j] == 1) printf("X"); else printf(" "); printf(" | "); } printf("\n"); } } int ask(int board[BOARDROW][BOARDCOLUMN], int plyr) { int answer; int i; int correct = 1; int legal; char buffer[8]; do { printf("Pick a column to drop a piece: "); i = scanf("%i", &answer); if (i != 1) { printf("You must enter an integer!\n"); correct = 0; scanf("%s", buffer); } else if ((answer > BOARDCOLUMN) || (answer <= 0)) { printf("You must enter an integer bewteen 1 and 7\n"); correct = 0; } else { correct = 1; answer = answer - 1; legal = new_board(board,answer,plyr); if (legal == 0) { printf("That column is full! Please try again\n"); correct = 0; } } }while (correct == 0); return(answer); } int isfull(int board[BOARDROW][BOARDCOLUMN], int EMPTY) { int j; for (j = 0; j < BOARDCOLUMN; j++) if (board[BOARDROW - 1][j] == EMPTY) return(0); return(1); } int main() { static int board[BOARDROW][BOARDCOLUMN] = {0,0,0,0,0,0,0, 0,0,0,0,0,0,0, 0,0,0,0,0,0,0, 0,0,0,0,0,0,0, 0,0,0,0,0,0,0, 0,0,0,0,0,0,0, 0,0,0,0,0,0,0}; int start; int ok; int correct = 1; int computer; int plyr; int EMPTY; int qcheck; int legal; int comploss=0; char buffer[8]; int position; system("clear"); do { printf("If you want the computer to go first, enter -1; if you want to go first, enter 1: "); ok = scanf("%i", &start); if (ok != 1) { printf("You must enter an integer!\n"); correct = 0; ok = scanf("%s", buffer); } else if ((start != 1) && (start != -1)) { printf("You must enter 1 or -1\n"); correct = 0; } else correct = 1; }while (correct == 0); if (start == 1) { plyr = 1; computer = -1; EMPTY = 0; } else { plyr = -1; computer = 1; EMPTY = 0; position = play(computer, plyr, EMPTY, -1, board); new_board(board, position, computer); } do { drawboard(board); ask(board, plyr); position = play(computer, plyr, EMPTY, 3, board); legal = new_board(board, position, computer); if (!legal) { comploss = 1; break; } qcheck = quickcheck(board, computer, plyr, EMPTY); }while((!isfull(board,EMPTY)) && (qcheck != neg_infinity) && (qcheck != pos_infinity)); drawboard(board); if (comploss == 1) printf("\nIllegal move! Computer loses!\n"); else if (isfull(board, EMPTY)) printf("\nThe game is a tie\n"); else if (qcheck == neg_infinity) printf("\nYou won the game\n"); else printf("\nSorry, you lose the game\n"); return(0); }