Komputer gra według reguł
Kółko i krzyżyk w konsoli krok po kroku - Podstawy C++ (C++)
Kółkiem gra komputer. ruleMove sprawdza reguły po kolei, jak człowiek: jeśli może wygrać jednym ruchem, wygrywa (finishing szuka linii z dwoma jego znakami i pustym polem); jeśli przeciwnik ma dwa w linii, blokuje; potem bierze środek, róg, a na końcu bok. Gracz X gra pierwsze wolne pole ze swojej listy. W pierwszej partii komputer broni się do remisu, w drugiej sam wygrywa.
#include <iostream>
using namespace std;
// plansza: 9 pol, numer pola = wiersz * 3 + kolumna, '.' = puste
char board[9] = {'.', '.', '.', '.', '.', '.', '.', '.', '.'};
// ruch na pole index; false, gdy pole jest zajete
bool play(int index, char player) {
if (board[index] != '.') {
cout << "Pole " << index << " zajete" << endl;
return false;
}
board[index] = player;
return true;
}
// osiem linii: trzy wiersze, trzy kolumny, dwie przekatne
int lines[8][3] = {{0, 1, 2}, {3, 4, 5}, {6, 7, 8}, {0, 3, 6},
{1, 4, 7}, {2, 5, 8}, {0, 4, 8}, {2, 4, 6}};
// numer linii z trzema takimi samymi znakami albo -1
int winningLine() {
for (int i = 0; i < 8; i++) {
char a = board[lines[i][0]];
if (a != '.' && a == board[lines[i][1]] && a == board[lines[i][2]]) {
return i;
}
}
return -1;
}
bool isFull() {
for (int i = 0; i < 9; i++) {
if (board[i] == '.') {
return false;
}
}
return true;
}
// pole zwycieskiej linii w nawiasach: [X]
void printBoard() {
int line = winningLine();
for (int row = 0; row < 3; row++) {
for (int col = 0; col < 3; col++) {
int cell = row * 3 + col;
bool win = line != -1 && (lines[line][0] == cell || lines[line][1] == cell || lines[line][2] == cell);
cout << (win ? "[" : " ") << board[cell] << (win ? "]" : " ");
if (col < 2) {
cout << "|";
}
}
cout << endl;
if (row < 2) {
cout << "---+---+---" << endl;
}
}
}
void clearBoard() {
for (int i = 0; i < 9; i++) {
board[i] = '.';
}
}
void printResult(char result) {
if (result == 'R') {
cout << "Remis" << endl;
} else {
cout << "Wygrywa " << result << endl;
}
}
// gracz X gra pierwsze wolne pole ze swojej listy
int firstFree(int prefs[]) {
for (int i = 0; i < 9; i++) {
if (board[prefs[i]] == '.') {
return prefs[i];
}
}
return -1;
}
// pole, ktore konczy linie gracza who (dwa jego znaki i jedno puste), albo -1
int finishing(char who) {
for (int i = 0; i < 8; i++) {
int marks = 0;
int empty = -1;
for (int j = 0; j < 3; j++) {
int cell = lines[i][j];
if (board[cell] == who) {
marks++;
} else if (board[cell] == '.') {
empty = cell;
}
}
if (marks == 2 && empty != -1) {
return empty;
}
}
return -1;
}
// komputer (O): wygraj, zablokuj, srodek, rog, bok
int ruleMove() {
int move = finishing('O');
if (move == -1) {
move = finishing('X');
}
if (move == -1 && board[4] == '.') {
move = 4;
}
int order[8] = {0, 2, 6, 8, 1, 3, 5, 7};
for (int i = 0; i < 8 && move == -1; i++) {
if (board[order[i]] == '.') {
move = order[i];
}
}
return move;
}
// partia: X gra z listy, O to komputer; wynik 'X', 'O' albo 'R'
char playComputer(int prefs[]) {
clearBoard();
while (true) {
board[firstFree(prefs)] = 'X';
if (winningLine() != -1) {
return 'X';
}
if (isFull()) {
return 'R';
}
int move = ruleMove();
cout << "Komputer: pole " << move << endl;
board[move] = 'O';
if (winningLine() != -1) {
return 'O';
}
}
}
int main() {
int first[9] = {0, 1, 6, 5, 7, 2, 3, 4, 8};
printResult(playComputer(first));
printBoard();
cout << endl;
int second[9] = {4, 8, 3, 0, 1, 2, 5, 6, 7};
printResult(playComputer(second));
printBoard();
return 0;
}Ładowanie interaktywnego edytora... Jeśli się nie pojawi, włącz JavaScript.
Wszystkie lekcje kursu Podstawy C++·Zaloguj się, aby zapisać postęp na koncie.