در این مطلب، روش پیاده سازی بازی دوز در زبان برنامه‌نویسی «سی‌پلاس‌پلاس» (++C) آموزش داده شده است. بازی دوز که به آن ایکس-او و یا تیک تاک تو (Tic-Tac-Toe) نیز گفته می‌شود، یکی از بازی‌های محبوب دو بازیکنی است. قواعد این بازی به شرح زیر هستند:

  • بازی بین دو بازیکن انجام می‌شود (در این پیاده‌سازی، بازی بین انسان و کامپیوتر انجام می‌شود).
  • یکی از بازیکنان «O» و دیگری «X» را برای علامت‌گذاری خانه مورد نظر خود برمی‌گزیند.
  • بازی با یک بازیکن شروع می‌شود و هنگامی به پایان می‌رسد که یکی از بازیکنان بتواند یک سطر، ستون یا قطر کامل را با علامت خودش (O یا X) پر کند.
  • اگر هیچ کس برنده نشود، بازی گره خورده است (Tie).

پیاده سازی بازی دوز در ++C -- از صفر تا صد

در برنامه‌ای که کد آن در ادامه ارائه شده است، حرکات انتخاب شده توسط کامپیوتر و انسان تصادفی هستند. بنابراین، از تابع ()rand در این راستا استفاده می‌شود. این بازی توسط طرفین بازی به صورت بهینه قابل انجام نیست؛ زیرا حرکات به صورت تصادفی انتخاب می‌شوند. برنامه را می‌توان به سادگی ویرایش کرد، بنابراین هر دو بازیکنان می‌توانند به صورت بهینه بازی کنند (که در این صورت، مساله از جمله مسائل «هوش مصنوعی» (Artificial Intelligence) محسوب می‌شود). همچنین، برنامه را می‌توان به گونه‌ای ویرایش کرد که خود کاربر ورودی را وارد کند (با استفاده از ()scanf یا cin). اگر هر دو بازیکن به صورت بهینه بازی کنند، بازی گره می‌‌خورد. در واقع، فارغ از اینکه چه کسی اول بازی را آغاز کند، در صورتی که دو بازیکن حرفه‌ای با یکدیگر بازی کنند، بازی گره می‌خورد.

پیاده سازی بازی دوز در ++C

// A C++ Program to play tic-tac-toe 
  
#include<bits/stdc++.h> 
using namespace std; 
  
#define COMPUTER 1 
#define HUMAN 2 
  
#define SIDE 3 // Length of the board 
  
// Computer will move with 'O' 
// and human with 'X' 
#define COMPUTERMOVE 'O' 
#define HUMANMOVE 'X' 
  
// A function to show the current board status 
void showBoard(char board[][SIDE]) 
{ 
    printf("\n\n"); 
      
    printf("\t\t\t  %c | %c  | %c  \n", board[0][0], 
                             board[0][1], board[0][2]); 
    printf("\t\t\t--------------\n"); 
    printf("\t\t\t  %c | %c  | %c  \n", board[1][0], 
                             board[1][1], board[1][2]); 
    printf("\t\t\t--------------\n"); 
    printf("\t\t\t  %c | %c  | %c  \n\n", board[2][0], 
                             board[2][1], board[2][2]); 
   
    return; 
} 
  
// A function to show the instructions 
void showInstructions() 
{ 
    printf("\t\t\t  Tic-Tac-Toe\n\n"); 
    printf("Choose a cell numbered from 1 to 9 as below"
            " and play\n\n"); 
      
    printf("\t\t\t  1 | 2  | 3  \n"); 
    printf("\t\t\t--------------\n"); 
    printf("\t\t\t  4 | 5  | 6  \n"); 
    printf("\t\t\t--------------\n"); 
    printf("\t\t\t  7 | 8  | 9  \n\n"); 
      
    printf("-\t-\t-\t-\t-\t-\t-\t-\t-\t-\n\n"); 
  
    return; 
} 
  
  
// A function to initialise the game  
void initialise(char board[][SIDE], int moves[]) 
{ 
    // Initiate the random number generator so that  
    // the same configuration doesn't arises 
    srand(time(NULL));  
      
    // Initially the board is empty 
    for (int i=0; i<SIDE; i++) 
    { 
        for (int j=0; j<SIDE; j++) 
            board[i][j] = ' '; 
    } 
      
    // Fill the moves with numbers 
    for (int i=0; i<SIDE*SIDE; i++) 
        moves[i] = i; 
  
    // randomise the moves 
    random_shuffle(moves, moves + SIDE*SIDE); 
      
    return; 
} 
  
// A function to declare the winner of the game 
void declareWinner(int whoseTurn) 
{ 
    if (whoseTurn == COMPUTER) 
        printf("COMPUTER has won\n"); 
    else
        printf("HUMAN has won\n"); 
    return; 
} 
  
// A function that returns true if any of the row 
// is crossed with the same player's move 
bool rowCrossed(char board[][SIDE]) 
{ 
    for (int i=0; i<SIDE; i++) 
    { 
        if (board[i][0] == board[i][1] && 
            board[i][1] == board[i][2] &&  
            board[i][0] != ' ') 
            return (true); 
    } 
    return(false); 
} 
  
// A function that returns true if any of the column 
// is crossed with the same player's move 
bool columnCrossed(char board[][SIDE]) 
{ 
    for (int i=0; i<SIDE; i++) 
    { 
        if (board[0][i] == board[1][i] && 
            board[1][i] == board[2][i] &&  
            board[0][i] != ' ') 
            return (true); 
    } 
    return(false); 
} 
  
// A function that returns true if any of the diagonal 
// is crossed with the same player's move 
bool diagonalCrossed(char board[][SIDE]) 
{ 
    if (board[0][0] == board[1][1] && 
        board[1][1] == board[2][2] &&  
        board[0][0] != ' ') 
        return(true); 
          
    if (board[0][2] == board[1][1] && 
        board[1][1] == board[2][0] && 
         board[0][2] != ' ') 
        return(true); 
  
    return(false); 
} 
  
// A function that returns true if the game is over 
// else it returns a false 
bool gameOver(char board[][SIDE]) 
{ 
    return(rowCrossed(board) || columnCrossed(board) 
            || diagonalCrossed(board) ); 
} 
  
// A function to play Tic-Tac-Toe 
void playTicTacToe(int whoseTurn) 
{ 
    // A 3*3 Tic-Tac-Toe board for playing  
    char board[SIDE][SIDE]; 
      
    int moves[SIDE*SIDE]; 
      
    // Initialise the game 
    initialise(board, moves); 
      
    // Show the instructions before playing 
    showInstructions(); 
      
    int moveIndex = 0, x, y; 
      
    // Keep playing till the game is over or it is a draw 
    while (gameOver(board) == false &&  
            moveIndex != SIDE*SIDE) 
    { 
        if (whoseTurn == COMPUTER) 
        { 
            x = moves[moveIndex] / SIDE; 
            y = moves[moveIndex] % SIDE; 
            board[x][y] = COMPUTERMOVE; 
            printf("COMPUTER has put a %c in cell %d\n", 
                    COMPUTERMOVE, moves[moveIndex]+1); 
            showBoard(board); 
            moveIndex ++; 
            whoseTurn = HUMAN; 
        } 
          
        else if (whoseTurn == HUMAN) 
        { 
            x = moves[moveIndex] / SIDE; 
            y = moves[moveIndex] % SIDE; 
            board[x][y] = HUMANMOVE; 
            printf ("HUMAN has put a %c in cell %d\n", 
                    HUMANMOVE, moves[moveIndex]+1); 
            showBoard(board); 
            moveIndex ++; 
            whoseTurn = COMPUTER; 
        } 
    } 
  
    // If the game has drawn 
    if (gameOver(board) == false &&  
            moveIndex == SIDE * SIDE) 
        printf("It's a draw\n"); 
    else
    { 
        // Toggling the user to declare the actual 
        // winner 
        if (whoseTurn == COMPUTER) 
            whoseTurn = HUMAN; 
        else if (whoseTurn == HUMAN) 
            whoseTurn = COMPUTER; 
          
        // Declare the winner 
        declareWinner(whoseTurn); 
    } 
    return; 
} 
  
// Driver program 
int main() 
{ 
    // Let us play the game with COMPUTER starting first 
    playTicTacToe(COMPUTER); 
      
    return (0); 
}

خروجی قطعه کد بالا، به صورت زیر است.

                Tic-Tac-Toe

Choose a cell numbered from 1 to 9 as below and play

              1 | 2  | 3  
            --------------
              4 | 5  | 6  
            --------------
              7 | 8  | 9  

-    -    -    -    -    -    -    -    -    -

COMPUTER has put a O in cell 6


                |    |    
            --------------
                |    | O  
            --------------
                |    |    

HUMAN has put a X in cell 7


                |    |    
            --------------
                |    | O  
            --------------
              X |    |    

COMPUTER has put a O in cell 5


                |    |    
            --------------
                | O  | O  
            --------------
              X |    |    

HUMAN has put a X in cell 1


              X |    |    
            --------------
                | O  | O  
            --------------
              X |    |    

COMPUTER has put a O in cell 9


              X |    |    
            --------------
                | O  | O  
            --------------
              X |    | O  

HUMAN has put a X in cell 8


              X |    |    
            --------------
                | O  | O  
            --------------
              X | X  | O  

COMPUTER has put a O in cell 4


              X |    |    
            --------------
              O | O  | O  
            --------------
              X | X  | O  

COMPUTER has won

همانطور که پیش‌تر نیز بیان شد، اگر دو بازیکن با تجربه بازی دوز را انجام دهند، بازی همیشه گره می‌خورد. نوع دیگری از بازی دوز وجود دارد که به آن «دوز استراتژیک» (Ultimate Tic-Tac-Toe | Strategic Tic-Tac-Toe) گفته می‌شود و هدف آن ساخت یک دوز معمولی جذاب‌تر و با امکان پیش‌بینی کمتر است.

اگر نوشته بالا برای شما مفید بوده است، آموزش‌های زیر نیز به شما پیشنهاد می‌شوند:

^^

بر اساس رای ۱۴ نفر
آیا این مطلب برای شما مفید بود؟
شما قبلا رای داده‌اید!
اگر بازخوردی درباره این مطلب دارید یا پرسشی دارید که بدون پاسخ مانده است، آن را از طریق بخش نظرات مطرح کنید.

«الهام حصارکی»، فارغ‌التحصیل مقطع کارشناسی ارشد مهندسی فناوری اطلاعات، گرایش سیستم‌های اطلاعات مدیریت است. او در زمینه هوش مصنوعی و داده‌کاوی، به ویژه تحلیل شبکه‌های اجتماعی، فعالیت می‌کند.

5 نظر در “پیاده سازی بازی دوز در ++C — از صفر تا صد

نظر شما چیست؟

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *