Po każdym ruchu dwa wyświetlające się zbiory powinny być równe natomiast w drugim pojawia się jedna dodatkowa liczba i nie wiem skąd. Program polega na grze w kółko i krzyżyk
plik gra.cpp
#include "gra.h"
#include <random>
#include <iostream>
#include <conio.h>
#include <Windows.h>
using namespace std;
bool Game::czy_potrzebna_analiza(){
if (przewidywana.size() <= obecna.size())
return true;
for (auto i = obecna.begin(), j = przewidywana.begin(); i != obecna.end(); i++, j++)
if (*i != *j)
return true;
return false;
}
void Game::przewidywany_ruch(vector<vector<char>> tablica, vector<int> ruchy, bool kto_gra, int& ile_nieudanych) {
pair<bool, char> temp = Game(tablica).kto_wygral();
if (ruchy.size() < 9 && !temp.first) {
for (int i = 0; i < 3; i++)
for (int j = 0; j < 3; j++)
if (tablica[i][j] == ' ') {
tablica[i][j] = kto_gra ? 'x' : 'o';
ruchy.push_back(i * 3 + j);
przewidywany_ruch(tablica, ruchy, !kto_gra, ile_nieudanych);
tablica[i][j] = ' ';
ruchy.pop_back();
}
}
else {
if (temp.first && temp.second == 'o') {
przewidywana = ruchy;
throw true;
}
else if (!temp.first && ile_nieudanych > 100) {
przewidywana = ruchy;
throw true;
}
else if (!temp.first && ile_nieudanych < 100)
ile_nieudanych++;
}
}
void Game::ruch_komputera() {
if (mapa[1][1] == ' '){
mapa[1][1] = 'o';
obecna.push_back(4);
return;
}
int temp = 0;
try {
if(czy_potrzebna_analiza() || mapa[przewidywana[obecna.size()] / 3][przewidywana[obecna.size()] % 3]!=' ')
przewidywany_ruch(mapa, obecna, 0, temp);
}
catch (...) {
}
system("cls");
cout << "Odpowiedz: " << czy_potrzebna_analiza() << endl;
for (auto i : obecna)
cout << i << " ";
cout << endl;
for (auto i : przewidywana)
cout << i << " ";
cout << endl;
_getch();
mapa[przewidywana[obecna.size()] / 3][przewidywana[obecna.size()] % 3] = 'o';
obecna.push_back(przewidywana[obecna.size()]);
}
Game::Game(){
for (int i = 0; i < 3; i++) {
vector<char> temp;
for (int j = 0; j < 3; j++)
temp.push_back(' ');
mapa.push_back(temp);
}
random_device m;
mt19937 silnik(m());
uniform_int_distribution<int> dys(0, 1);
kto_zaczyna_zmianna = dys(silnik);
}
void Game::ruch_gracza(){
string temp;
for (auto i : mapa) {
for (auto j : i)
temp += j;
temp += '\n';
}
string stala = temp;
char znak;
int obecny = 5;
do {
system("cls");
temp[obecny] = '$';
cout << temp;
temp[obecny] = stala[obecny];
znak = _getch();
switch (znak) {
case 'w':
if (obecny > 3)
obecny -= 4;
break;
case 'a':
if ((obecny - 1) >= 0 && temp[obecny - 1] != '\n')
obecny--;
break;
case 's':
if (obecny + 4 < temp.size())
obecny += 4;
break;
case 'd':
if (temp[obecny + 1] != '\n')
obecny++;
break;
}
} while (znak != '\r'|| temp[obecny] != ' ');
system("cls");
mapa[obecny / 4][obecny % 4] = 'x';
obecna.push_back((obecny / 4) * 3 + (obecny % 4));
}
pair<bool, char> Game::kto_wygral(){
bool a, b;
for (int i = 0; i < 3; i++) {
a = true;
b = true;
for (int j = 0; j < 3; j++) {
if (mapa[i][0] != mapa[i][j] || mapa[i][0] == ' ')
a = false;
if (mapa[0][i] != mapa[j][i] || mapa[0][i] == ' ')
b = false;
}
if (a)
return make_pair(true, mapa[i][0]);
if (b)
return make_pair(true, mapa[0][i]);
}
a = b = true;
for (int i = 1; i < 3; i++) {
if (mapa[0][0] != mapa[i][i] || mapa[0][0] == ' ')
a = false;
if (mapa[0][2] != mapa[i][2 - i] || mapa[0][2] == ' ')
b = false;
}
if (a)
return make_pair(true, mapa[0][0]);
if (b)
return make_pair(true, mapa[0][2]);
return make_pair(false, 'k');
}
void Game::resetuj(){
for (int i = 0; i < 3; i++)
for (int j = 0; j < 3; j++)
mapa[i][j] = ' ';
random_device m;
mt19937 silnik(m());
uniform_int_distribution<int> dys(0, 1);
kto_zaczyna_zmianna = dys(silnik);
obecna.clear();
przewidywana.clear();
}
bool Game::kto_zaczyna() {
return kto_zaczyna_zmianna;
}
void Game::rysuj() {
for (auto i : mapa) {
for (auto j : i)
cout << j;
cout << endl;
}
}
Game::Game(std::vector<std::vector<char>> temp) {
for (auto i : temp) {
vector<char> wewnetrzna;
for (auto j : i)
wewnetrzna.push_back(j);
mapa.push_back(wewnetrzna);
}
}
plik gra.h
#pragma once
#include <vector>
class Game {
private:
std::vector<std::vector<char>> mapa;
std::vector<int> obecna;
std::vector<int> przewidywana;
bool kto_zaczyna_zmianna;
bool czy_potrzebna_analiza();
void przewidywany_ruch(std::vector<std::vector<char>>, std::vector<int>, bool, int&);
public:
Game();
Game(std::vector<std::vector<char>>);
void rysuj();
bool kto_zaczyna();
void ruch_gracza();
void ruch_komputera();
std::pair<bool, char> kto_wygral();
void resetuj();
};
plik main.cpp
#include <iostream>
#include "gra.h"
#include <conio.h>
using namespace std;
int menu();
int main()
{
int wybor;
int komputer = 0;
int gracz = 0;
Game temp;
do {
wybor = menu();
if (wybor == 1) {
pair<bool, char> t;
bool kto_zaczyna = temp.kto_zaczyna();
do {
if (kto_zaczyna)
temp.ruch_gracza();
else
temp.ruch_komputera();
t = temp.kto_wygral();
kto_zaczyna = !kto_zaczyna;
} while (!t.first);
temp.rysuj();
if (t.second == 'o')
komputer++;
else
gracz++;
cout << "Wygrywa gracz: " << t.second << endl;
cout << "Wcisnij dowolny klawisz aby zakonczyc" << endl;
_getch();
system("cls");
temp.resetuj();
}
else if (wybor == 3) {
cout << "Komputer: " << komputer << endl;
cout << "Gracz: " << gracz << endl;
cout << "Wcisnij dowolny klawisz aby zakonczyc" << endl;
_getch();
system("cls");
}
else
cout << "Dziekujemy za skorzystanie z naszego programu" << endl;
} while (wybor != 2);
}
int menu() {
string tablica = "Nowa gra \n"
"Zakoncz \n"
"Zobacz_statystyki<\n";
char znak;
int pozycja_prosta = tablica.find('<');
int pozycja_wlasciwa = pozycja_prosta;
do {
cout << tablica;
tablica[pozycja_wlasciwa] = ' ';
znak = _getch();
switch (znak) {
case 'w':
if (pozycja_prosta - 19 > 0)
pozycja_prosta -= 19;
break;
case's':
if (pozycja_prosta + 19 < tablica.size())
pozycja_prosta += 19;
break;
}
pozycja_wlasciwa = tablica.find(' ', pozycja_prosta - 12);
tablica[pozycja_wlasciwa] = '<';
system("cls");
} while (znak != '\r');
return pozycja_prosta / 19 + 1;
}