00001 #include "oyatzee.h"
00002
00003
00004 #include <opie2/odebug.h>
00005 using namespace Opie::Core;
00006
00007
00008 #include <qmessagebox.h>
00009 #include <qpushbutton.h>
00010 #include <qpainter.h>
00011 #include <qlayout.h>
00012
00013
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
00054
00055
00056 if ( item == 7 || item == 8 || item == 16 ) return;
00057
00058
00059
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
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
00197 it = numbers.begin();
00198 int count;
00199 int temp;
00200 int countFH = 0;
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
00223 if ( count == 3 && countFH == 2 )
00224 posibilities.append( 11 );
00225 if ( count >= 4 )
00226 posibilities.append( 10 );
00227 if ( count == 5 )
00228 posibilities.append( 14 );
00229
00230 oakPoints = count * i;
00231 }
00232 }
00233
00234
00235 if ( numbers.find( 3 ) != numbers.end() && numbers.find( 4 ) != numbers.end() )
00236 {
00237 bool isLong = false;
00238 bool isShort = true;
00239
00240 if ( numbers.find( 2 ) != numbers.end() && numbers.find( 5 ) != numbers.end() )
00241 {
00242 isShort = true;
00243
00244
00245 if ( numbers.find( 1 ) != numbers.end() || numbers.find( 6) != numbers.end() )
00246 isLong = true;
00247 }
00248
00249 if ( numbers.find( 1 ) != numbers.end() && numbers.find( 2 ) != numbers.end() )
00250 isShort = true;
00251
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 );
00262
00263 displayPossibilites();
00264 }
00265
00266 void OYatzee::displayPossibilites()
00267 {
00268
00269
00270
00271
00272
00273
00274
00275
00276
00277
00278
00279
00280
00281
00282
00283
00284
00285
00286
00287
00288
00289
00290
00291
00292
00293
00294
00295
00296
00297
00298
00299
00300
00301
00302
00303
00304
00305
00306
00307
00308
00309
00310
00311
00312
00313
00314
00315 sb->pb->setIntlist( posibilities );
00316 sb->pb->update();
00317 }
00318
00319 void OYatzee::startGame()
00320 {
00321
00322
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
00363 ps.at(currentPlayer-1)->turn++;
00364
00365
00366 detectPosibilities();
00367 }
00368
00369
00370
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
00418
00419
00420
00421 }
00422
00423
00424
00425
00426 Dice::Dice( QWidget *parent , const char *name ) : QFrame( parent , name )
00427 {
00428 QTime t = QTime::currentTime();
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* )
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
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
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
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
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
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
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 );
00622 }
00623
00624
00625 void Resultboard::updateMap( int item , int points )
00626 {
00627 pMap.insert( item , points );
00628
00629 update();
00630 }
00631
00632
00633
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