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

۳۶۵۹ بازدید
آخرین به‌روزرسانی: ۱۹ تیر ۱۴۰۲
زمان مطالعه: ۴ دقیقه
پیاده سازی بازی دوز در ++C — از صفر تا صد

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

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

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

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

همچنین، برنامه را می‌توان به گونه‌ای ویرایش کرد که خود کاربر ورودی را وارد کند (با استفاده از ()scanf یا cin). اگر هر دو بازیکن به صورت بهینه بازی کنند، بازی گره می‌‌خورد. در واقع، فارغ از اینکه چه کسی اول بازی را آغاز کند، در صورتی که دو بازیکن حرفه‌ای با یکدیگر بازی کنند، بازی گره می‌خورد.

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

1// A C++ Program to play tic-tac-toe 
2  
3#include<bits/stdc++.h> 
4using namespace std; 
5  
6#define COMPUTER 1 
7#define HUMAN 2 
8  
9#define SIDE 3 // Length of the board 
10  
11// Computer will move with 'O' 
12// and human with 'X' 
13#define COMPUTERMOVE 'O' 
14#define HUMANMOVE 'X' 
15  
16// A function to show the current board status 
17void showBoard(char board[][SIDE]) 
18{ 
19    printf("\n\n"); 
20      
21    printf("\t\t\t  %c | %c  | %c  \n", board[0][0], 
22                             board[0][1], board[0][2]); 
23    printf("\t\t\t--------------\n"); 
24    printf("\t\t\t  %c | %c  | %c  \n", board[1][0], 
25                             board[1][1], board[1][2]); 
26    printf("\t\t\t--------------\n"); 
27    printf("\t\t\t  %c | %c  | %c  \n\n", board[2][0], 
28                             board[2][1], board[2][2]); 
29   
30    return; 
31} 
32  
33// A function to show the instructions 
34void showInstructions() 
35{ 
36    printf("\t\t\t  Tic-Tac-Toe\n\n"); 
37    printf("Choose a cell numbered from 1 to 9 as below"
38            " and play\n\n"); 
39      
40    printf("\t\t\t  1 | 2  | 3  \n"); 
41    printf("\t\t\t--------------\n"); 
42    printf("\t\t\t  4 | 5  | 6  \n"); 
43    printf("\t\t\t--------------\n"); 
44    printf("\t\t\t  7 | 8  | 9  \n\n"); 
45      
46    printf("-\t-\t-\t-\t-\t-\t-\t-\t-\t-\n\n"); 
47  
48    return; 
49} 
50  
51  
52// A function to initialise the game  
53void initialise(char board[][SIDE], int moves[]) 
54{ 
55    // Initiate the random number generator so that  
56    // the same configuration doesn't arises 
57    srand(time(NULL));  
58      
59    // Initially the board is empty 
60    for (int i=0; i<SIDE; i++) 
61    { 
62        for (int j=0; j<SIDE; j++) 
63            board[i][j] = ' '; 
64    } 
65      
66    // Fill the moves with numbers 
67    for (int i=0; i<SIDE*SIDE; i++) 
68        moves[i] = i; 
69  
70    // randomise the moves 
71    random_shuffle(moves, moves + SIDE*SIDE); 
72      
73    return; 
74} 
75  
76// A function to declare the winner of the game 
77void declareWinner(int whoseTurn) 
78{ 
79    if (whoseTurn == COMPUTER) 
80        printf("COMPUTER has won\n"); 
81    else
82        printf("HUMAN has won\n"); 
83    return; 
84} 
85  
86// A function that returns true if any of the row 
87// is crossed with the same player's move 
88bool rowCrossed(char board[][SIDE]) 
89{ 
90    for (int i=0; i<SIDE; i++) 
91    { 
92        if (board[i][0] == board[i][1] && 
93            board[i][1] == board[i][2] &&  
94            board[i][0] != ' ') 
95            return (true); 
96    } 
97    return(false); 
98} 
99  
100// A function that returns true if any of the column 
101// is crossed with the same player's move 
102bool columnCrossed(char board[][SIDE]) 
103{ 
104    for (int i=0; i<SIDE; i++) 
105    { 
106        if (board[0][i] == board[1][i] && 
107            board[1][i] == board[2][i] &&  
108            board[0][i] != ' ') 
109            return (true); 
110    } 
111    return(false); 
112} 
113  
114// A function that returns true if any of the diagonal 
115// is crossed with the same player's move 
116bool diagonalCrossed(char board[][SIDE]) 
117{ 
118    if (board[0][0] == board[1][1] && 
119        board[1][1] == board[2][2] &&  
120        board[0][0] != ' ') 
121        return(true); 
122          
123    if (board[0][2] == board[1][1] && 
124        board[1][1] == board[2][0] && 
125         board[0][2] != ' ') 
126        return(true); 
127  
128    return(false); 
129} 
130  
131// A function that returns true if the game is over 
132// else it returns a false 
133bool gameOver(char board[][SIDE]) 
134{ 
135    return(rowCrossed(board) || columnCrossed(board) 
136            || diagonalCrossed(board) ); 
137} 
138  
139// A function to play Tic-Tac-Toe 
140void playTicTacToe(int whoseTurn) 
141{ 
142    // A 3*3 Tic-Tac-Toe board for playing  
143    char board[SIDE][SIDE]; 
144      
145    int moves[SIDE*SIDE]; 
146      
147    // Initialise the game 
148    initialise(board, moves); 
149      
150    // Show the instructions before playing 
151    showInstructions(); 
152      
153    int moveIndex = 0, x, y; 
154      
155    // Keep playing till the game is over or it is a draw 
156    while (gameOver(board) == false &&  
157            moveIndex != SIDE*SIDE) 
158    { 
159        if (whoseTurn == COMPUTER) 
160        { 
161            x = moves[moveIndex] / SIDE; 
162            y = moves[moveIndex] % SIDE; 
163            board[x][y] = COMPUTERMOVE; 
164            printf("COMPUTER has put a %c in cell %d\n", 
165                    COMPUTERMOVE, moves[moveIndex]+1); 
166            showBoard(board); 
167            moveIndex ++; 
168            whoseTurn = HUMAN; 
169        } 
170          
171        else if (whoseTurn == HUMAN) 
172        { 
173            x = moves[moveIndex] / SIDE; 
174            y = moves[moveIndex] % SIDE; 
175            board[x][y] = HUMANMOVE; 
176            printf ("HUMAN has put a %c in cell %d\n", 
177                    HUMANMOVE, moves[moveIndex]+1); 
178            showBoard(board); 
179            moveIndex ++; 
180            whoseTurn = COMPUTER; 
181        } 
182    } 
183  
184    // If the game has drawn 
185    if (gameOver(board) == false &&  
186            moveIndex == SIDE * SIDE) 
187        printf("It's a draw\n"); 
188    else
189    { 
190        // Toggling the user to declare the actual 
191        // winner 
192        if (whoseTurn == COMPUTER) 
193            whoseTurn = HUMAN; 
194        else if (whoseTurn == HUMAN) 
195            whoseTurn = COMPUTER; 
196          
197        // Declare the winner 
198        declareWinner(whoseTurn); 
199    } 
200    return; 
201} 
202  
203// Driver program 
204int main() 
205{ 
206    // Let us play the game with COMPUTER starting first 
207    playTicTacToe(COMPUTER); 
208      
209    return (0); 
210}

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

                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) گفته می‌شود و هدف آن ساخت یک دوز معمولی جذاب‌تر و با امکان پیش‌بینی کمتر است.

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

^^

بر اساس رای ۱۸ نفر
آیا این مطلب برای شما مفید بود؟
اگر بازخوردی درباره این مطلب دارید یا پرسشی دارید که بدون پاسخ مانده است، آن را از طریق بخش نظرات مطرح کنید.
منابع:
GeeksforGeeks
۵ دیدگاه برای «پیاده سازی بازی دوز در ++C — از صفر تا صد»

سلام وقت بخیر ببخشید برای بازی دونفره یا بازی با کامپیوتر چکار باید بکنیم کدش چیه؟؟

تو این کد چطوری ورودیه کد رو خودمون وارد کنیم بازی جوری شه که cin شماره رو خودمون وارد کنیم

تو این کد بالا اکه بخایم عدد ها رو خودمون وارد کنیم یعنی دو نفر بازی کند چ باس کرد ؟؟

برای من اجرا نمیشه و چند اخطار برایprints زده

با سلام؛

از همراهی شما با مجله فرادرس و ارائه بازخورد سپاس‌گزاریم. لطفا، عنوان خطا را در پاسخ به این دیدگاه ارسال کنید تا امکان راهنمایی بهتر فراهم شود.

پیروز، شاد و تندرست باشید.

نظر شما چیست؟

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