求大神指导C语言 Readings:Chapter 6 (arrays)Problem:Write a C-program for a game of Tic-Tac-Toe that is played between 2 players.You must define your own functions in your program.Since the Tic-Tac-Toe board is like a 3×3 grid we will consider

来源:学生作业帮助网 编辑:作业帮 时间:2024/11/17 16:35:30

求大神指导C语言 Readings:Chapter 6 (arrays)Problem:Write a C-program for a game of Tic-Tac-Toe that is played between 2 players.You must define your own functions in your program.Since the Tic-Tac-Toe board is like a 3×3 grid we will consider
求大神指导C语言
Readings:Chapter 6 (arrays)
Problem:Write a C-program for a game of Tic-Tac-Toe that is played between 2 players.You must define your own functions in your program.
Since the Tic-Tac-Toe board is like a 3×3 grid we will consider this board to have 9 positions as demonstrated by the following diagram.
|---|---|---|
| 1 | 2 | 3 |
|---|---|---|
| 4 | 5 | 6 |
|---|---|---|
| 7 | 8 | 9 |
|---|---|---|
Each player in turn places their symbol (an O or an X) on one of the 9 positions (by inputting in turn their choice of position).The game ends when one of the players places three O's or X's in a line (horizontal/vertical/diagonal) OR when all positions have been filled and neither player managed to place three O's or X's in a line (a draw).Player O goes first,and game board should be displayed at the end of each round (i.e.after a player places their symbol).
BONUS 2% may be scored by adding the following:
For the tic-tac-toe game
->Represent the board using a two-dimensional array
->Add the option of playing against the computer.Computer plays by randomly placing its marker on the board,i.e.involves no AI.
题目要求是用array 还有需要一个main function 和另外一个解决问题的function

求大神指导C语言 Readings:Chapter 6 (arrays)Problem:Write a C-program for a game of Tic-Tac-Toe that is played between 2 players.You must define your own functions in your program.Since the Tic-Tac-Toe board is like a 3×3 grid we will consider

完整答案来了,自己写的,二维数组、对战、对ai都有,编译后,运行时带参数 pvaio表示ai用o(即ai先走),参数pvaie表示ai用x(人先走),参数pvp或不带参数表示人人对战,具体的自己看代码.

#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <string.h>

#define TTT_FREE    0
#define TTT_O       1
#define TTT_X       2
#define TTT_TIE     3

/* 0:正常,1:O胜,2:X胜,3:平 */
int check_board(char board[3][3])
{
    if(board[0][0] != TTT_FREE && board[0][0] == board[0][1] && board[0][0] == board[0][2])
        return (board[0][0] == TTT_O)? TTT_O: TTT_X;
    if(board[1][0] != TTT_FREE && board[1][0] == board[1][1] && board[1][0] == board[1][2])
        return (board[1][0] == TTT_O)? TTT_O: TTT_X;
    if(board[2][0] != TTT_FREE && board[2][0] == board[2][1] && board[2][0] == board[2][2])
        return (board[2][0] == TTT_O)? TTT_O: TTT_X;
    if(board[0][0] != TTT_FREE && board[0][0] == board[1][0] && board[0][0] == board[2][0])
        return (board[0][0] == TTT_O)? TTT_O: TTT_X;
    if(board[0][1] != TTT_FREE && board[0][1] == board[1][1] && board[0][1] == board[2][1])
        return (board[0][1] == TTT_O)? TTT_O: TTT_X;
    if(board[0][2] != TTT_FREE && board[0][2] == board[1][2] && board[0][2] == board[2][2])
        return (board[0][2] == TTT_O)? TTT_O: TTT_X;
    if(board[0][0] != TTT_FREE && board[0][0] == board[1][1] && board[0][0] == board[2][2])
        return (board[0][0] == TTT_O)? TTT_O: TTT_X;
    if(board[0][2] != TTT_FREE && board[0][2] == board[1][1] && board[0][2] == board[2][0])
        return (board[0][2] == TTT_O)? TTT_O: TTT_X;
    int i,j;
    for(i=0; i<3; i++){
        for(j=0; j<3; j++){
            if(board[i][j] == TTT_FREE)
                return TTT_FREE;
        }   
    }   
    return TTT_TIE;
}
* 0:ok, 1:out of boundary 2:pos already in use */
int check_pos(char board[3][3], int pos)
{
    if(pos > 9 || pos < 0)
        return 1;
    if(board[(pos-1)/3][(pos-1)%3] != TTT_FREE)
        return 2;
    return 0;
}
void print_board(char board[3][3]){
    int i;
    for(i=0; i<3; i++){
        printf("%c %c %c\t%d %d %d\n",
                (board[i][0] == TTT_FREE)? '#': ((board[i][0] == TTT_O)? 'O': 'X'),
                (board[i][1] == TTT_FREE)? '#': ((board[i][1] == TTT_O)? 'O': 'X'),
                (board[i][2] == TTT_FREE)? '#': ((board[i][2] == TTT_O)? 'O': 'X'),
                i*3+1, i*3+2, i*3+3);
    }
}
void ttt_start(int ai_player)
{
    char board[3][3] = {0};
    int cur_player = TTT_O;
    print_board(board);
    while(1){
        int pos, ret;
        if(ai_player != TTT_FREE && ai_player == cur_player){
            srand(time(NULL));
            while(1){
                pos = rand()%9 + 1;
                if(check_pos(board, pos) == 0)
                    break;
            }
            printf("    %s(AI)  >>> %d\n", (ai_player == TTT_O)? "O": "X", pos);
        } else {
            printf("    %s      >>> ", (cur_player == TTT_O)? "O": "X");
            fflush(stdout);
            scanf("%d", &pos);
            if(check_pos(board, pos)){
                printf("    err input, try again\n");
                fflush(stdin);
                continue;
            }
        }
        board[(pos-1)/3][(pos-1)%3] = cur_player;
        ret = check_board(board);
        print_board(board);
        if(ret != TTT_FREE){
            if(ret == TTT_TIE){
                printf("Game over, Tie\n");
            } else {
                printf("Game over, %s%s win\n", (ret==TTT_O)? "O": "X", (ai_player == ret)? "(AI)": "");
            }
            break;
        }
        cur_player = (cur_player == TTT_O)? TTT_X: TTT_O;
    }
}
int main(int argc, char *argv[])
{
    int ai_player = TTT_FREE;
    if(argv[1]){
        if(!strcasecmp(argv[1], "PvP")){
            ai_player = TTT_FREE;
        } else if(!strcasecmp(argv[1], "PvAIO")){
            ai_player = TTT_O;
        } else if(!strcasecmp(argv[1], "PvAIX")){
            ai_player = TTT_X;
        } else {
            printf("Usage: exefile [PvP | PvAIO | PvAIX]\n");
            return -1;
        }
    }
    ttt_start(ai_player);
    return 0;
}