پیاده سازی بازی دوز در ++C — از صفر تا صد
در این مطلب، روش پیاده سازی بازی دوز در زبان برنامهنویسی «سیپلاسپلاس» (++C) آموزش داده شده است. بازی دوز که به آن ایکس-او و یا تیک تاک تو (Tic-Tac-Toe) نیز گفته میشود، یکی از بازیهای محبوب دو بازیکنی است. قواعد این بازی به شرح زیر هستند:
- بازی بین دو بازیکن انجام میشود (در این پیادهسازی، بازی بین انسان و کامپیوتر انجام میشود).
- یکی از بازیکنان «O» و دیگری «X» را برای علامتگذاری خانه مورد نظر خود برمیگزیند.
- بازی با یک بازیکن شروع میشود و هنگامی به پایان میرسد که یکی از بازیکنان بتواند یک سطر، ستون یا قطر کامل را با علامت خودش (O یا X) پر کند.
- اگر هیچ کس برنده نشود، بازی گره خورده است (Tie).
در برنامهای که کد آن در ادامه ارائه شده است، حرکات انتخاب شده توسط کامپیوتر و انسان تصادفی هستند. بنابراین، از تابع ()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) گفته میشود و هدف آن ساخت یک دوز معمولی جذابتر و با امکان پیشبینی کمتر است.
اگر نوشته بالا برای شما مفید بوده است، آموزشهای زیر نیز به شما پیشنهاد میشوند:
- مجموعه آموزشهای برنامهنویسی
- آموزش برنامهنویسی C++
- مجموعه آموزشهای ریاضیات
- یافتن دور همیلتونی با الگوریتم پس گرد — به زبان ساده
- الگوریتم بازی مار و پله همراه با کد — به زبان ساده
- حل مساله n وزیر با الگوریتم پسگرد (Backtracking) — به زبان ساده
- الگوریتم جست و جوی دودویی در جاوا اسکریپت — به زبان ساده
^^
سلام وقت بخیر ببخشید برای بازی دونفره یا بازی با کامپیوتر چکار باید بکنیم کدش چیه؟؟
تو این کد چطوری ورودیه کد رو خودمون وارد کنیم بازی جوری شه که cin شماره رو خودمون وارد کنیم
تو این کد بالا اکه بخایم عدد ها رو خودمون وارد کنیم یعنی دو نفر بازی کند چ باس کرد ؟؟
برای من اجرا نمیشه و چند اخطار برایprints زده
با سلام؛
از همراهی شما با مجله فرادرس و ارائه بازخورد سپاسگزاریم. لطفا، عنوان خطا را در پاسخ به این دیدگاه ارسال کنید تا امکان راهنمایی بهتر فراهم شود.
پیروز، شاد و تندرست باشید.