commit 289ad112e34b2af8d98727b12a04ed1d72d041f7 Author: Denis V. Dedkov Date: Sat Nov 30 09:36:15 2024 +0200 Initial commit diff --git a/QTicTacToe.pro b/QTicTacToe.pro new file mode 100644 index 0000000..4c38007 --- /dev/null +++ b/QTicTacToe.pro @@ -0,0 +1,37 @@ +#------------------------------------------------- +# +# Project created by QtCreator 2011-02-12T15:39:17 +# +#------------------------------------------------- + +QT += core gui network widgets + +TARGET = QTicTacToe +TEMPLATE = app + + +SOURCES += main.cpp\ + mainwindow.cpp \ + qtictactoegame.cpp \ + qtictactoeboard.cpp \ + gamesettingsdialog.cpp + +HEADERS += mainwindow.h \ + qtictactoegame.h \ + qtictactoeboard.h \ + gamesettingsdialog.h + +FORMS += mainwindow.ui \ + gamesettingsdialog.ui + +RESOURCES += \ + images.qrc + +TRANSLATIONS += tictactoe_ru.ts + +#INCLUDEPATH += ../../qxmpp-0.2.0/src + +#LIBS += -L../../qxmpp-0.2.0/lib -lqxmpp + +#OTHER_FILES += \ +# Board.qml diff --git a/cross.PNG b/cross.PNG new file mode 100644 index 0000000..1ca9fda Binary files /dev/null and b/cross.PNG differ diff --git a/gamesettingsdialog.cpp b/gamesettingsdialog.cpp new file mode 100644 index 0000000..b18b6a0 --- /dev/null +++ b/gamesettingsdialog.cpp @@ -0,0 +1,51 @@ +#include "gamesettingsdialog.h" +#include "ui_gamesettingsdialog.h" + +GameSettingsDialog::GameSettingsDialog(QWidget *parent) : + QDialog(parent), + ui(new Ui::GameSettingsDialog) +{ + ui->setupUi(this); +} + +GameSettingsDialog::~GameSettingsDialog() +{ + delete ui; +} + +void GameSettingsDialog::changeEvent(QEvent *e) +{ + QDialog::changeEvent(e); + switch (e->type()) { + case QEvent::LanguageChange: + ui->retranslateUi(this); + break; + default: + break; + } +} + +void GameSettingsDialog::on_sbBoardSize_valueChanged(int value) +{ + ui->sbCountToWin->setMaximum(value); +} + +int GameSettingsDialog::getBoardSize() +{ + return ui->sbBoardSize->value(); +} + +int GameSettingsDialog::getCountToWin() +{ + return ui->sbCountToWin->value(); +} + +void GameSettingsDialog::setBoardSize(int size) +{ + ui->sbBoardSize->setValue(size); +} + +void GameSettingsDialog::setCountToWin(int count) +{ + ui->sbCountToWin->setValue(count); +} diff --git a/gamesettingsdialog.h b/gamesettingsdialog.h new file mode 100644 index 0000000..20d8f11 --- /dev/null +++ b/gamesettingsdialog.h @@ -0,0 +1,34 @@ +#ifndef GAMESETTINGSDIALOG_H +#define GAMESETTINGSDIALOG_H + +#include + +namespace Ui { + class GameSettingsDialog; +} + +class GameSettingsDialog : public QDialog +{ + Q_OBJECT + +public: + explicit GameSettingsDialog(QWidget *parent = 0); + ~GameSettingsDialog(); + + int getBoardSize(); + int getCountToWin(); + + void setBoardSize(int size); + void setCountToWin(int count); + +protected: + void changeEvent(QEvent *e); + +private: + Ui::GameSettingsDialog *ui; + +private slots: + void on_sbBoardSize_valueChanged(int ); +}; + +#endif // GAMESETTINGSDIALOG_H diff --git a/gamesettingsdialog.ui b/gamesettingsdialog.ui new file mode 100644 index 0000000..56337a4 --- /dev/null +++ b/gamesettingsdialog.ui @@ -0,0 +1,126 @@ + + + GameSettingsDialog + + + + 0 + 0 + 228 + 159 + + + + Game settings + + + + + + Game settings + + + + + + &Board size: + + + sbBoardSize + + + + + + + 3 + + + 150 + + + + + + + &Count to win: + + + sbCountToWin + + + + + + + 3 + + + 3 + + + + + + + Qt::Vertical + + + + 98 + 28 + + + + + + + + + + + Qt::Horizontal + + + QDialogButtonBox::Cancel|QDialogButtonBox::Ok + + + + + + + + + buttonBox + accepted() + GameSettingsDialog + accept() + + + 248 + 254 + + + 157 + 274 + + + + + buttonBox + rejected() + GameSettingsDialog + reject() + + + 316 + 260 + + + 286 + 274 + + + + + diff --git a/i18n/qt_ru_RU.qm b/i18n/qt_ru_RU.qm new file mode 100644 index 0000000..94e7989 Binary files /dev/null and b/i18n/qt_ru_RU.qm differ diff --git a/i18n/tictactoe_ru_RU.qm b/i18n/tictactoe_ru_RU.qm new file mode 100644 index 0000000..39c57fa Binary files /dev/null and b/i18n/tictactoe_ru_RU.qm differ diff --git a/images.qrc b/images.qrc new file mode 100644 index 0000000..9453b3d --- /dev/null +++ b/images.qrc @@ -0,0 +1,6 @@ + + + cross.PNG + ought.PNG + + diff --git a/main.cpp b/main.cpp new file mode 100644 index 0000000..00defbb --- /dev/null +++ b/main.cpp @@ -0,0 +1,26 @@ +#include +#include "mainwindow.h" + +#include +#include +#include +#include "qtictactoegame.h" + +int main(int argc, char *argv[]) +{ + QApplication a(argc, argv); + + QDir dir(QApplication::applicationDirPath()); + dir.cd("i18n"); + + QTranslator translator,qt; + translator.load("tictactoe_"+QLocale::system().name(),dir.absolutePath()); + a.installTranslator(&translator); + qt.load("qt_"+QLocale::system().name(),dir.absolutePath()); + a.installTranslator(&qt); + + MainWindow w; + w.showMaximized(); + + return a.exec(); +} diff --git a/mainwindow.cpp b/mainwindow.cpp new file mode 100644 index 0000000..6b01899 --- /dev/null +++ b/mainwindow.cpp @@ -0,0 +1,250 @@ +#include "mainwindow.h" +#include "ui_mainwindow.h" + +#include +#include +#include +#include + +#include "gamesettingsdialog.h" + +MainWindow::MainWindow(QWidget *parent) : + QMainWindow(parent), + ui(new Ui::MainWindow) +{ + ui->setupUi(this); + + board = new QTicTacToeBoard(ui->scrollArea, 2); + ui->scrollArea->setWidget(board); + + ui->actionNew_game->setIcon(QIcon::fromTheme("document-new")); + ui->actionGame_settings->setIcon(QIcon::fromTheme("document-properties")); + + game = 0; + tcpServer = 0; + tcpSocket = 0; + clientSocket = 0; + + isServer = false; + isClient = false; + isLocalGame = true; + + newGame(); +} + +void MainWindow::newGame() +{ + if (isClient) + { + QMessageBox::information(this,tr("QTicTacToe"),tr("You connected to server! Only server can start game!")); + return; + } + + if (game) delete game; + + QSettings settings("Home inc.","TicTacToe",this); + settings.beginGroup("gameSettings"); + boardSize = settings.value("boardSize",3).toInt(); + countToWin = settings.value("countToWin",3).toInt(); + + game = new QTicTacToeGame(boardSize,countToWin,this); + board->setGame(game); + + connect(game,SIGNAL(gameOver(int)), this, SLOT(gameOver(int))); + connect(game,SIGNAL(itemPuted(int,int,int)), this, SLOT(turn(int,int,int))); + + if (isServer) + { + clientSocket->write(QString("settings:%1:%2").arg(boardSize).arg(countToWin).toUtf8()); + } +} + +MainWindow::~MainWindow() +{ + delete ui; +} + +void MainWindow::changeEvent(QEvent *e) +{ + QMainWindow::changeEvent(e); + switch (e->type()) { + case QEvent::LanguageChange: + ui->retranslateUi(this); + break; + default: + break; + } +} + +void MainWindow::gameOver(int player) +{ + QString mess(player?tr("Game over! Player %1 win!").arg(player):tr("Game over! No win!")); + QMessageBox::information(this,tr("Game over"),mess); + + game->clear(); +} + +void MainWindow::turn(int x, int y, int player) +{ + QString data = QString("%1:%2:%3").arg(x).arg(y).arg(player); + if (isServer) + { + clientSocket->write(data.toUtf8()); + } + if (isClient) + { + tcpSocket->write(data.toUtf8()); + } + this->statusBar()->showMessage(tr("Opponent turn")); +} + +void MainWindow::readTurn() +{ + QString data = QString::fromUtf8(isClient?tcpSocket->readAll():clientSocket->readAll()); + + QStringList t = data.split(":"); + + if (t.at(0) == "settings") + { + delete game; + game = new QTicTacToeGame(t.at(1).toInt(), t.at(2).toInt(), this); + board->setGame(game); + + connect(game,SIGNAL(gameOver(int)), this, SLOT(gameOver(int))); + connect(game,SIGNAL(itemPuted(int,int,int)), this, SLOT(turn(int,int,int))); + + ui->actionStart_server->setEnabled(false); + ui->actionConnect_to_Server->setEnabled(false); + ui->actionDisconnect->setEnabled(true); + + this->statusBar()->showMessage(tr("Connected to server!"), 5000); + } else + { + if (game->put(t.at(0).toInt(), t.at(1).toInt(), t.at(2).toInt())) + { + this->statusBar()->showMessage(tr("Your turn")); + } + } +} + +void MainWindow::on_actionNew_game_triggered() +{ + newGame(); +} + +void MainWindow::on_actionGame_settings_triggered() +{ + GameSettingsDialog *dialog = new GameSettingsDialog(this); + + dialog->setBoardSize(boardSize); + dialog->setCountToWin(countToWin); + + if (dialog->exec()) + { + QSettings settings("Home inc.","TicTacToe",this); + settings.beginGroup("gameSettings"); + settings.setValue("boardSize",dialog->getBoardSize()); + settings.setValue("countToWin", dialog->getCountToWin()); + newGame(); + } + + delete dialog; +} + +void MainWindow::on_actionStart_server_triggered() +{ + tcpServer = new QTcpServer(this); + tcpServer->setMaxPendingConnections(1); + + connect(tcpServer,SIGNAL(newConnection()),this,SLOT(newConnection())); + + if (!tcpServer->listen(QHostAddress::Any, 1515)) { + QMessageBox::critical(this, tr("QTicTacToe Server"), tr("Unable to start the server: %1.").arg(tcpServer->errorString())); + return; + } + + board->setBoardPlayer(1); + + this->statusBar()->showMessage(tr("Waiting for connection")); + ui->actionStart_server->setEnabled(false); + ui->actionConnect_to_Server->setEnabled(false); + ui->actionDisconnect->setEnabled(true); + board->setEnabled(false); + + isClient = false; + isLocalGame = false; + isServer = true; +} + +void MainWindow::newConnection() +{ + this->statusBar()->showMessage(tr("New player connected!"), 5000); + + clientSocket = tcpServer->nextPendingConnection(); + + connect(clientSocket,SIGNAL(readyRead()),this, SLOT(readTurn())); + connect(clientSocket,SIGNAL(disconnected()),clientSocket,SLOT(deleteLater())); + connect(clientSocket,SIGNAL(disconnected()),this,SLOT(on_actionDisconnect_triggered())); + + newGame(); + board->setEnabled(true); +} + +void MainWindow::on_actionConnect_to_Server_triggered() +{ + tcpSocket = new QTcpSocket(this); + tcpSocket->abort(); + + QString address = QInputDialog::getText(this,tr("QTicTacToe"),tr("Address")); + + if (address.length()>0) { + tcpSocket->connectToHost(address,1515); + + isClient = true; + isLocalGame = false; + isServer = false; + + connect(tcpSocket,SIGNAL(readyRead()),this, SLOT(readTurn())); + connect(tcpSocket,SIGNAL(disconnected()),tcpSocket,SLOT(deleteLater())); + connect(tcpSocket,SIGNAL(disconnected()),this,SLOT(on_actionDisconnect_triggered())); + + board->setBoardPlayer(2); + } +} + +void MainWindow::on_actionDisconnect_triggered() +{ + if (isServer) + { + disconnect(clientSocket,SIGNAL(disconnected()),this,SLOT(on_actionDisconnect_triggered())); + clientSocket->disconnectFromHost(); + tcpServer->close(); + } + if (isClient) + { + disconnect(tcpSocket,SIGNAL(disconnected()),this,SLOT(on_actionDisconnect_triggered())); + tcpSocket->disconnectFromHost(); + } + + isClient = false; + isLocalGame = true; + isServer = false; + + ui->actionDisconnect->setEnabled(false); + ui->actionConnect_to_Server->setEnabled(true); + ui->actionStart_server->setEnabled(true); + board->setEnabled(true); + + board->setBoardPlayer(0); + newGame(); + + this->statusBar()->clearMessage(); + this->statusBar()->showMessage(tr("Player disconnected!"), 5000); +} + +void MainWindow::on_actionAbout_triggered() +{ + QMessageBox::about(this, tr("About"), tr("QTicTacToe v 0.1")); +} + + diff --git a/mainwindow.h b/mainwindow.h new file mode 100644 index 0000000..6091f0b --- /dev/null +++ b/mainwindow.h @@ -0,0 +1,66 @@ +#ifndef MAINWINDOW_H +#define MAINWINDOW_H + +#include +#include +#include + +#include "qtictactoegame.h" +#include "qtictactoeboard.h" + +//#include +//#include + +namespace Ui { + class MainWindow; +} + +class MainWindow : public QMainWindow +{ + Q_OBJECT + +public: + explicit MainWindow(QWidget *parent = 0); + ~MainWindow(); + +protected: + void changeEvent(QEvent *e); + +private: + Ui::MainWindow *ui; + QTicTacToeGame *game; + QTicTacToeBoard *board; + + QTcpServer *tcpServer; + + QTcpSocket *tcpSocket; + QTcpSocket *clientSocket; + + //QXmppClient *c; + + void newGame(); + int boardSize; + int countToWin; + + bool isServer; + bool isClient; + bool isLocalGame; + +private slots: + //void on_actionConnectToJabber_triggered(); + void on_actionAbout_triggered(); + void on_actionDisconnect_triggered(); + void on_actionConnect_to_Server_triggered(); + void on_actionStart_server_triggered(); + void on_actionGame_settings_triggered(); + void on_actionNew_game_triggered(); + void gameOver(int player); + void newConnection(); + + void turn(int x, int y, int player); + void readTurn(); + + //void message(QXmppMessage message); +}; + +#endif // MAINWINDOW_H diff --git a/mainwindow.ui b/mainwindow.ui new file mode 100644 index 0000000..8432505 --- /dev/null +++ b/mainwindow.ui @@ -0,0 +1,123 @@ + + + MainWindow + + + + 0 + 0 + 572 + 444 + + + + TicTacToe + + + + + + + + + 0 + 0 + 552 + 360 + + + + + + + + + + + + 0 + 0 + 572 + 21 + + + + + Game + + + + + + + Help + + + + + + + + + TopToolBarArea + + + false + + + + + + + + + + + New game + + + Start new game + + + Ctrl+N + + + + + Game settings + + + Show game settings dialog + + + Ctrl+P + + + + + Start server + + + + + Connect to Server + + + + + false + + + Disconnect + + + + + About + + + + + + + diff --git a/ought.PNG b/ought.PNG new file mode 100644 index 0000000..e8a07e2 Binary files /dev/null and b/ought.PNG differ diff --git a/qrc_images.cpp b/qrc_images.cpp new file mode 100644 index 0000000..eb40cfe --- /dev/null +++ b/qrc_images.cpp @@ -0,0 +1,365 @@ +/**************************************************************************** +** Resource object code +** +** Created by: The Resource Compiler for Qt version 5.15.2 +** +** WARNING! All changes made in this file will be lost! +*****************************************************************************/ + +static const unsigned char qt_resource_data[] = { + // /home/denis/projects/QTicTacToe/cross.PNG + 0x0,0x0,0x9,0xc1, + 0x89, + 0x50,0x4e,0x47,0xd,0xa,0x1a,0xa,0x0,0x0,0x0,0xd,0x49,0x48,0x44,0x52,0x0, + 0x0,0x0,0x32,0x0,0x0,0x0,0x32,0x8,0x6,0x0,0x0,0x0,0x1e,0x3f,0x88,0xb1, + 0x0,0x0,0x0,0x1,0x73,0x52,0x47,0x42,0x0,0xae,0xce,0x1c,0xe9,0x0,0x0,0x0, + 0x6,0x62,0x4b,0x47,0x44,0x0,0xff,0x0,0xff,0x0,0xff,0xa0,0xbd,0xa7,0x93,0x0, + 0x0,0x0,0x9,0x70,0x48,0x59,0x73,0x0,0x0,0xb,0x13,0x0,0x0,0xb,0x13,0x1, + 0x0,0x9a,0x9c,0x18,0x0,0x0,0x0,0x7,0x74,0x49,0x4d,0x45,0x7,0xdb,0x2,0xc, + 0xe,0x1c,0x17,0xeb,0x1,0x5f,0x4,0x0,0x0,0x0,0x19,0x74,0x45,0x58,0x74,0x43, + 0x6f,0x6d,0x6d,0x65,0x6e,0x74,0x0,0x43,0x72,0x65,0x61,0x74,0x65,0x64,0x20,0x77, + 0x69,0x74,0x68,0x20,0x47,0x49,0x4d,0x50,0x57,0x81,0xe,0x17,0x0,0x0,0x9,0x1c, + 0x49,0x44,0x41,0x54,0x68,0xde,0xed,0x9a,0x5d,0x6c,0x1c,0x57,0x15,0x80,0xbf,0x3b, + 0x33,0xfb,0xe3,0xb5,0xd7,0x4e,0x89,0xbd,0x5e,0xbb,0x8d,0xe3,0xd8,0x21,0xc4,0x49, + 0xa8,0xd2,0xc8,0x81,0x16,0x35,0xae,0xe2,0x1a,0x28,0x48,0x21,0x55,0x24,0x8,0xa0, + 0x88,0x42,0x5,0x3c,0x50,0x5e,0x50,0x5a,0x24,0xe8,0x53,0xd5,0x38,0xf4,0xa5,0x82, + 0xa,0x4,0x94,0x84,0xd6,0xed,0x43,0x5,0x2,0x91,0x28,0x69,0x22,0xf1,0x50,0x12, + 0x87,0x86,0x2a,0x4a,0x13,0x50,0xda,0x92,0x34,0x89,0x88,0x9d,0x84,0x54,0xb1,0xbd, + 0x8e,0xe3,0xdd,0xb5,0xbd,0x3f,0xb3,0xc3,0xc3,0xdc,0xeb,0xb9,0x3b,0xde,0xb5,0xd7, + 0x76,0xdc,0x82,0xc4,0x4a,0x57,0xeb,0xf5,0xce,0xdc,0x7b,0xbe,0x7b,0xce,0x3d,0x7f, + 0xb3,0xf0,0xff,0xd7,0xff,0xf6,0x4b,0xfc,0xb7,0xae,0x2b,0x16,0x30,0x89,0xf3,0x11, + 0x2,0x38,0xb,0x1,0x51,0xdf,0x19,0x72,0xe8,0x93,0x15,0xe4,0xbb,0xb3,0x44,0xc2, + 0xab,0xa1,0xaf,0x5b,0xd0,0xd6,0x9d,0xf1,0x32,0xcb,0x4c,0xa6,0x84,0xb7,0x80,0x80, + 0x7c,0xf,0x43,0x4b,0x8,0x6e,0xab,0x5,0x96,0xc2,0xcc,0xf4,0x35,0x3,0xd0,0x12, + 0x81,0xdb,0x96,0xf,0x4e,0x8d,0x22,0x20,0xab,0xcc,0x64,0x42,0x7e,0x67,0xb9,0x37, + 0x7c,0xf3,0x33,0x90,0xaf,0x85,0x42,0x1e,0x12,0xd7,0xe0,0xcf,0x57,0x80,0x8c,0xbc, + 0x2e,0x7f,0x87,0x4c,0xce,0xd0,0xd6,0xc,0xc1,0xe7,0x57,0xc1,0xf2,0x15,0x60,0x58, + 0x60,0x8d,0x43,0xdf,0x49,0xf9,0x5d,0x5e,0x8e,0xc2,0x6c,0xa6,0xa5,0x76,0xdb,0x4, + 0x82,0xae,0x70,0x3f,0xd8,0x3,0xe1,0xed,0x90,0x6a,0x5,0xe7,0x2a,0x64,0xaf,0xc0, + 0x9f,0xbe,0x3,0x23,0x1f,0xc8,0xeb,0xb3,0x80,0x3d,0x9b,0xda,0x2b,0x34,0x25,0xa5, + 0x89,0x30,0x7c,0x6e,0x13,0xac,0x78,0x1c,0xc2,0x1d,0x60,0x6,0x20,0x7c,0xb,0xb2, + 0x7f,0x83,0x9f,0x3d,0x23,0xe5,0xcb,0xf8,0x61,0xcc,0x32,0x20,0x1,0xe8,0x6a,0x86, + 0x47,0x7f,0x8,0x55,0x8f,0x1,0xd,0x60,0x18,0x20,0xa2,0xc0,0xdd,0xd0,0xbe,0x1, + 0x9a,0x6e,0xc0,0xa5,0x21,0xdf,0x79,0x71,0x16,0x69,0x4e,0x55,0xf0,0xc5,0xcd,0xd0, + 0xfc,0x24,0x54,0x7d,0x1,0x42,0x71,0x8,0xc6,0xc0,0x6a,0x82,0xe0,0xbd,0xd0,0x79, + 0x17,0x4,0x2f,0xc0,0x60,0xda,0xbf,0x71,0x66,0x89,0x49,0x4d,0x58,0x53,0x3,0x9f, + 0xee,0x86,0xea,0x6f,0x83,0xd1,0x4,0x1,0xb,0x82,0x2,0x2,0x6,0x4,0x4c,0xb0, + 0xda,0x21,0x12,0x87,0xe6,0x41,0xb8,0x38,0xac,0xed,0xcc,0x7c,0x61,0x7c,0x10,0xdb, + 0x3a,0xa1,0x65,0x37,0xd4,0x7c,0x16,0xaa,0xd,0xa8,0x32,0xdc,0x75,0xd,0x13,0xa, + 0x1,0x30,0xeb,0xa1,0xf6,0xa,0x8c,0xf,0x40,0x22,0xa7,0xc3,0x58,0x33,0x35,0x62, + 0x9,0x30,0x2,0x60,0x37,0x41,0xae,0xce,0xd5,0x84,0xb2,0x34,0x3,0xb0,0x5,0x84, + 0x80,0x60,0x8f,0xfb,0xbf,0x6d,0xcf,0xc3,0xe1,0xd3,0xda,0x1c,0xf9,0xa,0x81,0x8c, + 0x62,0x73,0xda,0xd6,0x9,0xad,0xbb,0x21,0xd2,0x3,0x11,0x5c,0x0,0x53,0xca,0x9a, + 0x5,0x72,0x6,0x64,0x96,0x81,0xdd,0xec,0xca,0x37,0x73,0x32,0xdd,0xac,0x1c,0x29, + 0x87,0x0,0xdb,0x80,0x9c,0x14,0x1c,0xb9,0x5e,0x4,0x88,0x2,0xb5,0x40,0x1d,0x50, + 0xdb,0x3,0x6d,0xbb,0x61,0x47,0xa7,0x2b,0xcc,0xb4,0x87,0x9b,0xcb,0xab,0xf9,0x20, + 0x76,0x74,0xba,0xf3,0xd4,0xf6,0xb8,0xf3,0x46,0x81,0x1a,0x57,0x49,0xd3,0x7b,0x6d, + 0xb,0x4f,0x1e,0x67,0xc6,0xdc,0x96,0x2f,0x3e,0x48,0x98,0xf7,0x6f,0xc3,0xe6,0x1, + 0x8,0xd7,0x79,0x1b,0x6c,0x48,0xad,0x4,0xe4,0xe7,0xb0,0x92,0xb9,0x7,0x56,0xc6, + 0xa1,0x69,0x3b,0x7c,0x30,0x25,0x2f,0xd0,0x7d,0xbf,0x53,0xda,0x7c,0x75,0x88,0x95, + 0x4f,0x42,0x4d,0x8f,0x2b,0x7c,0xc4,0x75,0x5a,0x8,0x5c,0xc1,0x91,0xbe,0x24,0x67, + 0x43,0x7e,0x14,0x26,0xae,0xc2,0x8d,0x8c,0xdf,0x53,0x9a,0x65,0x22,0x67,0x0,0x32, + 0xa3,0xb0,0x2c,0x5,0x81,0x75,0x60,0x56,0x7b,0x9e,0x51,0xd,0x53,0xdb,0x78,0x11, + 0x83,0x35,0xeb,0xa1,0xf9,0x3a,0x9c,0x1f,0xf2,0x1d,0x7e,0xa7,0x84,0x26,0x82,0xc5, + 0x10,0xd1,0x1e,0x57,0xcb,0xa,0x44,0x6d,0x56,0xe,0x98,0x4,0x26,0x80,0xf4,0x8, + 0x8c,0xf5,0xc1,0xd9,0xc3,0x70,0x23,0x29,0xbf,0x2c,0xcc,0x16,0x10,0xa5,0xda,0x12, + 0x79,0x98,0xf8,0x17,0x34,0x38,0x10,0x5a,0x5b,0xc,0x63,0x6a,0x40,0xd3,0x56,0xd4, + 0x6,0x55,0x71,0x68,0x1e,0x80,0xf3,0x37,0x4b,0x38,0x0,0x3d,0x4e,0x84,0x61,0xc7, + 0x66,0xf,0x22,0xaa,0x41,0x58,0xf2,0x56,0x5,0x91,0x6,0x52,0xc3,0x30,0xf6,0x5b, + 0x78,0xeb,0x55,0xb8,0x9c,0xd0,0x5c,0xbe,0x53,0x1,0x8,0xc0,0xad,0xc,0xbc,0xd3, + 0xf,0x6b,0x23,0x10,0xdc,0xe2,0x1,0x4,0xe4,0xa6,0xfa,0x61,0x44,0x1b,0x44,0x36, + 0xc2,0xd5,0x3,0x90,0x4c,0x6a,0xf3,0x6b,0x6e,0x1d,0x7,0xee,0xae,0x87,0x2d,0x2f, + 0x41,0xf4,0x1,0x57,0x13,0xb5,0xf2,0x3c,0xe8,0x9a,0x98,0x0,0x52,0x12,0xe2,0xd6, + 0x7e,0x38,0xd5,0x7,0x97,0x86,0xb5,0x18,0xe2,0x54,0x92,0xa2,0xe8,0x3b,0x19,0x84, + 0x7f,0x9c,0x80,0xe,0x20,0xb0,0xc5,0xbb,0x4d,0x99,0xba,0xa9,0x7d,0x36,0x0,0x62, + 0xd0,0xd1,0xd,0x83,0xaf,0xc3,0x78,0x52,0x23,0x35,0xdd,0xf9,0xee,0x69,0x84,0x5d, + 0x87,0xa0,0xe6,0x93,0x33,0xcd,0x49,0x79,0xa8,0x49,0xd,0x22,0xb1,0x1f,0xde,0xea, + 0x83,0xb,0x43,0xc0,0x54,0x39,0xaf,0x68,0xce,0x2,0xa1,0x27,0x88,0x41,0x98,0xba, + 0x4,0x8d,0x49,0x10,0x6b,0x81,0x6a,0x4f,0x70,0xd3,0x77,0x6e,0x4c,0x40,0x34,0xc2, + 0x86,0x6e,0xb8,0x7a,0x8,0xc6,0x52,0x52,0x7d,0x5,0x68,0x8d,0xc1,0x37,0xe,0xbb, + 0x10,0x51,0xe9,0x9d,0xf4,0x33,0x91,0x95,0xa6,0x94,0x4,0x92,0xc3,0x30,0xb6,0xf, + 0x4e,0xf6,0xc1,0x85,0x61,0xd,0xa2,0xe0,0x4f,0x4f,0x2a,0xd1,0x88,0x6,0x33,0x92, + 0x85,0x89,0x4b,0xd0,0x58,0x0,0x43,0xc2,0xa8,0xec,0xc2,0xf4,0xd,0xb,0x8,0x34, + 0xc2,0xc6,0xf5,0xb0,0xf6,0x3a,0x9c,0x1e,0x86,0x27,0x3e,0x5,0xdd,0xcf,0xb9,0xe6, + 0x54,0xe3,0xde,0x4e,0x18,0x2f,0x56,0x4c,0x69,0x10,0xe3,0xc3,0x70,0x6b,0x1f,0x9c, + 0xe8,0x83,0xf3,0x73,0x42,0xcc,0x5,0x52,0x1,0x8c,0xa8,0x2e,0x6,0x50,0x67,0x27, + 0xa4,0x1c,0x53,0x3b,0x2c,0x8f,0xc3,0xd6,0x0,0x34,0x3f,0x2e,0x23,0xb6,0x6,0x21, + 0x73,0x52,0x32,0xf2,0x4c,0xe8,0x10,0x7f,0x7d,0x19,0xce,0x8f,0x54,0x2,0x31,0x9f, + 0x8a,0x4f,0x4f,0xeb,0x43,0xee,0x69,0xfc,0xee,0x8f,0xa1,0xfe,0x69,0x37,0x80,0xa9, + 0x20,0xa6,0xe,0xac,0x90,0x6b,0xaa,0x5c,0x92,0x49,0x10,0x55,0x9e,0xf6,0xc,0x9f, + 0x7b,0x4d,0x2,0xe3,0xc0,0x18,0x90,0xe8,0x85,0x17,0x7b,0xe5,0x4e,0x64,0x2a,0x81, + 0xa8,0x44,0x23,0xa5,0x34,0x83,0xbb,0xc8,0x99,0xe3,0xb0,0xde,0x81,0x40,0x57,0xb1, + 0x36,0xc2,0xda,0x7b,0x58,0xc2,0x45,0x2c,0xa8,0x12,0xee,0xe7,0x90,0xb6,0x6c,0x56, + 0x6a,0x62,0x5c,0xc2,0x24,0xf6,0xc0,0xaf,0x7b,0xe5,0x45,0x15,0x43,0xcc,0x7,0xa4, + 0x4c,0xd0,0x7c,0xfb,0x18,0xdc,0xb,0x84,0xba,0x5c,0x90,0x90,0x1c,0xd3,0x0,0x72, + 0x84,0x85,0x7,0x68,0x6a,0x7,0x5b,0x79,0xa7,0xdb,0xc0,0xc8,0x1e,0xf8,0xa5,0x1f, + 0xc2,0xae,0x54,0x28,0x73,0x81,0x10,0xca,0xfd,0x85,0x60,0xf2,0x22,0xb4,0x24,0xa1, + 0xaa,0x3,0x42,0xd5,0xc5,0x9a,0x50,0xc2,0x7,0x35,0xaf,0xa6,0x5c,0xec,0x94,0x84, + 0x18,0x1f,0x86,0xb1,0x9f,0xc2,0x89,0x97,0x65,0xea,0x91,0xd5,0x34,0xe1,0x2c,0x15, + 0x48,0x9,0x98,0xa1,0xc,0x64,0x2e,0xc2,0x2a,0x1b,0xa2,0x1d,0x50,0x55,0xed,0x42, + 0xe8,0x20,0x96,0xb6,0x94,0xad,0x47,0xed,0x61,0x18,0x7d,0x11,0x8e,0xbe,0xc,0x6f, + 0x27,0x7c,0x10,0x85,0xf9,0x8,0xb5,0x10,0x10,0x7f,0x59,0x2b,0xe0,0x46,0xe,0x8e, + 0x1d,0x85,0x9e,0x8f,0xc1,0xb2,0x7,0x3d,0xb3,0xd2,0x41,0xd4,0x1,0xcf,0x4b,0xcb, + 0x99,0x4,0x86,0x7f,0xe,0x4f,0x3d,0xd,0x37,0x54,0x86,0x38,0x2f,0x73,0x2a,0x97, + 0xc6,0x2f,0xa6,0xd6,0xce,0xc0,0xaa,0x56,0x88,0x3c,0xe2,0xc5,0x96,0xd9,0xba,0x38, + 0xea,0x73,0xe4,0x11,0x68,0x6b,0x95,0x76,0xa6,0xa7,0x32,0xce,0x87,0x5,0xa2,0xa7, + 0xe2,0x36,0xb4,0x36,0xc0,0x13,0x87,0xc0,0xdc,0xe8,0x41,0x28,0xf7,0x9b,0xf7,0x6d, + 0x76,0x41,0x9f,0x62,0x23,0x7c,0xef,0x10,0xac,0x6a,0x90,0x5f,0xea,0xe9,0x8c,0x58, + 0x6a,0xd3,0xd2,0x8b,0xa2,0x10,0xec,0xba,0x1f,0xb6,0x3e,0x7,0x35,0xf,0x78,0x81, + 0x4e,0x55,0x93,0x5,0xd,0x24,0xab,0x8d,0x8c,0x3e,0x1a,0xdd,0x12,0x60,0xc5,0x75, + 0x38,0x37,0x54,0xc2,0xa1,0x2c,0x9,0x88,0xaf,0xb2,0xdb,0xb9,0x19,0x5a,0x9e,0x72, + 0x23,0xb6,0x5e,0x14,0x59,0x5a,0xd5,0xab,0x4,0x57,0xef,0x39,0xad,0xa3,0x33,0x3d, + 0xda,0x21,0x18,0x87,0x7b,0x6,0xe1,0xbd,0x5,0xc1,0x98,0xb,0x30,0x27,0xd9,0x26, + 0x6a,0xae,0x87,0x7,0xb5,0x54,0x5c,0x95,0xa6,0x41,0x2d,0x6a,0x2b,0xe1,0x27,0x1d, + 0xc8,0x88,0x62,0xa7,0xe4,0x4f,0xb2,0xb,0xed,0x10,0xbe,0xf,0x6,0xe,0x42,0x32, + 0x3d,0xdf,0x4d,0x36,0x17,0x6,0xd1,0x14,0x87,0xaf,0x1d,0xf4,0x52,0xf1,0xa8,0x2f, + 0x77,0xca,0x6a,0x95,0xdd,0x4,0x90,0xfa,0xb,0x4c,0xb5,0xc9,0x26,0x82,0x56,0x13, + 0x39,0xc5,0xed,0x2,0xa,0x31,0x58,0xf3,0x30,0xc,0xbc,0xe,0xa9,0x94,0x16,0x3d, + 0x17,0xd,0x22,0x66,0x87,0xa8,0xd3,0x52,0x71,0x4b,0xb,0x76,0x69,0x2d,0x93,0xbd, + 0xf9,0x2c,0x7c,0xff,0x5b,0xd0,0x69,0x42,0xfe,0x21,0x4f,0x2b,0x8e,0x6f,0x9,0x75, + 0xb6,0x9d,0x18,0xac,0xe9,0x86,0xc1,0xc3,0x12,0xc6,0x58,0x2c,0x88,0x9e,0xa3,0x7, + 0xdd,0xbf,0xe3,0x71,0xf8,0xba,0x4f,0x13,0x7a,0x3d,0x91,0xd1,0x53,0x71,0x60,0xe4, + 0x59,0x78,0xa6,0x17,0x58,0x6,0x6f,0xbc,0x1,0x1b,0x1d,0xb0,0x1f,0x2a,0x6,0xf1, + 0x17,0x66,0x42,0x16,0x67,0x6b,0x1e,0x86,0x81,0x23,0x90,0x4a,0x6b,0xaa,0x2e,0x9b, + 0xec,0x9a,0x15,0x9a,0x93,0x80,0x78,0x23,0x7c,0xf5,0x20,0x44,0x7d,0x10,0x56,0x9, + 0x88,0xa4,0xcc,0x9d,0x9e,0xef,0x95,0x36,0x97,0x73,0x69,0xdf,0x3c,0x6,0xeb,0x1, + 0xba,0xbc,0x73,0x22,0x7c,0x15,0xa7,0xe,0xf3,0xf1,0x6e,0x9,0x93,0xf2,0xc5,0x17, + 0x67,0x3e,0xdd,0x78,0xd3,0xeb,0xcb,0x34,0xc6,0x61,0xe7,0x41,0x88,0x6e,0xf0,0x6a, + 0xec,0x72,0x10,0xe3,0xc0,0xe8,0x1e,0xf8,0xc5,0x1e,0x79,0xbf,0x7e,0xc2,0x83,0x70, + 0xea,0xb8,0xb,0x23,0xba,0xbc,0xe,0x54,0xa9,0xb2,0x59,0x99,0xd9,0x6a,0x9,0x93, + 0x4e,0xfb,0xce,0xcc,0x9c,0xa5,0xae,0x4f,0x13,0xb1,0x38,0x7c,0xf9,0x0,0xd4,0x6e, + 0xf0,0x34,0xa1,0x37,0xce,0x32,0x32,0xf9,0x53,0x9a,0x48,0xf4,0xc2,0xaf,0x7a,0x7d, + 0x10,0x76,0x71,0xa2,0x79,0xfa,0x38,0xac,0x13,0x60,0x74,0x15,0x3f,0xa,0x99,0x61, + 0x62,0xd2,0x1,0xb4,0x77,0xc3,0xe0,0x51,0x48,0xa7,0xb4,0x0,0x35,0x2b,0x88,0xde, + 0xed,0x10,0xd0,0xd0,0x4,0x8f,0x1e,0xf0,0x34,0x51,0xe3,0xd3,0x44,0xb6,0x4,0xc4, + 0x6f,0x4a,0x41,0xf8,0x93,0xcd,0x10,0x9c,0xe9,0x87,0xe,0x1,0xe6,0x96,0x62,0x18, + 0xc3,0xf7,0x6c,0xa9,0x0,0xd8,0x31,0x68,0xdd,0xa,0xd7,0x8e,0xc0,0x44,0x49,0x98, + 0x52,0x20,0x72,0x5b,0x62,0xd,0xf0,0xa5,0xdf,0x41,0xe4,0x3e,0x57,0xb,0xd5,0xda, + 0xc1,0xf6,0x6b,0x22,0xa5,0x20,0xf6,0xfa,0x2a,0x3b,0xdb,0xd7,0xc5,0xf4,0x15,0x67, + 0x67,0xfb,0xdd,0xee,0x8c,0x82,0xc1,0xf7,0xa0,0xaa,0xa0,0x29,0x33,0x1f,0x83,0x55, + 0xf7,0xc3,0xbf,0x8f,0x40,0x7a,0x42,0xbb,0xa0,0x5c,0x37,0x5e,0x58,0x10,0xae,0x82, + 0xaf,0xec,0x80,0xc8,0x63,0x10,0xb2,0xbc,0x4c,0xd6,0xd2,0x2a,0xbb,0x94,0x36,0x12, + 0xbd,0xb0,0x6f,0xaf,0xa4,0xcc,0x94,0xd1,0x44,0x99,0xe2,0xec,0x6c,0x3f,0xac,0x95, + 0x30,0xa5,0x78,0x6d,0x6d,0x3a,0xa3,0x1e,0x56,0x5f,0x81,0x7f,0x9e,0x87,0x7c,0x51, + 0xa6,0x6c,0xcc,0x74,0x69,0xe,0x30,0x95,0x7,0xd1,0x0,0x22,0xe4,0xca,0xa6,0xd7, + 0xd8,0x69,0x59,0x5b,0xab,0xf2,0x74,0x64,0x3e,0x10,0x8e,0xd6,0x62,0xca,0xc9,0xeb, + 0x4d,0xd8,0xdf,0xb,0x23,0x7b,0xbd,0xba,0x7d,0x5c,0xae,0x93,0x91,0x97,0xa,0x65, + 0x9,0x21,0xf7,0x59,0xcd,0x54,0xde,0xef,0x86,0xcd,0x99,0xe7,0x23,0x68,0x42,0x5d, + 0x18,0x36,0xb5,0x40,0xa4,0x1b,0xcc,0xa0,0x67,0x92,0x39,0x2d,0x5a,0xa7,0x81,0xc4, + 0x5e,0x78,0xe9,0x27,0xb3,0x98,0x53,0xa5,0x75,0x4d,0xc8,0xd5,0xcc,0x27,0x0,0x21, + 0x35,0xa3,0x6b,0x42,0x99,0x97,0x31,0x1,0xfc,0x11,0x2e,0xbf,0xf,0x93,0x45,0xcf, + 0x47,0x4a,0x78,0x2d,0x5b,0xc0,0xa4,0xd,0x2b,0x5,0xc4,0x76,0xba,0xdd,0xf,0x55, + 0x10,0x4d,0x2,0x13,0xe,0xa4,0x5,0x8c,0xee,0x85,0x57,0x94,0x26,0xa6,0x7c,0x4d, + 0xe5,0xf9,0xd4,0x13,0x4a,0x4b,0x1,0xf8,0xfb,0x9,0x58,0xd,0xb0,0xc5,0x3,0xd1, + 0xcf,0xb4,0x71,0xb,0x6,0x5f,0x80,0x33,0xd7,0xfc,0x55,0xa4,0x59,0x3e,0x9a,0xbf, + 0x77,0x1d,0x9a,0xcf,0xc1,0xf2,0xed,0xee,0xd3,0xa2,0xc9,0x2,0x4c,0xa5,0x21,0x13, + 0x82,0xd1,0x5e,0x78,0x4d,0x69,0x62,0x31,0x10,0xcc,0x74,0x0,0xe7,0x4e,0x40,0x9b, + 0xe3,0xba,0x66,0xbb,0xe0,0x6e,0xac,0xc0,0xb5,0xe3,0x4b,0xbb,0xe0,0xf,0x6f,0x4a, + 0xb9,0xf3,0x73,0x35,0xb1,0x35,0x75,0xbf,0x7b,0x19,0x9a,0x4f,0x42,0x9d,0xd,0x13, + 0xb7,0xc1,0x39,0x5,0xc9,0x57,0xe0,0xb5,0x17,0xee,0x80,0x26,0x66,0xd1,0xcc,0xbb, + 0xfd,0xb0,0x6e,0x4,0x82,0x37,0xc1,0x1e,0x85,0xc0,0x31,0xb8,0xf2,0x23,0xf8,0x7d, + 0xbf,0xd7,0x57,0x2b,0x76,0xbf,0x62,0x8e,0x44,0x51,0x3e,0xe,0xde,0x50,0xef,0x1e, + 0xc2,0xb8,0x25,0x9b,0x4,0x46,0x89,0x1a,0x7b,0x31,0x10,0xa2,0x44,0x82,0x5a,0x80, + 0x4d,0xf5,0x30,0x94,0x83,0xbb,0x80,0x77,0x46,0xa4,0x3c,0xa5,0xd2,0xe7,0xb2,0xe5, + 0xa4,0x3f,0x42,0xc9,0xd4,0x40,0x18,0xe0,0x38,0x25,0x3a,0x1d,0x77,0xe2,0x17,0x10, + 0x62,0x26,0xd0,0xf4,0x7a,0x6a,0xd8,0xe5,0x7e,0x75,0x21,0xe6,0x31,0x79,0x51,0xe1, + 0xb0,0x84,0x3f,0xdf,0xf0,0xaf,0x4d,0x89,0x6a,0xd1,0x59,0xcc,0xc4,0x4b,0xf5,0xb3, + 0x8d,0x4a,0x36,0xf1,0xa3,0xfa,0x55,0xd2,0x87,0xff,0xfa,0xf,0x45,0xf6,0x6f,0x22, + 0x15,0xd8,0xdc,0x18,0x0,0x0,0x0,0x0,0x49,0x45,0x4e,0x44,0xae,0x42,0x60,0x82, + + // /home/denis/projects/QTicTacToe/ought.PNG + 0x0,0x0,0x7,0x40, + 0x89, + 0x50,0x4e,0x47,0xd,0xa,0x1a,0xa,0x0,0x0,0x0,0xd,0x49,0x48,0x44,0x52,0x0, + 0x0,0x0,0x32,0x0,0x0,0x0,0x32,0x8,0x6,0x0,0x0,0x0,0x1e,0x3f,0x88,0xb1, + 0x0,0x0,0x0,0x1,0x73,0x52,0x47,0x42,0x0,0xae,0xce,0x1c,0xe9,0x0,0x0,0x0, + 0x6,0x62,0x4b,0x47,0x44,0x0,0xff,0x0,0xff,0x0,0xff,0xa0,0xbd,0xa7,0x93,0x0, + 0x0,0x0,0x9,0x70,0x48,0x59,0x73,0x0,0x0,0xb,0x13,0x0,0x0,0xb,0x13,0x1, + 0x0,0x9a,0x9c,0x18,0x0,0x0,0x0,0x7,0x74,0x49,0x4d,0x45,0x7,0xdb,0x2,0xc, + 0xe,0x20,0x23,0xb9,0x46,0xd2,0x4e,0x0,0x0,0x0,0x19,0x74,0x45,0x58,0x74,0x43, + 0x6f,0x6d,0x6d,0x65,0x6e,0x74,0x0,0x43,0x72,0x65,0x61,0x74,0x65,0x64,0x20,0x77, + 0x69,0x74,0x68,0x20,0x47,0x49,0x4d,0x50,0x57,0x81,0xe,0x17,0x0,0x0,0x6,0x9b, + 0x49,0x44,0x41,0x54,0x68,0xde,0xed,0x9a,0xdb,0x6f,0x14,0x55,0x1c,0xc7,0x3f,0x33, + 0xb3,0xbb,0xb3,0xcb,0xb6,0xd0,0x16,0x5a,0x5a,0x49,0x5a,0x11,0xc4,0xd0,0x80,0xb1, + 0x50,0xae,0x92,0xc8,0x43,0x43,0xa2,0x3e,0x18,0xc0,0x46,0x1f,0xf8,0x3,0x4c,0x13, + 0xc1,0x28,0x86,0x4b,0x1a,0x15,0x44,0x2e,0x8a,0x1a,0x31,0x1,0xf1,0xc5,0x68,0xd4, + 0xc4,0x10,0xec,0x83,0xf,0x26,0x4d,0x13,0x2a,0x6d,0x4c,0xa4,0x21,0x90,0x80,0xc5, + 0x7,0x2e,0x6,0x22,0x37,0xb,0x94,0xcb,0xb6,0xbb,0xdd,0xce,0x8c,0xf,0xf3,0x9b, + 0xe5,0x30,0xdd,0xd9,0xdd,0xc2,0x36,0x60,0xc3,0x49,0x4e,0xb6,0x33,0xb3,0x3d,0xe7, + 0xf7,0x99,0xef,0x39,0xbf,0xf3,0x3b,0xbf,0xb3,0xf0,0xb8,0x3c,0x5a,0x45,0x1b,0xa3, + 0xb6,0xf2,0xb5,0xeb,0x4,0xfc,0xfd,0xd0,0x40,0xb4,0x2c,0x9f,0x5a,0xc0,0x33,0x27, + 0xcb,0xa7,0x13,0xf0,0x6c,0xd4,0x25,0xf4,0x80,0x10,0x9e,0x91,0xba,0xaf,0x6a,0xbe, + 0xe7,0xf8,0x8c,0x77,0x0,0xdb,0x57,0x1f,0x48,0x21,0xed,0x1,0x0,0x34,0xc5,0x70, + 0x43,0x5e,0x8a,0x7a,0x9d,0xb,0xc4,0x52,0x0,0x86,0x7d,0xd7,0x8e,0x4f,0xad,0xa2, + 0x2b,0xa2,0xe,0x15,0xcf,0x58,0x3,0x8,0x4b,0x3b,0xa1,0x37,0x61,0x45,0x29,0xac, + 0x8,0x41,0xbd,0x1,0x4f,0x84,0x60,0x92,0x6,0x31,0xc0,0x76,0x20,0x35,0xc,0x37, + 0x2d,0xb8,0x38,0xc,0xbd,0xb7,0xa1,0xfd,0x4b,0x68,0x17,0x90,0x61,0x20,0x2d,0x40, + 0xd6,0xfd,0x28,0xa4,0xdd,0x87,0xa,0xde,0xdb,0xf,0x1,0x91,0xa5,0x30,0x79,0x39, + 0xb4,0x46,0xa0,0x29,0xe,0xd5,0x25,0x40,0x54,0xa1,0xd3,0xa5,0x1,0xcf,0xc2,0x34, + 0x90,0x4,0xee,0x0,0x3,0x70,0x39,0x5,0x1d,0x9d,0xb0,0xed,0x77,0xb8,0x6,0xc, + 0x29,0x60,0xd6,0x68,0xd4,0xd1,0x46,0x1,0xa1,0x2b,0xa,0x44,0x80,0xf0,0x66,0xd8, + 0x1d,0x83,0xd5,0x15,0x10,0xf3,0x0,0xbc,0x31,0xe5,0x9f,0xbd,0xaa,0x9c,0xde,0xd8, + 0xf2,0x80,0xae,0xc3,0xe0,0x20,0x1c,0xdc,0xe,0xeb,0x85,0x75,0x48,0x51,0xc8,0x2e, + 0x4,0x46,0x1b,0x5,0x44,0x48,0x0,0x22,0x2d,0xf0,0x62,0x15,0x6c,0xa9,0x80,0xe9, + 0xe5,0x2,0xa0,0xcb,0x6b,0x1c,0x12,0x3,0x53,0x62,0x89,0xad,0x78,0x83,0x30,0x60, + 0xca,0xf7,0x23,0xd2,0xa0,0x2d,0xdf,0xbf,0xe1,0x2,0x9d,0xbb,0xa,0xef,0xef,0x85, + 0x5f,0xa5,0x29,0x4f,0xa1,0xbc,0x30,0xda,0x28,0x21,0xa2,0x1b,0xe1,0x9d,0x89,0xb0, + 0x7e,0x2a,0xe8,0xa5,0xa2,0xc0,0x10,0x90,0x0,0xfa,0x5d,0xa3,0x8e,0x25,0xe1,0x48, + 0x2,0x7a,0xce,0xc3,0xc9,0x83,0x70,0xfe,0x49,0x88,0xcc,0x87,0xea,0x5a,0x98,0x13, + 0x87,0x5,0x51,0x58,0x18,0x85,0x86,0x32,0x20,0x2e,0xd,0x5b,0xa2,0xce,0x65,0xb0, + 0x6f,0xc1,0xee,0x9d,0xf0,0xa9,0x30,0x16,0x4,0x93,0xf,0xc4,0x83,0x30,0x1,0x73, + 0x13,0x6c,0xad,0x80,0x37,0xaa,0xc5,0x80,0x61,0xe9,0xfc,0x5f,0x48,0x25,0xa0,0xed, + 0x14,0xec,0x39,0x0,0x67,0xb2,0x78,0x21,0xfc,0x5e,0xae,0x19,0x66,0xcc,0x86,0xb5, + 0x71,0x58,0x59,0x9,0x66,0x89,0x74,0x94,0x70,0x61,0xb8,0xe,0x5f,0xed,0x80,0xf7, + 0x44,0xdc,0x94,0xf,0x66,0x44,0x31,0xf2,0xa8,0xe1,0x29,0x61,0x6e,0x84,0x77,0x27, + 0xc3,0xba,0x1a,0xa0,0x44,0x5e,0x53,0x1f,0x70,0x5,0xba,0x8e,0xc3,0x9a,0x7d,0xf0, + 0x43,0x2f,0x5c,0x51,0x86,0x44,0x5a,0x99,0xb8,0xde,0xe4,0xf5,0x3e,0xad,0x5e,0xb8, + 0xf6,0x1b,0xb4,0x97,0xc3,0x2f,0x31,0x98,0xe5,0x40,0x9d,0x9,0x4c,0x90,0xb7,0x66, + 0x43,0xe3,0x3c,0x70,0xba,0xe1,0x8f,0x42,0x26,0xbd,0x91,0x3,0xc2,0x9b,0xd8,0x66, + 0xb,0xbc,0x54,0x9,0x1f,0x4f,0x3,0xad,0x44,0xf4,0xbe,0xe2,0x2a,0xb1,0x7f,0xb, + 0xb4,0x8,0x80,0x37,0x2d,0xd2,0xaa,0xc1,0x59,0x16,0x3e,0xb5,0x5a,0xbd,0x70,0xe3, + 0x10,0xfc,0x3c,0xf,0x4a,0x6d,0x68,0x8c,0xa,0x4c,0xc4,0x6d,0x70,0xc9,0x33,0xf0, + 0x67,0xf,0x9c,0xcd,0x37,0xb4,0x8c,0x1c,0x43,0xca,0xf0,0xd4,0x78,0x19,0xbe,0x9f, + 0x6,0x15,0x13,0xe5,0x55,0x5f,0x71,0xeb,0xae,0x8f,0x60,0xbb,0x0,0xc,0xf9,0xd6, + 0x81,0xa0,0xe,0xbd,0x7b,0xb6,0xb2,0xba,0x3b,0x80,0x73,0x18,0xba,0x1a,0xdc,0xeb, + 0x65,0x31,0xdc,0xc5,0x27,0x4,0xda,0x30,0x3c,0xd7,0x9,0xdf,0x64,0x59,0x30,0x73, + 0x82,0xf8,0xd5,0x88,0x6e,0x86,0xcf,0x2a,0xe1,0x85,0xa,0x69,0xa5,0xf,0xb8,0xa, + 0xfb,0xb7,0xbb,0x10,0xea,0x64,0x54,0x17,0x32,0xa7,0x80,0x80,0xd1,0x1f,0xae,0x38, + 0xdd,0xd0,0xd3,0x8,0x13,0xd,0x68,0x8c,0xdd,0x75,0x2,0xe5,0xd,0x50,0xdd,0x5, + 0x1d,0x59,0xe6,0x5d,0x4e,0x90,0x8c,0x1a,0x4b,0xa1,0x6a,0x36,0x7c,0x51,0x3,0x61, + 0x13,0xb8,0x25,0x73,0x62,0xb,0xb4,0x28,0x43,0x29,0x9f,0xa,0xf9,0xca,0x3d,0xff, + 0x73,0x18,0xba,0x17,0xc3,0x22,0x13,0xea,0x26,0xdc,0x75,0x0,0x4f,0xa7,0xe0,0xbb, + 0xb,0x30,0x10,0xd4,0x97,0x9e,0x43,0x91,0xd0,0x72,0x68,0xad,0x80,0x58,0x54,0xac, + 0xee,0x83,0xd4,0x9,0xd8,0xe0,0x9b,0xcc,0xf,0xa,0xe1,0x28,0x8e,0x20,0xd,0xc, + 0x9d,0x80,0xd,0x7d,0x90,0x4a,0xc9,0x9a,0x53,0x1,0xb1,0xe5,0xd0,0x2a,0x5c,0x59, + 0xe3,0x38,0x3d,0x8b,0x2b,0xce,0x4,0x81,0x11,0x68,0x2a,0x91,0x1b,0x9,0xb7,0xb6, + 0x1d,0x80,0xd3,0x45,0x82,0x8,0x84,0x39,0x0,0xa7,0x13,0xd0,0x96,0x90,0xbe,0x4b, + 0xdc,0x61,0xd6,0xa4,0x80,0xe8,0xfe,0xe5,0x43,0xf,0x1a,0x5a,0x2d,0xb0,0x22,0xe, + 0xd5,0x51,0x69,0xfd,0x26,0x70,0xa,0xf6,0x14,0x19,0x22,0x10,0xe6,0x14,0xec,0xb9, + 0x29,0x17,0x51,0x77,0xdd,0xaa,0x6e,0x81,0x15,0xa,0x88,0x96,0x6f,0x68,0xe9,0x80, + 0x51,0xe6,0x82,0x64,0x56,0xee,0x24,0x1c,0xf3,0x2d,0x76,0x45,0xd9,0xd9,0x65,0x1, + 0xb2,0x1,0xeb,0x0,0x9c,0x49,0xc2,0xb1,0x21,0xb1,0x21,0xe,0x94,0x15,0x8,0xa2, + 0x3e,0xd0,0x43,0x50,0x1f,0x93,0x9b,0x49,0xb7,0x1e,0xc9,0x12,0x66,0x3b,0x45,0x86, + 0xf0,0x5c,0xb3,0x5,0x58,0x49,0x38,0x92,0x14,0x1b,0xc4,0x1d,0xd7,0x7,0xd9,0x1c, + 0xa4,0x88,0x66,0x40,0x4d,0x58,0x6e,0xa6,0xdc,0xf9,0xd1,0x93,0xcf,0x97,0x17,0x71, + 0x88,0xd9,0x80,0x9d,0x80,0x9e,0x94,0x3c,0x8,0xbb,0x52,0xd4,0xa8,0x36,0xe6,0x1a, + 0x5a,0x19,0x20,0x3,0xca,0xc,0x69,0x35,0xd,0x9c,0x87,0x93,0x63,0xc,0x31,0x2, + 0xe6,0x3c,0x9c,0x4c,0xcb,0x85,0xec,0xe2,0xca,0x82,0xe2,0xc3,0x20,0xf7,0x8b,0xe, + 0xa6,0xa1,0x68,0x7d,0xd4,0x8d,0xe5,0xc6,0x1a,0xe2,0x1e,0x98,0xa3,0x70,0xd9,0x56, + 0x16,0x3c,0xdd,0xd,0xc3,0xc8,0xe7,0x7e,0xff,0xd7,0x45,0xf,0x90,0x15,0x1b,0x52, + 0x96,0xf2,0xa5,0xf9,0x50,0x1d,0x90,0x50,0x18,0xab,0x7c,0x9b,0x36,0x1f,0xaa,0xd5, + 0xad,0xb2,0xed,0x4e,0x57,0xa,0x59,0xd9,0x33,0x40,0x16,0xf4,0x5b,0xd2,0x62,0x18, + 0xa8,0x85,0x39,0xbe,0x54,0xcf,0x98,0x42,0x0,0x7a,0x2d,0xcc,0x9,0xcb,0x85,0xb8, + 0xcb,0xfe,0xa0,0xa1,0xad,0x7,0xf8,0x71,0xc7,0x82,0x4b,0x69,0xb9,0x69,0xba,0x7e, + 0x7c,0x41,0x96,0xbc,0xd5,0x98,0x41,0x0,0x7a,0x1c,0x16,0x78,0x93,0x42,0x82,0xba, + 0x4b,0xbe,0xa8,0x39,0x2b,0x88,0xfa,0xc0,0x1e,0x86,0xde,0x41,0xb9,0x19,0x75,0xeb, + 0x42,0x25,0x5,0xa4,0x8f,0x61,0xca,0x35,0x93,0x6a,0x92,0x2d,0x31,0xe,0x30,0xe8, + 0xae,0xf2,0xbd,0x41,0xa9,0xa2,0x20,0x45,0xac,0x7e,0x68,0x4f,0x88,0xa4,0x11,0x17, + 0xa4,0xa1,0x19,0x66,0x4,0xad,0xac,0x45,0x84,0xc9,0x6c,0x85,0xa3,0xd0,0xe0,0xed, + 0xe7,0x25,0x27,0xd0,0x1e,0x14,0x59,0x4,0x82,0xec,0x85,0xf6,0x1,0xb8,0x9c,0x94, + 0x48,0x6d,0x12,0x30,0x1b,0xd6,0x2a,0x29,0x2b,0xa3,0x88,0x43,0xcc,0x9f,0x33,0xb, + 0xcf,0x86,0xb5,0x93,0xe4,0x22,0x29,0x39,0xb0,0xbd,0x5,0x82,0xf8,0x43,0x84,0xe1, + 0x14,0x74,0xdc,0x91,0x1b,0x71,0xb7,0xae,0x6c,0x86,0x99,0x45,0x86,0x19,0x1,0xd1, + 0xc,0x33,0xe3,0xb0,0x32,0x2e,0x7d,0xdf,0x71,0xa3,0x8b,0x8e,0x5c,0x1b,0x38,0x3d, + 0x57,0x14,0xda,0x9,0xdb,0xae,0xc3,0x60,0x52,0x26,0xfc,0x14,0x30,0xe7,0xc2,0x2e, + 0x2f,0x41,0x57,0x4,0x98,0x11,0x10,0x40,0x64,0x2e,0xec,0x9a,0x2,0xa6,0x29,0x6a, + 0x5c,0x87,0xc1,0x4e,0xd8,0x96,0x2b,0xea,0x36,0x72,0xe4,0x77,0xb5,0xb,0x90,0x5e, + 0x2,0xb5,0x21,0x78,0x36,0x2e,0x30,0xe,0xd4,0xcd,0x83,0xd2,0xc3,0xd0,0x15,0x70, + 0x34,0x30,0x9a,0xec,0xa5,0xa6,0x38,0x90,0x8,0x10,0x6d,0x85,0xad,0x55,0xb0,0xaa, + 0x5c,0x1a,0xec,0x73,0xe7,0xc6,0x4f,0x3f,0x42,0x9b,0x2f,0xc7,0x55,0x50,0x3a,0x28, + 0xd3,0x61,0x17,0x1c,0x5a,0x4,0xab,0x63,0x50,0xae,0xa6,0x6a,0x1a,0xc0,0xee,0x76, + 0x3,0xc9,0x42,0xce,0x4b,0xfc,0x19,0x7c,0xcd,0x97,0x4,0x8f,0x0,0xd1,0x4d,0xf0, + 0x76,0x15,0xac,0xab,0x92,0x9b,0xb7,0xdc,0x1c,0xd7,0xb9,0xf,0xe1,0x35,0xdf,0xd6, + 0x3a,0xaf,0x22,0xd9,0x8c,0xd0,0xeb,0xe1,0x1f,0x1d,0x5e,0x89,0x81,0x36,0x41,0xdc, + 0x31,0xb0,0xac,0x11,0x26,0x1e,0x86,0xee,0x2c,0xc6,0x6,0xc1,0xf8,0x8f,0x21,0x3c, + 0x8,0x53,0x94,0x58,0x37,0x55,0xda,0x4f,0x0,0x17,0xc1,0xbe,0x4,0x6f,0xf5,0xc0, + 0x5f,0xa2,0x86,0x95,0x4d,0x8d,0x7c,0x8a,0x64,0x88,0x7b,0xe0,0xef,0x5,0xa0,0xd9, + 0xf0,0xbc,0x97,0x44,0x8b,0xb9,0x16,0x35,0x2e,0x86,0x45,0x53,0xe0,0x78,0x2f,0xdc, + 0xf6,0x19,0xeb,0xaf,0x86,0xf,0x20,0xc,0x98,0xcd,0x30,0xeb,0x75,0xf8,0xba,0x12, + 0x56,0x55,0x9,0xc4,0x80,0x64,0x1b,0x6f,0xc0,0x27,0x9f,0xc3,0xb7,0xf9,0xd4,0x28, + 0x64,0x68,0x65,0x54,0xea,0x86,0x23,0x8d,0x50,0x6a,0x41,0x63,0x44,0x40,0x62,0x6e, + 0xc7,0x75,0x65,0xb0,0x66,0x29,0x4c,0xaf,0x82,0xb3,0x2,0x64,0x28,0x8e,0x20,0xe4, + 0x7b,0xfb,0x11,0x20,0xd2,0xc,0xb3,0x5e,0x85,0xf,0x9e,0x84,0x9d,0x35,0xf0,0x54, + 0xb9,0x7c,0x21,0x81,0xbb,0x7c,0xdf,0x80,0x7d,0x3b,0xdc,0x94,0xd3,0x90,0xa2,0xc6, + 0x7d,0xe7,0x7e,0xc7,0x45,0x12,0x7b,0xdc,0x1c,0x2b,0x8c,0xab,0x83,0x9e,0x82,0x8f, + 0xde,0x4c,0x68,0x9a,0xf0,0x88,0x1f,0xbd,0x3d,0xac,0xc3,0xd0,0x51,0x9d,0xbd,0x8f, + 0x9b,0xe3,0xe9,0x62,0x4,0x7b,0x50,0xbc,0x1f,0xc,0xdc,0x77,0x72,0x63,0xdc,0xfc, + 0x84,0x63,0xdc,0xfc,0xa8,0xe6,0x71,0x79,0xd4,0xca,0x7f,0xc7,0x6d,0xf4,0xf7,0xf5, + 0x87,0x59,0xe8,0x0,0x0,0x0,0x0,0x49,0x45,0x4e,0x44,0xae,0x42,0x60,0x82, + +}; + +static const unsigned char qt_resource_name[] = { + // 1 + 0x0,0x1, + 0x0,0x0,0x0,0x31, + 0x0,0x31, + + // 2 + 0x0,0x1, + 0x0,0x0,0x0,0x32, + 0x0,0x32, + + +}; + +static const unsigned char qt_resource_struct[] = { + // : + 0x0,0x0,0x0,0x0,0x0,0x2,0x0,0x0,0x0,0x2,0x0,0x0,0x0,0x1, +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, + // :/1 + 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x0, +0x0,0x0,0x1,0x2e,0x1a,0x45,0xc7,0x40, + // :/2 + 0x0,0x0,0x0,0x8,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x9,0xc5, +0x0,0x0,0x1,0x2e,0x1a,0x49,0x9f,0xa0, + +}; + +#ifdef QT_NAMESPACE +# define QT_RCC_PREPEND_NAMESPACE(name) ::QT_NAMESPACE::name +# define QT_RCC_MANGLE_NAMESPACE0(x) x +# define QT_RCC_MANGLE_NAMESPACE1(a, b) a##_##b +# define QT_RCC_MANGLE_NAMESPACE2(a, b) QT_RCC_MANGLE_NAMESPACE1(a,b) +# define QT_RCC_MANGLE_NAMESPACE(name) QT_RCC_MANGLE_NAMESPACE2( \ + QT_RCC_MANGLE_NAMESPACE0(name), QT_RCC_MANGLE_NAMESPACE0(QT_NAMESPACE)) +#else +# define QT_RCC_PREPEND_NAMESPACE(name) name +# define QT_RCC_MANGLE_NAMESPACE(name) name +#endif + +#ifdef QT_NAMESPACE +namespace QT_NAMESPACE { +#endif + +bool qRegisterResourceData(int, const unsigned char *, const unsigned char *, const unsigned char *); +bool qUnregisterResourceData(int, const unsigned char *, const unsigned char *, const unsigned char *); + +#ifdef QT_NAMESPACE +} +#endif + +int QT_RCC_MANGLE_NAMESPACE(qInitResources_images)(); +int QT_RCC_MANGLE_NAMESPACE(qInitResources_images)() +{ + int version = 3; + QT_RCC_PREPEND_NAMESPACE(qRegisterResourceData) + (version, qt_resource_struct, qt_resource_name, qt_resource_data); + return 1; +} + +int QT_RCC_MANGLE_NAMESPACE(qCleanupResources_images)(); +int QT_RCC_MANGLE_NAMESPACE(qCleanupResources_images)() +{ + int version = 3; + QT_RCC_PREPEND_NAMESPACE(qUnregisterResourceData) + (version, qt_resource_struct, qt_resource_name, qt_resource_data); + return 1; +} + +namespace { + struct initializer { + initializer() { QT_RCC_MANGLE_NAMESPACE(qInitResources_images)(); } + ~initializer() { QT_RCC_MANGLE_NAMESPACE(qCleanupResources_images)(); } + } dummy; +} diff --git a/qtictactoeboard.cpp b/qtictactoeboard.cpp new file mode 100644 index 0000000..beb4c86 --- /dev/null +++ b/qtictactoeboard.cpp @@ -0,0 +1,83 @@ +#include "qtictactoeboard.h" +#include +#include + +QTicTacToeBoard::QTicTacToeBoard(QWidget *parent, int playersCount) : + QWidget(parent) +{ + currPlayer = 1; + boardPlayer = 0; + this->playersCount = playersCount; +} + +void QTicTacToeBoard::setBoardPlayer(int player) +{ + boardPlayer = player; + currPlayer = 1; +} + +void QTicTacToeBoard::setGame(QTicTacToeGame *game) +{ + this->game = game; + setGeometry(0,0,game->getSize()*cellSize,game->getSize()*cellSize); + + connect(game,SIGNAL(itemPuted(int,int,int)), this, SLOT(turn(int,int,int))); + + update(); +} + +void QTicTacToeBoard::turn(int /*x*/, int /*y*/, int /*player*/) +{ + currPlayer = (currPlayer == playersCount?1:currPlayer+1); + + update(); +} + +QSize QTicTacToeBoard::sizeHint() +{ + if (game) + return QSize(game->getSize()*cellSize, game->getSize()*cellSize); + else + return QSize(0,0); +} + +void QTicTacToeBoard::mousePressEvent(QMouseEvent *event) +{ + if (boardPlayer && currPlayer != boardPlayer) return; + + int x = event->x() / cellSize; + int y = event->y() / cellSize; + + game->put(x,y,currPlayer); +} + +void QTicTacToeBoard::paintEvent(QPaintEvent *) +{ + if (!game) return; + + QPainter painter(this); + painter.setRenderHint(QPainter::Antialiasing); + + painter.setPen(QPen(Qt::darkGreen, 1)); + + int size = game->getSize(); + + for (int i=1; iheight()); + painter.drawLine(0,i*cellSize,this->width(),i*cellSize); + } + + for (int i=0; igetPlayer(i,j); + + if (player) + { + painter.drawImage(i*cellSize, j*cellSize, QImage(QString(":/%1").arg(player))); + } + } + } +} diff --git a/qtictactoeboard.h b/qtictactoeboard.h new file mode 100644 index 0000000..dbe1870 --- /dev/null +++ b/qtictactoeboard.h @@ -0,0 +1,33 @@ +#ifndef QTICTACTOEBOARD_H +#define QTICTACTOEBOARD_H + +#include +#include "qtictactoegame.h" + +const int cellSize = 50; + +class QTicTacToeBoard : public QWidget +{ + Q_OBJECT +public: + explicit QTicTacToeBoard(QWidget *parent = 0, int playersCount = 2); + void setGame(QTicTacToeGame *game); + + void setBoardPlayer(int player); + +private: + QTicTacToeGame *game; + + void paintEvent(QPaintEvent *); + QSize sizeHint(); + void mousePressEvent(QMouseEvent *); + + int currPlayer; + int boardPlayer; + int playersCount; + +private slots: + void turn(int x, int y, int player); +}; + +#endif // QTICTACTOEBOARD_H diff --git a/qtictactoegame.cpp b/qtictactoegame.cpp new file mode 100644 index 0000000..3535e44 --- /dev/null +++ b/qtictactoegame.cpp @@ -0,0 +1,116 @@ +#include "qtictactoegame.h" + +QTicTacToeGame::QTicTacToeGame(int size, int countToWin, QObject *parent) : + QObject(parent) +{ + board = new int*[size]; + for (int i=0; isize = size; + this->countToWin = countToWin; + + clear(); +} + +void QTicTacToeGame::clear() +{ + aviableCells = size*size; + + for (int i=0; i=size||y>=size) return false; + + if (board[x][y]) return false; + + board[x][y] = player; + + emit itemPuted(x,y, player); + + if (checkFromPoint(x,y)) emit gameOver(player); + + aviableCells--; + + if (!aviableCells) + emit gameOver(0); + + return true; +} + +bool QTicTacToeGame::checkFromPoint(int x, int y) +{ + int currPlayer = board[x][y]; + int cnt = 0; + + int minXBorder = qMax(x-countToWin,0); + int maxXBorder = qMin(x+countToWin,size); + int minYBorder = qMax(y-countToWin,0); + int maxYBorder = qMin(y+countToWin,size); + + // check X axis + for (int i=minXBorder; i= 0 && vX >= x-countToWin && vY >=0 && vY >= y-countToWin && board[vX][vY] == currPlayer) + { + cnt++; vX--; vY--; + } + vX = x; vY = y; cnt--; + while (vX < size && vX < x+countToWin && vY < size && vY < y+countToWin && board[vX][vY] == currPlayer) + { + cnt++; vX++; vY++; + } + if (cnt>=countToWin) return true; + + // check BottomLeft - TopRight diag + vX = x; vY = y; cnt = 0; + while (vX >= 0 && vX >= x-countToWin && vY < size && vY < y+countToWin && board[vX][vY] == currPlayer) + { + cnt++; vX--; vY++; + } + vX = x; vY = y; cnt--; + while (vX < size && vX < x+countToWin && vY >=0 && vY >= y-countToWin && board[vX][vY] == currPlayer) + { + cnt++; vX++; vY--; + } + if (cnt>=countToWin) return true; + + return false; +} + +int QTicTacToeGame::getPlayer(int x, int y) +{ + Q_ASSERT(x>=0&&y>=0&&x + +class QTicTacToeGame : public QObject +{ + Q_OBJECT +public: + explicit QTicTacToeGame(int size = 3, int countToWin = 3, QObject *parent = 0); + bool put(int x, int y, int player); + int getPlayer(int x, int y); + Q_INVOKABLE int getSize(); + void clear(); + +private: + int **board; + int size, countToWin, aviableCells; + + bool checkFromPoint(int x, int y); + +signals: + void gameOver(int player); + void itemPuted(int x, int y, int player); + +public slots: + +}; + +#endif // QTICTACTOEGAME_H diff --git a/tictactoe_ru.ts b/tictactoe_ru.ts new file mode 100644 index 0000000..cf7ceee --- /dev/null +++ b/tictactoe_ru.ts @@ -0,0 +1,81 @@ + + + + + GameSettingsDialog + + + + Game settings + Настройки игры + + + + &Board size: + &Размер поля: + + + + &Count to win: + &Количество для победы: + + + + MainWindow + + + TicTacToe + Крестики нолики + + + + Game + Игра + + + + New game + Новая игра + + + + Start new game + Начать новую игру + + + + Ctrl+N + + + + + Game settings + Настройки игры + + + + Show game settings dialog + Показать диалог настроек игры + + + + Ctrl+P + + + + + Game over! Player %1 win! + Игра окончена! Победил игрок %1! + + + + Game over! No win! + Игра окончена! Ничья! + + + + Game over + Игра окончена + + +