From 289ad112e34b2af8d98727b12a04ed1d72d041f7 Mon Sep 17 00:00:00 2001 From: "Denis V. Dedkov" Date: Sat, 30 Nov 2024 09:36:15 +0200 Subject: [PATCH] Initial commit --- QTicTacToe.pro | 37 ++++ cross.PNG | Bin 0 -> 2497 bytes gamesettingsdialog.cpp | 51 ++++++ gamesettingsdialog.h | 34 ++++ gamesettingsdialog.ui | 126 ++++++++++++++ i18n/qt_ru_RU.qm | Bin 0 -> 239279 bytes i18n/tictactoe_ru_RU.qm | Bin 0 -> 1200 bytes images.qrc | 6 + main.cpp | 26 +++ mainwindow.cpp | 250 +++++++++++++++++++++++++++ mainwindow.h | 66 ++++++++ mainwindow.ui | 123 ++++++++++++++ ought.PNG | Bin 0 -> 1856 bytes qrc_images.cpp | 365 ++++++++++++++++++++++++++++++++++++++++ qtictactoeboard.cpp | 83 +++++++++ qtictactoeboard.h | 33 ++++ qtictactoegame.cpp | 116 +++++++++++++ qtictactoegame.h | 30 ++++ tictactoe_ru.ts | 81 +++++++++ 19 files changed, 1427 insertions(+) create mode 100644 QTicTacToe.pro create mode 100644 cross.PNG create mode 100644 gamesettingsdialog.cpp create mode 100644 gamesettingsdialog.h create mode 100644 gamesettingsdialog.ui create mode 100644 i18n/qt_ru_RU.qm create mode 100644 i18n/tictactoe_ru_RU.qm create mode 100644 images.qrc create mode 100644 main.cpp create mode 100644 mainwindow.cpp create mode 100644 mainwindow.h create mode 100644 mainwindow.ui create mode 100644 ought.PNG create mode 100644 qrc_images.cpp create mode 100644 qtictactoeboard.cpp create mode 100644 qtictactoeboard.h create mode 100644 qtictactoegame.cpp create mode 100644 qtictactoegame.h create mode 100644 tictactoe_ru.ts 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 0000000000000000000000000000000000000000..1ca9fda6838e6a232b1243d5888799a137ccf5e4 GIT binary patch literal 2497 zcmV;y2|o6TP)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2ipP+ z4jdQj0bc|F000?uMObu0Z*6U5Zgc=ca%Ew3Wn>_CX>@2HM@dakSAh-}000RbNklM3vgjBJ;j^o|6y+5}Uk&fI&xd(J(7v+)1d|MpA#x2`J|Fp2XK0yql+QQsMI=#v%XyR$^X ztD&!3(AJ&tGRsV+gtvfzd=EoQ2yUwdmcq>RH3QHRf!mf3PK_cUtIT9VerLHieDgDq zuZ2P$64&6*SAdMXE`Nti&d}Bj!RJ@O@)clMV2wlHN%>t~j>2rFrFPo{g065s*aPA1 zkZJ|zDrB#~pS}YlAIR&ofIXYqD>Nmgi7Vm%7HLjZ@Wsv0{3KL;0YY&I#=vTV;Jwg! z7X&ZBVA{WNW{F8nSW^R^?uP1bgV6*53xWay1_Vs7+948$=0UhPtnJKvVSEtVI-zAZ z)O;4I4X85Qbqx~=0Wj;K_6m#-Kq9BZSTi+Z2`~a+H$kq>)r7J%1F!{zfMAdNzirRM z;nUh2`3ixIVsqNo39Y*!(gP7(08`4E1#$*tmVw>u$~SW|-K-obhXC7voD>|nUId5& zwLl$E+XHR8VMnJc%(RD_%d7byc67S))b_aZMu8evNz;363r`+r#@v=KK1i7NZ^PyR z2-kTVY)GvHkEgEi}+`8u2*@*RGsgeHQ;5YZl2%L+to zRt}g1CV=z^jP=3U!*C-hzbwoa5T)7@d6@VYG&m4iTMT1rK+{èur9)R;VOE>^M zPK05{W)C8&L0Ixu1(60)!!Y(+cojl z!qo$iOltFMZXE~iu7@ozLG%Gv6SeX@=$e=SQWE0UemKeKr7M(9sQpufup!BQ@Rm?rDTwhoI(@GtEhPs7VbXu^-;*g9}5zR5`C` z&H|w)h(VaT1dT}$Yk_J{aMO2gOh7ckhHkie2*y%UeFbQZ!8Z=O5K-x!^fQr_rj!Jd z!!WiFPWHitVGW|-Pfse*hz2u~g^5ehSO7!9sO-Y@4GRb~!p8Nm_Bxy%h9^D+-Ost^ zRO8-G7%x^#X%OSXaBCl&=!5ffLd*qH0gR|F22f`wq#RQ_ERVz105m@?Ben)1b5b($ zOz04QeHqS=R01)dice4LL+)w(?vJ7VX*YnWAf^tikZY=3l1UI%p7so%drbo4z!;F| zg%^9}PGl;9s6->BG=saynd7kDfk0QWHp1F_Si(gts1okykhW}AYGPc%B=*3sd*wwH zL(B)HOwfG$7~Bhlx?GTu9Mb@DgoOuaY6n|+r`y2D9{8mn!md;(bAb@b{e@uiBD5r- zsslpR#hOsU2Q{yzTT~1~Xls>rrl&H_hXtai;x@E4z!QhS+~`3l z_nY@^c0r$FBYf`=tZI;7>gkMFYSYq-q7dx5AGSURH4k`!PF0fy4J50Lj6NFO5@5x3 zI5$+np)3iAud>^@8CsrlBeq@?Sz6Vr1Xu4lt)nwN+94Q+dj{dX1;LmLFelk2YOaR| zwNzY{ra>)gE8!;{$cSR6N|>7Y5N3hp!#4w3>62@38h@PVd-M`~;__|LMdOeZRQ*mJAS$L)wSO#yr0UI5#A1Vg% z7iK~hXKNmYfg_MgYpO1r?3xvtlYn?5eDxqieGpa&h@{M&p6``5mvd>~JO=9ly1a8D zd=;k-^YLy8lk&wEXFlC{)9cGL#$o3{h;Hy|>~av}z~~bMIdy1Wil zsj^v_*=h-sPW#TxoTaW$6R|ja`2f^z@HC+}&N4FjQ<_Nh!moOL5O#5*dHOi46JT@| zKMI*)V$uP$cf;UONT;*_H7khT?GVt=1dkr@G*RQzM79LPZ%RS4y#h=9Xd@ z!}n~d0N62T-3r%^z(h%yQXq0$Vh!-6-$CR)R}0nJ!S-t+r6BhDDm&ZP#q+uP1xTHBYVBNeO#`Sk(UZ(2_g4c%~am+hRvDhBWOZh7&f&)q#MkjXOcNBTBm`; zUU=yzvzSw*bxp|C%qIXLHKS`nnU^sE{1Gm{50gdDM@o1tTfn3ZD+R=My4?>|5KRIT z4x|N)?uA#BCZ>E%<@wYTN=pIw`w3VLu*Cz>&$Mw1248?P*ZftaSw5P-cO9C~!Se0y z)1t`⩔?cg3(@hO=)5=5X^J{=T1PI;16#~x$|>1u{CwSdl{Nf zLY)m0x4}6D$yeaD7w&*2X3@;M{jhEXf;Yh)g}^bm@+0_tzt>kQcE4hdL{UBt-cauz z!nh@y1V)J(dod8AM1op?P4zI8gS&utMx;EY(&w_}q(4H*)Ib>EI3+qAcj6ZiVkXe^ zdTQ9^esv+{F?mtpu!KL~@UKmYYSCHD#7p(FjY>B0qxx0ShyVHyMfPtZ71-Pu00000 LNkvXXu0mjf3K@G} literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..94e7989ea6f8500e81687838127fa6e6a9f0c82f GIT binary patch literal 239279 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

d2Mlc%t6Tw>*(XTA&zJMmKAoK6xa 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 U)ZZU@?*H!j%IM#Z?|A9|0ousrD*ylh literal 0 HcmV?d00001 diff --git a/i18n/tictactoe_ru_RU.qm b/i18n/tictactoe_ru_RU.qm new file mode 100644 index 0000000000000000000000000000000000000000..39c57fa2a4089b111100ea1364eb2f1119fd24b4 GIT binary patch literal 1200 zcmbW0O=}ZT6o&64hc-={f;EdawDyjWfFDR=5=@h3OcNns+gM0IaOKbp=|G&(WMWVk zZbd{FqANEp#6?}W5OgEDE+|wH+_-b^FR1mMoAkDlNd>dWojY^RbKdi{_^v*^_3PP_ zPwMQ4tIyy6C^E*bGy0xpOu48mJWk^Nx_A2SD|a4j;lAqo__NHIKjiPKuva>?`S3SR zMw^fDS&7p2Mi38dWd6-J*xeoVzgoikw}F@2FL3`nzI){cW4@`0r(ZibznF|s*bj#Y zixHP@?$ zxUe&TMTC2X%D^pAk%W52LjKBRBV8h42*uZT*k zUg*L<(DRVnYhi|Rvi3-WaTaBX0|94b3MyY~>bHy*k0#s>d&d3W&i>Ub^dXGoHH=*x z$?r|Zepv$*qstpZ`jRC#xvW@+I7Vy*fD|ej$MkBH#0?#i!W1BmAm@+Q z#fo?p`?whAGN`?1c_F<-6-h41{!LaLz2$K0kOYol{R;iX%k+1{MdlzAn<7zTHFLeD auh;B>@w|r$hK?vZC&qWfKH51QJo*Q_AmXzC literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..e8a07e2122706a0b852c841d957d4c779d77038d GIT binary patch literal 1856 zcmV-G2fz4Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2ipP+ z4j?1BM$%3I000?uMObu0Z*6U5Zgc=ca%Ew3Wn>_CX>@2HM@dakSAh-}000J?Nkl1pNKbK(s8MTEH_W%cm3YY}6(6fDoRMy02=! z=lG0w0NYm|NFnV305rvLLtct{oeRWL0ET_nj!&(kE20h+&sYNpOFN-AVMQsd2tmC8 zPlRBS1~I^PATU^+YbSer7(Fpv__yQ4%H<< zRH4(Q0nfrTkOb}k18_M79i6c4cen-&DPY!U)X_!(p(_eRfbeG69fQ>s5c2@MG3B4V zs+``~@_??x;2<2_4(o+=NKwcx1V$SLL`VQ4E%0I$Y^i|hROl+hXqks7=?y1ATAACqRwToZ^7=J@To8s1d|WMgD?Se6Kt)3H>$;e zVd?x|NF|`{6zn+wXR>%9{9djZX3U1QaadUiW{Gr^aACL(U+sYRMBJ1QW<)XasNpGL zZiIIy!@3%vL|#)La0R-K!lZide);e`rmr4P6Y`?tFg>SR2 za~Qf8!y*&vCfs!ZPp9C!3osDWm!3nB&~j+4fLK(l?t|0`*x;MY4+`NZjvx&Toq!E} zkV?s#QvtE%&?;P6<2XHwE6xOg5ojur8wt0z9e~qCf(V2;0H+hsmXN+n++o(Ffaw0^ zLk}8SEwCaE)lq5vCU6S&6d58A<`nF?DHl<9-KuVZ6$*%!Z)oX&QRaeVR_-Jm^DTBo z+1X_QvH|M=oJqp5A+aG2lobe~KF~u@ACsF&w;st7W;;cO@LaP6SV=gN6dS}H*9X}g zq=;rfO;~QG-1*Uy&zBc*h}nRhfS!~*2)k0$s5a&rS{Wb%$_!~W4V;IQV+=6@<~*EC z%Z2RX%7WsJOTMT%D~S5Q9){jQxfylqLL~*Hk73F+lWLMJF%B^3 zuJXM>siGi7tbS-uh@=r0q@fvR1g)$^gvo4$qtM{(=Ori59u!#wg6xI%0l1u$NNo}@ z8`df*E2D@*%%3w0&xW;=_(O!@6m;B?8*#U;Y=)Udh8Y3T3^U`fGA@1J zaifclTpKt&R}|U_+pfc4QYQQqFz3Q9FF{uXm=O>_WG?KQ0;VZyT!+C<*p@5mHge>5 zwF{750<|G{HZCv@)Xjs^!_XCQG%%X%rKUKL2oPUnx2vd|;H&xnC02jf&1aI}gU!sPUO^tkt zWQcp zxB1j4WN2kn>V_kYP-;PAL_lJ0$8}|}W+_asg0li-D2^cHd;1X}(hRd+g%6&Doi*@O zxqKmkyL{h(eLLKg(~zRZedm71MG|}594m~ggPwwq-b`qk@Q5G1J*>mfQJuYyo8#$X u1ba}t9}L`ga%0^5gk#+NsOE8b)XIOyZS?o`hgs+V0000 +#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 + Игра окончена + + +