实现一个函数以递归方式返回有效的获胜条件-C

时间:2018-11-26 17:50:42

标签: c function recursion

问题::我正在尝试利用recTest来检查并返回简单的Tic-Tac-Toe游戏的获胜者。

我只是不确定我需要在通话中传递什么(我突出显示的行),以及如何集成我的公共square数组。

如果这太简单了,我深表歉意。

#include<stdio.h>
#include<conio.h>



char square[10] = {'o', '1', '2', '3', '4', '5', '6', '7', '8', '9'};

// returns -1 if no v[i] satisfies p
// returns  i if v[i] satisfies p (picks largest i)
// (i>=0) and (i<n)
const int numwinpos = 8;

const int winpos[8][3] = {{1,2,3},
                          {4,5,6},
                          {7,8,9},
                          {1,4,7},
                          {2,5,8},
                          {3,6,9},
                          {1,5,9},
                          {3,5,7}};
//Function below, and variables above<--------------------------------------

int recTest(const int v[], const int n){


    if( (n>0) && (!p(v[n-1])) )
        return recTest(v,n-1);
    else
        return n-1;
}

/*int winnerCheck() {
//not even hard-coded tho...
    if (square[1] == square[2] && square[2] == square[3])
        return 1;
    else if (square[4] == square[5] && square[5] == square[6])
        return 1;
    else if (square[7] == square[8] && square[8] == square[9])
        return 1; //above 3 check across
    else if (square[1] == square[4] && square[4] == square[7])
        return 1;
    else if (square[2] == square[5] && square[5] == square[8])
        return 1;
    else if (square[3] == square[6] && square[6] == square[9])
        return 1; //above 3 check down
    else if (square[1] == square[5] && square[5] == square[9])
        return 1;
    else if (square[3] == square[5] && square[5] == square[7])
        return 1; //above 2 check diagonal
    else if (square[1] != '1' && square[2] != '2' && square[3] != '3' && square[4]
                                                                         != '4' && square[5] != '5' &&
             square[6] != '6' && square[7] != '7' && square[8]
                                                     != '8' && square[9] != '9')
        return 0;
    else
        //exit
        return -1;



}
*/

void board() {
    printf("\n\n\tTic Tac Toe\n\n");
    printf("Player 1 (X) - Player 2 (O)\n\n\n");

//prints the board after every input

    printf("    |     |    \n");
    printf("  %c |  %c  |  %c  \n", square[1], square[2],square[3]);
    printf("____|_____|____\n");
    printf("    |     |    \n");
    printf("  %c |  %c  |  %c  \n", square[4], square[5],square[6]);
    printf("____|_____|____\n");
    printf("    |     |    \n");
    printf("  %c |  %c  |  %c  \n", square[7], square[8],square[9]);
    printf("    |     |    \n");
}

int main() {

    /*
    char board[3][3] = {
    };

    printf("\t|\t|\t\n");
    printf("\t|\t|\t\n");
    printf("________|_______|________\n");
    printf("\t|\t|\t\n");
    printf("\t|\t|\t\n");
    printf("________|_______|________\n");
    printf("\t|\t|\t\n");
    printf("\t|\t|\t\n");
    printf("\t|\t|\t\n");

*/

    int player = 1, i, choice;
    char mark;
    do {
        board();
        player = player % 2 ? 1 : 2;

        printf("Player %d, enter a number: ", player);
        scanf("%d", &choice);

        //mark = (player == 1) ? 'X' : 'O';

        if (player == 1) {
            mark = 'X';
        } else {
            mark = 'O';
        }

        if (choice == 1)
            square[1] = mark;
        else if (choice == 2)
            square[2] = mark;
        else if (choice == 3)
            square[3] = mark;
        else if (choice == 4)
            square[4] = mark;
        else if (choice == 5)
            square[5] = mark;
        else if (choice == 6)
            square[6] = mark;
        else if (choice == 7)
            square[7] = mark;
        else if (choice == 8)
            square[8] = mark;
        else if (choice == 9)
            square[9] = mark;


        i = recTest(square, numwinpos);  //HERE <--------------------------------------
        player++;
    } while (i == -1);
    board();//call board

    if (i == 1)
        printf("----->\aPlayer %d WINS!<-----", --player);//nice alert sound when printed
    else
        printf("----->\aC-could it be...? Game draw!<-----");//nice alert sound when printed
    //getch();//waits for user input before ending

    return 0;
}

1 个答案:

答案 0 :(得分:0)

使用递归的一种快速而肮脏的方法是执行以下操作……是的,可以对其进行优化。

int winnerCheck(int x)
{
     if(x < numwinpos)
     {
         if((square[winpos[x][0]] == 'x') && (square[winpos[x][1]] == 'x') && (square[winpos[x][2]] == 'x') ||
            (square[winpos[x][0]] == 'o') && (square[winpos[x][1]] == 'o') && (square[winpos[x][2]] == 'o'))
             return 1; 
         else
         {
             return winnerCheck(++x);
         }
     }

     return 0;
}