From 1003de6f3b0c508960e0e717333a64603fffb133 Mon Sep 17 00:00:00 2001 From: leseb Date: Thu, 14 Mar 2002 10:31:39 +0000 Subject: Initial commit --- (limited to 'noncore/games/kcheckers/kcheckers.cpp') diff --git a/noncore/games/kcheckers/kcheckers.cpp b/noncore/games/kcheckers/kcheckers.cpp new file mode 100644 index 0000000..3df744e --- a/dev/null +++ b/noncore/games/kcheckers/kcheckers.cpp @@ -0,0 +1,382 @@ + +#include +#include +#include +#include +#include +#include +#include + +#include "kcheckers.h" +#include "echeckers.h" +#include "rcheckers.h" + +#include "pics/exit.xpm" +#include "pics/logo.xpm" +#include "pics/wood1.xpm" +#include "pics/wood2.xpm" +#include "pics/wood3.xpm" +#include "pics/marble1.xpm" +#include "pics/marble2.xpm" +#include "pics/marble3.xpm" +#include "pics/biglogo.xpm" +#include "pics/man_black.xpm" +#include "pics/man_white.xpm" +#include "pics/king_black.xpm" +#include "pics/king_white.xpm" +#include "pics/contexthelp.xpm" + + +const int KCheckers::t[]={6,7,8,9,11,12,13,14,17,18,19,20,22,23, + 24,25,28,29,30,31,33,34,35,36,39,40,41,42,44,45,46,47}; + +KCheckers::KCheckers():QMainWindow(0,0,WStyle_DialogBorder) +{ + setCaption("KCheckers"); + setIcon(QPixmap(biglogo)); + showMaximized(); + + QPopupMenu* gameMenu=new QPopupMenu; + gameMenu->insertItem(QPixmap(logo),tr("New"),this,SLOT(newGame())); + gameMenu->insertSeparator(); + gameMenu->insertItem(QPixmap(exit),tr("Quit"),qApp,SLOT(quit())); + + skillMenu=new QPopupMenu; + + skillMenu->insertItem(tr("Beginner"),this,SLOT(setSkillBeginner()),0,BEGINNER); + skillMenu->insertItem(tr("Novice"), this,SLOT(setSkillNovice()), 0,NOVICE); + skillMenu->insertItem(tr("Average"), this,SLOT(setSkillAverage()), 0,AVERAGE); + skillMenu->insertItem(tr("Good"), this,SLOT(setSkillGood()), 0,GOOD); + skillMenu->insertItem(tr("Expert"), this,SLOT(setSkillExpert()), 0,EXPERT); + skillMenu->insertItem(tr("Master"), this,SLOT(setSkillMaster()), 0,MASTER); + + optionsMenu=new QPopupMenu; + + optionsMenu->insertItem(tr("English Rules"),this,SLOT(setRulesEnglish()),0,ENGLISH); + optionsMenu->insertItem(tr("Russian Rules"),this,SLOT(setRulesRussian()),0,RUSSIAN); + optionsMenu->insertSeparator(); + optionsMenu->insertItem(tr("Marble Board"),this,SLOT(setPatternMarble()),0,MARBLE); + optionsMenu->insertItem(tr("Wooden Board"),this,SLOT(setPatternWood()), 0,WOOD); + + QPopupMenu* helpMenu=new QPopupMenu; + + helpMenu->insertItem(QPixmap(contexthelp),tr("What's This"),this,SLOT(whatsThis())); + helpMenu->insertSeparator(); + helpMenu->insertItem(QPixmap(logo),tr("About KCheckers"),this,SLOT(about())); + helpMenu->insertItem(tr("About &Qt"),this,SLOT(aboutQt())); + + menuBar()->insertItem(tr("Game"), gameMenu); + menuBar()->insertItem(tr("Skill"), skillMenu); + menuBar()->insertItem(tr("Options"),optionsMenu); + menuBar()->insertItem(tr("Help"), helpMenu); + + skill=NOVICE; + skillMenu->setItemChecked(skill,true); + + rules=ENGLISH; + optionsMenu->setItemChecked(rules,true); + + pattern=WOOD; + optionsMenu->setItemChecked(pattern,true); + + imageMan1=new QImage(man_black); + imageMan2=new QImage(man_white); + imageKing1=new QImage(king_black); + imageKing2=new QImage(king_white); + + imageWood1=new QImage(wood1); + imageWood2=new QImage(wood2); + imageWood3=new QImage(wood3); + imageMarble1=new QImage(marble1); + imageMarble2=new QImage(marble2); + imageMarble3=new QImage(marble3); + + imagePat1=imageWood1; + imagePat2=imageWood2; + imageFrame=imageWood3; + + QWidget* centralWidget=new QWidget(this); + setCentralWidget(centralWidget); + + QFrame* frame=new QFrame(centralWidget); + frame->setFrameStyle(QFrame::Box|QFrame::Plain); + frame->setFixedSize(SIZE*8+2,SIZE*8+2); + + QVBoxLayout* vlayout=new QVBoxLayout(centralWidget); + vlayout->addWidget(frame); + + statusLabel = new QLabel(centralWidget); + vlayout->addWidget(statusLabel); + + for(int i=0;i<64;i++) field[i]=new Field(frame,i); + + QGridLayout* grid=new QGridLayout(frame,8,8,1,0); + + for(int i=0;i<4;i++) + { + for(int k=0;k<4;k++) + { + grid->addWidget(field[i*8+k+32],i*2, k*2 ); + grid->addWidget(field[i*8+k ],i*2, k*2+1); + grid->addWidget(field[i*8+k+4 ],i*2+1,k*2 ); + grid->addWidget(field[i*8+k+36],i*2+1,k*2+1); + } + } + + for(int i=0;i<32;i++) + connect(field[i],SIGNAL(click(int)),this,SLOT(click(int))); + + userFirst=false; + + game=NULL; + newGame(); +} + + +void KCheckers::setSkill(int set) +{ + skillMenu->setItemChecked(skill,false); + + skill=set; + skillMenu->setItemChecked(skill,true); + + game->setLevel(skill); +} + + +void KCheckers::setRules(int set) +{ + optionsMenu->setItemChecked(rules,false); + + rules=set; + optionsMenu->setItemChecked(rules,true); + + colorChange(); + newGame(); +} + + +void KCheckers::setPattern(int set) +{ + optionsMenu->setItemChecked(pattern,false); + + pattern=set; + optionsMenu->setItemChecked(pattern,true); + + switch(pattern) + { + case MARBLE: + imagePat1=imageMarble1; + imagePat2=imageMarble2; + imageFrame=imageMarble3; + break; + case WOOD: + imagePat1=imageWood1; + imagePat2=imageWood2; + imageFrame=imageWood3; + } + + drawBoard(); + + if(selected) field[from]->draw(imageFrame); +} + + +void KCheckers::about() +{ + QMessageBox::about(this, "About", + "KCheckers, a board game. Ver 0.2\n" + "(C) 2002, A. Peredri \n\n" + "http://kcheckers.tuxfamily.org\n\n" + "Opie version by S.Prud'homme\n" + "\n\n" + "http://opie.handhelds.org\n\n" + "This program is distributed under the\n" + "terms of the GNU General Public\n" + "License."); +} + + +void KCheckers::aboutQt() +{ + QMessageBox::aboutQt(this); +} + + +void KCheckers::newGame() +{ + if(game) + { + delete game; + QWhatsThis::remove(this); + } + + switch(rules) + { + case ENGLISH: + game=new ECheckers(skill); + QWhatsThis::add(this, + "Rules of English Checkers" + "
    " + "
  • In the beginning of game you have
    12 checkers (men)." + "
  • Men move forward only." + "
  • Men capture by jumping forward only." + "
  • A man which reaches the far side of
    the board becomes a king." + "
  • Kings move forward or backward to
    one square." + "
  • Kings capture by jumping forward or
    backward." + "
  • Whenever a player is able to make
    a capture he must do so." + "
"); + break; + case RUSSIAN: + game=new RCheckers(skill); + QWhatsThis::add(this, + "Rules of Russian Checkers" + "
    " + "
  • In the beginning of game you have
    12 checkers (men)." + "
  • Men move forward only." + "
  • Men capture by jumping forward or
    backward." + "
  • A man which reaches the far side of
    the board becomes a king." + "
  • Kings move forward or backward to
    any number of squares." + "
  • Kings capture by jumping forward or
    backward." + "
  • Whenever a player is able to make
    a capture he must do so." + "
"); + } + + selected=false; + gameOver=false; + + colorChange(); + drawBoard(); + + if(!userFirst) compGo(); + + statusLabel->setText(tr("Go!")); +} + + +void KCheckers::colorChange() +{ + userFirst=!userFirst; + + QImage* image; + image=imageMan1; + imageMan1=imageMan2; + imageMan2=image; + image=imageKing1; + imageKing1=imageKing2; + imageKing2=image; +} + + +void KCheckers::drawBoard() +{ + // Drawing of start position + for(int i=0;i<32;i++) + { + field[i]->draw(imagePat2); + if(game->getBoard(t[i])==MAN1) field[i]->draw(imageMan1); + else if(game->getBoard(t[i])==MAN2) field[i]->draw(imageMan2); + else if(game->getBoard(t[i])==KING1) field[i]->draw(imageKing1); + else if(game->getBoard(t[i])==KING2) field[i]->draw(imageKing2); + } + + for(int i=32;i<64;i++) field[i]->draw(imagePat1); +} + + +void KCheckers::click(int fieldNumber) +{ + if(gameOver) return; + switch(game->getBoard(t[fieldNumber])) + { + case MAN1: + case KING1: + // User selected + if(!selected) + { + from=fieldNumber; + selected=true; + field[fieldNumber]->draw(imageFrame); + return; + } + // User reselected + else + { + field[from]->draw(imagePat2); + if(game->getBoard(t[from])==MAN1) field[from]->draw(imageMan1); + else field[from]->draw(imageKing1); + from=fieldNumber; + field[fieldNumber]->draw(imageFrame); + return; + } + case FREE: + if(!selected) return; + + if(!userGo(fieldNumber)) return; + selected=false; + + if(!(game->checkMove2() || game->checkCapture2())) + { + gameOver=true; + statusLabel->setText(tr("Congratulation! You have won!")); + return; + } + + statusLabel->setText(tr("Please wait...")); + qApp->processEvents(); + + compGo(); + if(!(game->checkMove1() || game->checkCapture1())) + { + gameOver=true; + statusLabel->setText(tr("You have lost. Game over.")); + return; + } + statusLabel->setText(tr("Go!")); + } +} + + +void KCheckers::compGo() +{ + int save[32]; + for(int i=0;i<32;i++) save[i]=game->getBoard(t[i]); + + game->go2(); + + for(int i=0;i<32;i++) + { + if(game->getBoard(t[i])==save[i]) continue; + field[i]->draw(imagePat2); + if(game->getBoard(t[i])==MAN1) field[i]->draw(imageMan1); + else if(game->getBoard(t[i])==MAN2) field[i]->draw(imageMan2); + else if(game->getBoard(t[i])==KING1) field[i]->draw(imageKing1); + else if(game->getBoard(t[i])==KING2) field[i]->draw(imageKing2); + } +} + + +bool KCheckers::userGo(int to) +{ + int save[32]; + for(int i=0;i<32;i++) save[i]=game->getBoard(t[i]); + + if(!game->go1(t[from],t[to])) + { + statusLabel->setText(tr("Incorrect course.")); + return false; + } + + for(int i=0;i<32;i++) + { + if(game->getBoard(t[i])==save[i]) continue; + field[i]->draw(imagePat2); + if(game->getBoard(t[i])==MAN1) field[i]->draw(imageMan1); + else if(game->getBoard(t[i])==MAN2) field[i]->draw(imageMan2); + else if(game->getBoard(t[i])==KING1) field[i]->draw(imageKing1); + else if(game->getBoard(t[i])==KING2) field[i]->draw(imageKing2); + } + return true; +} + + -- cgit v0.9.0.2