Main Page | Namespace List | Class Hierarchy | Alphabetical List | Class List | Directories | File List | Namespace Members | Class Members | File Members | Related Pages

oyatzee.cpp

Go to the documentation of this file.
00001 #include "oyatzee.h"
00002 
00003 /* OPIE */
00004 #include <opie2/odebug.h>
00005 using namespace Opie::Core;
00006 
00007 /* QT */
00008 #include <qmessagebox.h>
00009 #include <qpushbutton.h>
00010 #include <qpainter.h>
00011 #include <qlayout.h>
00012 
00013 /* STD */
00014 #include <stdlib.h>
00015 
00016 OYatzee::OYatzee( QWidget *parent , const char *name, WFlags fl ) : QMainWindow( parent , name , fl )
00017 {
00018         QWidget *thing = new QWidget( this );
00019         setCentralWidget( thing );
00020 
00021         setCaption( tr( "OYatzee" ) );
00022 
00023         setPlayerNumber( 4 );
00024         setRoundsNumber( 1 );
00025 
00026         lastPlayerFinished = false;
00027         currentPlayer = 1;
00028         
00029         ps.append( new Player( "Carsten" ) );
00030         ps.append( new Player( "Julia" ) );
00031         ps.append( new Player( "Christine" ) );
00032         ps.append( new Player( "Stephan" ) );
00033 
00034         
00035         QVBoxLayout *vbox = new QVBoxLayout( thing );
00036 
00037         sb = new Scoreboard( ps, thing , "sb" );
00038         connect( sb->pb , SIGNAL( item(int) ), this , SLOT( slotEndRound(int) ) );
00039         
00040         dw = new DiceWidget( thing , "dw" );
00041         dw->setMaximumHeight( this->height()/4 );
00042         connect( dw->rollButton, SIGNAL( clicked() ), this , SLOT( slotRollDices() ) );
00043         
00044         vbox->addWidget( sb );
00045         vbox->addWidget( dw );
00046 }
00047 
00048 void OYatzee::slotEndRound( int item )
00049 {
00050         odebug << "Der User hat Nummer " << item << " ausgewählt" << oendl; 
00051 
00052         /*
00053          * if the user clicked on Total, Bonus or Score and thus not on a 
00054          * selectable item return and do nothing
00055          */
00056         if ( item == 7 || item == 8 || item == 16 ) return;
00057 
00058         /*
00059          * check if the user can really click on that item
00060          */
00061         if ( posibilities.find( item ) == posibilities.end() ) return;
00062         
00063         QValueListInt numbers;
00064         
00065         Dice *d = dw->diceList.first();
00066         for ( ; d != 0 ; d = dw->diceList.next() )
00067         {
00068                 numbers.append( d->hasValue() );
00069         }
00070 
00071         int points = 0;
00072 
00073         switch ( item )
00074         {
00075                 case Ones:
00076                         points = getPoints( 1 , numbers );
00077                         break;
00078                 case Twos:
00079                         points = getPoints( 2 , numbers );
00080                         break;
00081                 case Threes:
00082                         points = getPoints( 3 , numbers );
00083                         break;
00084                 case Fours:
00085                         points = getPoints( 4 , numbers );
00086                         break;
00087                 case Fives:
00088                         points = getPoints( 5 , numbers );
00089                         break;
00090                 case Sixes:
00091                         points = getPoints( 6 , numbers );
00092                         break;
00093                 case ThreeOfAKind:
00094                         points = oakPoints;
00095                         break;
00096                 case FourOfAKind:
00097                         points = oakPoints;
00098                         break;
00099                 case FullHouse:
00100                         points = 25;
00101                         break;
00102                 case SStraight:
00103                         points = 30;
00104                         break;
00105                 case LStraight:
00106                         points = 40;
00107                         break;
00108                 case Yatzee:
00109                         points = 50;
00110                         break;
00111                 case Chance:
00112                         points = getPoints ( Chance , numbers );
00113         }
00114 
00115         sb->nextRB(currentPlayer-1)->updateMap( item , points );
00116         nextPlayer();
00117 
00118         odebug << "Punkte: " << points << "" << oendl; 
00119 }
00120 
00121 void OYatzee::nextPlayer()
00122 {
00123         currentPlayer++;
00124 
00125         if ( currentPlayer > numOfPlayers )
00126         {
00127                 currentPlayer = 1;
00128         }
00129         
00130         ps.at(currentPlayer-1)->turn = 0;
00131 }
00132 
00133 int OYatzee::getPoints( const int num , QValueListInt l)
00134 {
00135         QValueListInt::Iterator it = l.begin();
00136         int c = 0;
00137         
00138         if ( num != Chance )
00139         {       
00140                 for ( ; it != l.end() ; ++it )
00141                 {
00142                         if ( *it == num )
00143                                 c++;
00144                 }
00145 
00146                 return c * num;
00147         }
00148         else
00149         {
00150                 for ( ; it != l.end() ; ++it )
00151                 {
00152                         c += *it;
00153                 }
00154                 return c;
00155         }
00156 }       
00157 
00158 OYatzee::~OYatzee()
00159 {
00160 }
00161 
00162 void OYatzee::detectPosibilities()
00163 {
00164         posibilities.clear();
00165         odebug << "running detectPosibilities()" << oendl; 
00166         
00167         Dice *d = dw->diceList.first();
00168 
00169         QValueListInt numbers;
00170         
00171         for ( ; d != 0 ; d = dw->diceList.next() )
00172         {
00173                 numbers.append( d->hasValue() );
00174         }
00175         
00176         //the 6 numbers
00177         QValueListInt::Iterator it;
00178 
00179         for ( int i = 1 ; i < 7 ; ++i ) // check for 1-->6
00180         {
00181                 bool cont = false;
00182                 it = numbers.begin();
00183                 for ( ; it != numbers.end() ; ++it )
00184                 {
00185                         if ( cont )
00186                                 continue;
00187                 
00188                         if ( numbers.find( i ) != numbers.end() )
00189                         {
00190                                 posibilities.append( i );
00191                                 cont = true;
00192                         }
00193                 }
00194         }
00195                 
00196         //3er, 4er, Yatzee
00197         it = numbers.begin();
00198         int count;
00199         int temp;
00200         int countFH = 0; //for the full-house-check
00201 
00202         for ( int i = 1 ; i < 7 ; ++i ) // check for 1-->6 at least 3 times
00203         {
00204                 count = 0;
00205                 temp = 0;
00206                 it = numbers.begin();
00207                 for ( ; it != numbers.end() ; ++it )
00208                 {
00209                         if ( *it == i )
00210                         {
00211                                 count++;
00212                                 temp++;
00213                         }
00214                         if ( temp == 2 )
00215                                 countFH = temp;
00216                 }
00217                 
00218                 if ( count >= 3 )
00219                 {
00220                         posibilities.append( 9 );
00221 
00222                         //now we check if it is a full house
00223                         if ( count == 3 && countFH == 2 ) //aka Full House
00224                                 posibilities.append( 11 );
00225                         if ( count >= 4 )
00226                                 posibilities.append( 10 );
00227                         if ( count == 5 )                     //Yatzee
00228                                 posibilities.append( 14 );
00229                 
00230                         oakPoints = count * i;
00231                 }
00232         }
00233         
00234         //S-Straight
00235         if ( numbers.find( 3 ) != numbers.end() && numbers.find( 4 ) != numbers.end() )
00236         {
00237                 bool isLong = false;
00238                 bool isShort = true;
00239                 //L-Straight
00240                 if ( numbers.find( 2 ) != numbers.end() && numbers.find( 5 ) != numbers.end() )
00241                 {
00242                         isShort = true;
00243                 
00244                         //12345 or 23456
00245                         if ( numbers.find( 1 ) != numbers.end() || numbers.find( 6) != numbers.end() )
00246                                 isLong = true;
00247                 }
00248                 //1234
00249                 if ( numbers.find( 1 ) != numbers.end() && numbers.find( 2 ) != numbers.end() )
00250                         isShort = true;
00251                 //3456
00252                 if ( numbers.find( 5 ) != numbers.end() && numbers.find( 6 ) != numbers.end() )
00253                         isShort = true;
00254                 
00255                 if ( isShort )
00256                         posibilities.append( 12 );
00257                 if ( isLong )
00258                         posibilities.append( 13 );
00259         }       
00260         
00261         posibilities.append( 13 );        //Chance, well, this is allways possible
00262 
00263         displayPossibilites();
00264 }
00265 
00266 void OYatzee::displayPossibilites()
00267 {
00268 //X     for ( QValueListInt::Iterator it = posibilities.begin() ; it != posibilities.end(); ++it )
00269 //X     {
00270 //X             odebug << QString::number( *it ) << oendl; 
00271 //X             switch ( *it )
00272 //X             {
00273 //X                     case Ones:
00274 //X                             odebug << "1er" << oendl; 
00275 //X                             break;
00276 //X                     case Twos:
00277 //X                             odebug << "2er" << oendl; 
00278 //X                             break;
00279 //X                     case Threes:
00280 //X                             odebug << "3er" << oendl; 
00281 //X                             break;
00282 //X                     case Fours:
00283 //X                             odebug << "4er" << oendl; 
00284 //X                             break;
00285 //X                     case Fives:
00286 //X                             odebug << "5er" << oendl; 
00287 //X                             break;
00288 //X                     case Sixes:
00289 //X                             odebug << "6er" << oendl; 
00290 //X                             break;
00291 //X                     case ThreeOfAKind:
00292 //X                             odebug << "3oaK" << oendl; 
00293 //X                             break;
00294 //X                     case FourOfAKind:
00295 //X                             odebug << "4oaK" << oendl; 
00296 //X                             break;
00297 //X                     case FullHouse:
00298 //X                             odebug << "Full House" << oendl; 
00299 //X                             break;
00300 //X                     case SStraight:
00301 //X                             odebug << "Short S" << oendl; 
00302 //X                             break;
00303 //X                     case LStraight:
00304 //X                             odebug << "Long S" << oendl; 
00305 //X                             break;
00306 //X                     case Yatzee:
00307 //X                             odebug << "Yatzee!" << oendl; 
00308 //X                             break;
00309 //X                     case Chance:
00310 //X                             odebug << "Chance" << oendl; 
00311 //X                             break;
00312 //X             }
00313 //X     }
00314 
00315         sb->pb->setIntlist(  posibilities );
00316         sb->pb->update();
00317 }
00318 
00319 void OYatzee::startGame()
00320 {
00321         /*
00322          * TODO
00323          */
00324 }
00325 
00326 void OYatzee::stopGame(){}
00327 
00328 void OYatzee::setPlayerNumber( const int num )
00329 {
00330         numOfPlayers = num;
00331 }
00332 
00333 void OYatzee::setRoundsNumber( const int num )
00334 {
00335         numOfRounds = num;
00336 }
00337 
00338 void OYatzee::slotStartGame()
00339 {
00340 }
00341 
00342 void OYatzee::slotRollDices()
00343 {
00344         odebug << "Roll nummer: " << ps.at( currentPlayer-1 )->turn << "" << oendl; 
00345 
00346         if ( ps.at( currentPlayer-1 )->turn == 3 )
00347         {
00348                 QMessageBox::information(   this, 
00349                                                                         "OYatzee",
00350                                                                         tr( "Only three rolls per turn allowed." ) );
00351                 return;
00352         }
00353                 
00354         Dice *d = dw->diceList.first();
00355         
00356         for ( ; d != 0 ; d = dw->diceList.next() )
00357         {
00358                 if ( !d->isSelected )
00359                         d->roll();
00360         }
00361         
00362 //      odebug << "Roll nummer (vorher): " << ps.at( currentPlayer-1 )->turn << "" << oendl; 
00363         ps.at(currentPlayer-1)->turn++;
00364 //      odebug << "Roll nummer (nachher): " << ps.at( currentPlayer-1 )->turn << "" << oendl; 
00365 
00366         detectPosibilities();
00367 }
00368 
00369 /*
00370  * Scoreboard
00371  */
00372 Scoreboard::Scoreboard( playerList ps, QWidget *parent, const char *name ) : QWidget( parent , name )
00373 { 
00374         ps_ = ps;
00375 
00376         pb = new Possibilityboard( this , "pb" );
00377 
00378         createResultboards( 4 );
00379 
00380         QHBoxLayout *hbox = new QHBoxLayout( this );
00381 
00382         hbox->addWidget( pb );
00383 
00384         hbox->addSpacing( 25 );
00385 
00386         Resultboard *r = rbList.first();
00387         
00388         for ( ; r != 0 ; r = rbList.next() )
00389         {
00390                 hbox->addWidget( r );
00391         }
00392 }
00393 
00394 Resultboard* Scoreboard::nextRB( int currentPlayer )
00395 {
00396         Resultboard *b;
00397 
00398         b = rbList.at( currentPlayer );
00399         
00400         odebug << "Anzahl: " << rbList.count() << "" << oendl; 
00401 
00402         return b;
00403 }               
00404 
00405 void Scoreboard::createResultboards(const int num)
00406 {
00407         Player *p = ps_.first();
00408         for ( int i = 0 ; i < num ; ++i , p = ps_.next() )
00409         {
00410                 QString n = p->playerName;
00411                 rbList.append( new Resultboard( n , this ) );
00412         }
00413 }
00414 
00415 void Scoreboard::paintEvent( QPaintEvent * )
00416 {
00417 //X     QPainter p;
00418 //X     p.begin( this );
00419 //X 
00420 //X     p.drawRect( 0,0, this->width() , this->height() );
00421 }
00422 
00423 /*
00424  * Dice
00425  */
00426 Dice::Dice( QWidget *parent , const char *name ) : QFrame( parent , name )
00427 {
00428         QTime t = QTime::currentTime();   // set random seed
00429         srand(t.hour()*12+t.minute()*60+t.second()*60);
00430 
00431         connect( this , SIGNAL( selected() ), this , SLOT( slotSelected() ) );
00432 }
00433 
00434 void Dice::slotSelected()
00435 {
00436         if ( isSelected )
00437                 isSelected = false;
00438         else isSelected = true;
00439 
00440         update();
00441 }
00442 
00443 const int Dice::hasValue() const
00444 {
00445         return Value;
00446 }
00447 
00448 void Dice::roll()
00449 {
00450         Value = rand()%6;
00451         Value += 1;
00452 
00453         update();
00454 }
00455 
00456 void Dice::mousePressEvent( QMouseEvent* /*e*/ )
00457 {
00458             emit selected();
00459 }
00460 
00461 void Dice::paintEvent( QPaintEvent * )
00462 {
00463         QPainter p;
00464         p.begin( this );
00465 
00466         p.drawRect( 0,0, this->width() , this->height() );
00467 
00468         if ( isSelected )
00469                 p.drawRect( 20,20, 10,10 );
00470 
00471         paintNumber( &p );
00472 }
00473 
00474 void Dice::paintNumber( QPainter *p )
00475 {
00476         p->setBrush( Qt::black );
00477         
00478         int w = this->width();
00479         int h = this->height();
00480         int r = this->width();
00481         r /= 10;
00482         
00483         switch ( Value )
00484         {
00485                 case 1:
00486                         p->drawEllipse( (int)( 0.5*w - r ) , (int)( 0.5*h - r ) , r , r ) ;
00487                         break;
00488                 case 2:
00489                         p->drawEllipse( (int)( 0.3*w - r ) , (int)( 0.3*h - r ) , r , r ) ;
00490                         p->drawEllipse( (int)( 0.7*w - r ) , (int)( 0.7*h - r ) , r , r ) ;
00491                         break;
00492                 case 3:
00493                         p->drawEllipse( (int)( 0.5*w - r ) , (int)( 0.5*h - r ) , r , r ) ;
00494                         p->drawEllipse( (int)( 0.2*w - r ) , (int)( 0.2*h - r ) , r , r ) ;
00495                         p->drawEllipse( (int)( 0.8*w - r ) , (int)( 0.8*h - r ) , r , r ) ;
00496                         break;
00497                 case 4:
00498                         p->drawEllipse( (int)( 0.2*w - r ) , (int)( 0.2*h - r ) , r , r ) ;
00499                         p->drawEllipse( (int)( 0.8*w - r ) , (int)( 0.8*h - r ) , r , r ) ;
00500                         p->drawEllipse( (int)( 0.8*w - r ) , (int)( 0.2*h - r ) , r , r ) ;
00501                         p->drawEllipse( (int)( 0.2*w - r ) , (int)( 0.8*h - r ) , r , r ) ;
00502                         break;
00503                 case 5:
00504                         p->drawEllipse( (int)( 0.5*w - r ) , (int)( 0.5*h - r ) , r , r ) ;
00505                         p->drawEllipse( (int)( 0.2*w - r ) , (int)( 0.2*h - r ) , r , r ) ;
00506                         p->drawEllipse( (int)( 0.8*w - r ) , (int)( 0.8*h - r ) , r , r ) ;
00507                         p->drawEllipse( (int)( 0.8*w - r ) , (int)( 0.2*h - r ) , r , r ) ;
00508                         p->drawEllipse( (int)( 0.2*w - r ) , (int)( 0.8*h - r ) , r , r ) ;
00509                         break;
00510                 case 6:
00511                         p->drawEllipse( (int)( 0.2*w - r ) , (int)( 0.2*h - r ) , r , r ) ;
00512                         p->drawEllipse( (int)( 0.8*w - r ) , (int)( 0.8*h - r ) , r , r ) ;
00513                         p->drawEllipse( (int)( 0.8*w - r ) , (int)( 0.2*h - r ) , r , r ) ;
00514                         p->drawEllipse( (int)( 0.2*w - r ) , (int)( 0.8*h - r ) , r , r ) ;
00515                         p->drawEllipse( (int)( 0.2*w - r ) , (int)( 0.5*h - r ) , r , r ) ;
00516                         p->drawEllipse( (int)( 0.8*w - r ) , (int)( 0.5*h - r ) , r , r ) ;
00517                         break;
00518         }
00519 }
00520 
00521 /*
00522  * DiceWidget
00523  */
00524 DiceWidget::DiceWidget( QWidget *parent , const char *name ) : QWidget(  parent , name )
00525 {
00526         rollButton = new QPushButton( tr( "Roll" ) , this ) ;
00527         
00528         for ( int i = 0 ; i < 5 ; i++ )
00529         {
00530                 //appending the 5 dices of the game
00531                 diceList.append( new Dice( this, "wuerfel" ) );
00532         }
00533         
00534         QHBoxLayout *hbox = new QHBoxLayout( this );
00535 
00536         Dice *d = diceList.first();
00537         
00538         for ( ; d != 0 ; d = diceList.next() )
00539         {
00540                 hbox->addWidget( d );
00541         }
00542 
00543         hbox->addWidget( rollButton );
00544 }
00545 
00546 /*
00547  * Player
00548  */
00549 Player::Player( QString name )
00550 {
00551         playerName = name;
00552         setupResultList();
00553         turn = 0;
00554 }
00555 
00556 void Player::setupResultList()
00557 {
00558         for ( int i = 1 ; i < 14 ; ++i )
00559         {
00560                 pResults.append( 0 );
00561         }
00562 }
00563 
00564 /*
00565  * TODO: muss noch genutzt werden
00566  */
00567 void Player::updateTotalPoints( pointMap m )
00568 {
00569         pointMap::Iterator it = m.begin();
00570         for ( ; it != m.end() ; ++it )
00571         {
00572                 totalPoints += it.data();
00573         }
00574         
00575 }
00576 
00577 
00578 void Player::setResults( const int cat , const int points )
00579 {
00580         QValueListInt::Iterator it = pResults.at( cat );
00581         *it = points;
00582 }
00583 
00584 /*
00585  * Board
00586  */
00587 Board::Board( QWidget *parent , const char* name ) : QWidget ( parent , name )
00588 {
00589 }
00590 
00591 void Board::mousePressEvent( QMouseEvent *e )
00592 {
00593         emit clicked( e->pos() );
00594 }
00595 
00596 /*
00597  * Resultboard
00598  */
00599 
00600 Resultboard::Resultboard( QString playerName , QWidget *parent , const char* name ) : Board ( parent , name )
00601 {
00602         pName = playerName;
00603 }
00604 
00605 void Resultboard::paintEvent( QPaintEvent* )
00606 {
00607         QPainter p;
00608         p.begin( this );
00609         
00610         const int cell_width = this->width();
00611         const int cell_height = this->height()/17;
00612         
00613         pointMap::Iterator it = pMap.begin();
00614         for ( ; it != pMap.end() ; ++it )
00615         {
00616                 int i = it.key();
00617                 odebug << "ok: " << i << " , " << it.data() << "" << oendl; 
00618                 p.drawText( 0, i*cell_height , cell_width , cell_height , Qt::AlignCenter , QString::number( it.data() ) );
00619         }
00620 
00621         p.drawText( 0,0,cell_width,cell_height, Qt::AlignCenter , pName ); //Playername
00622 }
00623 
00624 
00625 void Resultboard::updateMap( int item , int points )
00626 {
00627         pMap.insert( item , points );
00628 
00629         update();
00630 }
00631 
00632 /*
00633  * Possibilityboard
00634  */
00635 
00636 Possibilityboard::Possibilityboard( QWidget *parent , const char* name ) : Board ( parent , name )
00637 {
00638         begriffe.append( "1er" );
00639         begriffe.append( "2er" );
00640         begriffe.append( "3er" );
00641         begriffe.append( "4er" );
00642         begriffe.append( "5er" );
00643         begriffe.append( "6er" );
00644         begriffe.append( "Total" );
00645         begriffe.append( "Bonus" );
00646         begriffe.append( "3oaK" );
00647         begriffe.append( "4oaK" );
00648         begriffe.append( "Full House" );
00649         begriffe.append( "Short S" );
00650         begriffe.append( "Long S" );
00651         begriffe.append( "Yatzee!" );
00652         begriffe.append( "Chance" );
00653         begriffe.append( "Score" );
00654         
00655         connect( this , SIGNAL( clicked(QPoint) ), this , SLOT( slotClicked(QPoint) ) );
00656 }
00657 
00658 void Possibilityboard::slotClicked( QPoint p)
00659 {
00660         emit item( p.y()/(this->height()/17) );
00661 }
00662 
00663 void Possibilityboard::paintEvent( QPaintEvent* )
00664 {
00665         QPainter p;
00666         p.begin( this );
00667 
00668         const int cell_width = this->width();
00669         const int cell_height = this->height()/17;
00670 
00671         p.setBrush( Qt::blue );
00672 
00673         QValueListInt::Iterator listIt = list.begin();
00674         for ( ; listIt != list.end() ; ++listIt )
00675         {
00676                 p.drawRect( 0 , (*listIt) * cell_height , cell_width , cell_height );
00677         }
00678 
00679         p.setBrush( Qt::black );
00680         p.setBrush( Qt::NoBrush );
00681         QStringList::Iterator begriffeIt = begriffe.begin();
00682         for ( int i = 1 ; i < 18 ; ++i )
00683         {
00684                 p.drawText( 0 , i*cell_height , cell_width , cell_height , Qt::AlignCenter , *begriffeIt );
00685                 ++begriffeIt;
00686         }
00687 }
00688 
00689 void Possibilityboard::setIntlist( QValueListInt &l )
00690 {
00691         list = l;
00692 }
00693 

Generated on Sat Nov 5 16:17:23 2005 for OPIE by  doxygen 1.4.2