summaryrefslogtreecommitdiff
authorerik <erik>2007-01-19 01:10:09 (UTC)
committer erik <erik>2007-01-19 01:10:09 (UTC)
commit2b45dc71e79a3eb7d4e8553273c9bc4f4282d50a (patch) (unidiff)
tree5f1b129bf6864ad8c47054471a0c4a34badeeebe
parentca67251af3f46d685afac8dc6bfe452799c2546e (diff)
downloadopie-2b45dc71e79a3eb7d4e8553273c9bc4f4282d50a.zip
opie-2b45dc71e79a3eb7d4e8553273c9bc4f4282d50a.tar.gz
opie-2b45dc71e79a3eb7d4e8553273c9bc4f4282d50a.tar.bz2
BUG: There are only 4095 items in the buffer that is zero'd out using 4096.
FIX: Fix the number used in memset.
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--noncore/games/wordgame/wordgame.cpp2
1 files changed, 1 insertions, 1 deletions
diff --git a/noncore/games/wordgame/wordgame.cpp b/noncore/games/wordgame/wordgame.cpp
index 52e2be2..8cf92ef 100644
--- a/noncore/games/wordgame/wordgame.cpp
+++ b/noncore/games/wordgame/wordgame.cpp
@@ -399,385 +399,385 @@ void Rules::editRules()
399} 399}
400 400
401void Rules::deleteRuleSet() 401void Rules::deleteRuleSet()
402{ 402{
403 // ### delete existing rule set 403 // ### delete existing rule set
404 emit rulesChanged(); 404 emit rulesChanged();
405} 405}
406 406
407void WordGame::addPlayer(const QString& name) 407void WordGame::addPlayer(const QString& name)
408{ 408{
409 if ( !name.isEmpty() ) { 409 if ( !name.isEmpty() ) {
410 int colon = name.find(':'); 410 int colon = name.find(':');
411 int cpu = (colon >=0 && name.left(2) == "AI") ? name.mid(2,1).toInt() : 0; 411 int cpu = (colon >=0 && name.left(2) == "AI") ? name.mid(2,1).toInt() : 0;
412 addPlayer(name,cpu); 412 addPlayer(name,cpu);
413 } 413 }
414} 414}
415 415
416void WordGame::addPlayer(const QString& name, int cpu) 416void WordGame::addPlayer(const QString& name, int cpu)
417{ 417{
418 Rack* r = new Rack(rack_tiles,racks); 418 Rack* r = new Rack(rack_tiles,racks);
419 r->setPlayerName(name); 419 r->setPlayerName(name);
420 r->setComputerization(cpu); 420 r->setComputerization(cpu);
421 racks->addWidget(r, nplayers); 421 racks->addWidget(r, nplayers);
422 refillRack(nplayers); 422 refillRack(nplayers);
423 namelist.append(name); 423 namelist.append(name);
424 424
425 ++nplayers; 425 ++nplayers;
426} 426}
427 427
428void WordGame::nextPlayer() 428void WordGame::nextPlayer()
429{ 429{
430 if ( !refillRack(player) ) { 430 if ( !refillRack(player) ) {
431 endGame(); 431 endGame();
432 } else { 432 } else {
433 player = (player+1)%nplayers; 433 player = (player+1)%nplayers;
434 scoreinfo->setBoldOne(player); 434 scoreinfo->setBoldOne(player);
435 readyRack(player); 435 readyRack(player);
436 } 436 }
437} 437}
438 438
439bool WordGame::mayEndGame() 439bool WordGame::mayEndGame()
440{ 440{
441 int out=-1; 441 int out=-1;
442 int i; 442 int i;
443 for (i=0; i<nplayers; i++) 443 for (i=0; i<nplayers; i++)
444 if ( !rack(i)->count() ) 444 if ( !rack(i)->count() )
445 out = i; 445 out = i;
446 if ( out<0 ) { 446 if ( out<0 ) {
447 if ( QMessageBox::warning(this,tr("End game"), 447 if ( QMessageBox::warning(this,tr("End game"),
448 tr("Do you want to end the game early?"), 448 tr("Do you want to end the game early?"),
449 tr("Yes"), tr("No") )!=0 ) 449 tr("Yes"), tr("No") )!=0 )
450 { 450 {
451 return FALSE; 451 return FALSE;
452 } 452 }
453 } 453 }
454 return TRUE; 454 return TRUE;
455} 455}
456 456
457void WordGame::endGame() 457void WordGame::endGame()
458{ 458{
459 if ( gameover ) { 459 if ( gameover ) {
460 close(); 460 close();
461 return; 461 return;
462 } 462 }
463 463
464 if ( !mayEndGame() ) 464 if ( !mayEndGame() )
465 return; 465 return;
466 int out=-1; 466 int out=-1;
467 int totalleft=0; 467 int totalleft=0;
468 int i; 468 int i;
469 for (i=0; i<nplayers; i++) { 469 for (i=0; i<nplayers; i++) {
470 Rack* r = rack(i); 470 Rack* r = rack(i);
471 int c = r->count(); 471 int c = r->count();
472 if ( c ) { 472 if ( c ) {
473 int lose=0; 473 int lose=0;
474 for ( int j=0; j<c; j++ ) 474 for ( int j=0; j<c; j++ )
475 lose += r->tileRef(j)->value(); 475 lose += r->tileRef(j)->value();
476 totalleft += lose; 476 totalleft += lose;
477 scoreinfo->addScore(i,-lose); 477 scoreinfo->addScore(i,-lose);
478 } else { 478 } else {
479 out = i; 479 out = i;
480 } 480 }
481 } 481 }
482 int highest=0; 482 int highest=0;
483 int winner=0; 483 int winner=0;
484 for (i=0; i<nplayers; i++) { 484 for (i=0; i<nplayers; i++) {
485 int s = scoreinfo->playerScore(i); 485 int s = scoreinfo->playerScore(i);
486 if ( s > highest ) { 486 if ( s > highest ) {
487 highest = s; 487 highest = s;
488 winner = i; 488 winner = i;
489 } 489 }
490 } 490 }
491 if ( out >= 0 ) 491 if ( out >= 0 )
492 scoreinfo->addScore(out,totalleft); 492 scoreinfo->addScore(out,totalleft);
493 scoreinfo->setBoldOne(winner); 493 scoreinfo->setBoldOne(winner);
494 gameover = TRUE; 494 gameover = TRUE;
495 done->setEnabled(TRUE); 495 done->setEnabled(TRUE);
496 reset->setEnabled(FALSE); 496 reset->setEnabled(FALSE);
497} 497}
498 498
499void WordGame::endTurn() 499void WordGame::endTurn()
500{ 500{
501 if ( gameover ) { 501 if ( gameover ) {
502 openGameSelector(namelist); 502 openGameSelector(namelist);
503 } else { 503 } else {
504 if ( board->checkTurn() ) { 504 if ( board->checkTurn() ) {
505 if ( board->turnScore() >= 0 ) { 505 if ( board->turnScore() >= 0 ) {
506 scoreinfo->addScore(player,board->turnScore()); 506 scoreinfo->addScore(player,board->turnScore());
507 board->finalizeTurn(); 507 board->finalizeTurn();
508 } else { 508 } else {
509 QApplication::beep(); 509 QApplication::beep();
510 } 510 }
511 nextPlayer(); 511 nextPlayer();
512 } 512 }
513 } 513 }
514} 514}
515 515
516void WordGame::resetTurn() 516void WordGame::resetTurn()
517{ 517{
518 board->resetRack(); 518 board->resetRack();
519} 519}
520 520
521void WordGame::passTurn() 521void WordGame::passTurn()
522{ 522{
523 // ######## trade? 523 // ######## trade?
524 nextPlayer(); 524 nextPlayer();
525} 525}
526 526
527bool WordGame::refillRack(int i) 527bool WordGame::refillRack(int i)
528{ 528{
529 Rack* r = rack(i); 529 Rack* r = rack(i);
530 while ( !bag->isEmpty() && !r->isFull() ) { 530 while ( !bag->isEmpty() && !r->isFull() ) {
531 r->addTile(bag->takeRandom()); 531 r->addTile(bag->takeRandom());
532 } 532 }
533 return r->count() != 0; 533 return r->count() != 0;
534} 534}
535 535
536void WordGame::readyRack(int i) 536void WordGame::readyRack(int i)
537{ 537{
538 Rack* r = rack(i); 538 Rack* r = rack(i);
539 racks->raiseWidget(i); 539 racks->raiseWidget(i);
540 board->setCurrentRack(r); 540 board->setCurrentRack(r);
541 541
542 done->setEnabled( !r->computerized() ); 542 done->setEnabled( !r->computerized() );
543 reset->setEnabled( !r->computerized() ); 543 reset->setEnabled( !r->computerized() );
544 544
545 if ( r->computerized() ) { 545 if ( r->computerized() ) {
546 cpu = new ComputerPlayer(board, r); 546 cpu = new ComputerPlayer(board, r);
547 aiheart->start(0); 547 aiheart->start(0);
548 } 548 }
549} 549}
550 550
551Rack* WordGame::rack(int i) const 551Rack* WordGame::rack(int i) const
552{ 552{
553 return (Rack*)racks->widget(i); 553 return (Rack*)racks->widget(i);
554} 554}
555 555
556void WordGame::think() 556void WordGame::think()
557{ 557{
558 if ( !cpu->step() ) { 558 if ( !cpu->step() ) {
559 delete cpu; 559 delete cpu;
560 cpu = 0; 560 cpu = 0;
561 aiheart->stop(); 561 aiheart->stop();
562 if ( board->turnScore() < 0 ) 562 if ( board->turnScore() < 0 )
563 passTurn(); 563 passTurn();
564 else 564 else
565 endTurn(); 565 endTurn();
566 } 566 }
567} 567}
568 568
569ComputerPlayer::ComputerPlayer(Board* b, Rack* r) : 569ComputerPlayer::ComputerPlayer(Board* b, Rack* r) :
570 board(b), rack(r), best(new const Tile*[rack_tiles]), 570 board(b), rack(r), best(new const Tile*[rack_tiles]),
571 best_blankvalues(new Tile[rack_tiles]) 571 best_blankvalues(new Tile[rack_tiles])
572{ 572{
573 best_score = -1; 573 best_score = -1;
574 across=FALSE; 574 across=FALSE;
575 dict=0; 575 dict=0;
576} 576}
577 577
578ComputerPlayer::~ComputerPlayer() 578ComputerPlayer::~ComputerPlayer()
579{ 579{
580 delete [] best; 580 delete [] best;
581 delete [] best_blankvalues; 581 delete [] best_blankvalues;
582} 582}
583 583
584bool ComputerPlayer::step() 584bool ComputerPlayer::step()
585{ 585{
586 const QDawg::Node* root = dict ? Global::dawg("WordGame").root() 586 const QDawg::Node* root = dict ? Global::dawg("WordGame").root()
587 : Global::fixedDawg().root(); 587 : Global::fixedDawg().root();
588 QPoint d = across ? QPoint(1,0) : QPoint(0,1); 588 QPoint d = across ? QPoint(1,0) : QPoint(0,1);
589 const Tile* tiles[99]; // ### max board size 589 const Tile* tiles[99]; // ### max board size
590 uchar nletter[4095]; // QDawg only handles 0..4095 590 uchar nletter[4095]; // QDawg only handles 0..4095
591 memset(nletter,0,4096); 591 memset(nletter,0,4095);
592 for (int i=0; i<rack->count(); i++) { 592 for (int i=0; i<rack->count(); i++) {
593 const Tile* r = rack->tileRef(i); 593 const Tile* r = rack->tileRef(i);
594 if ( r->isBlank() ) 594 if ( r->isBlank() )
595 nletter[0]++; 595 nletter[0]++;
596 else 596 else
597 nletter[r->text()[0].unicode()]++; 597 nletter[r->text()[0].unicode()]++;
598 } 598 }
599 Tile blankvalues[99]; // ### max blanks 599 Tile blankvalues[99]; // ### max blanks
600 findBest(current, d, root, 0, nletter, tiles, 0, blankvalues, 0); 600 findBest(current, d, root, 0, nletter, tiles, 0, blankvalues, 0);
601 if ( ++current.rx() == board->xTiles() ) { 601 if ( ++current.rx() == board->xTiles() ) {
602 current.rx() = 0; 602 current.rx() = 0;
603 if ( ++current.ry() == board->yTiles() ) { 603 if ( ++current.ry() == board->yTiles() ) {
604 if ( across ) { 604 if ( across ) {
605 if ( dict == 1 ) { 605 if ( dict == 1 ) {
606 if ( best_score >= 0 ) { 606 if ( best_score >= 0 ) {
607 rack->arrangeTiles(best,best_n); 607 rack->arrangeTiles(best,best_n);
608 rack->setBlanks(best_blankvalues); 608 rack->setBlanks(best_blankvalues);
609 board->scoreTurn(best_start, best_n, best_dir); 609 board->scoreTurn(best_start, best_n, best_dir);
610 board->showTurn(); 610 board->showTurn();
611 } 611 }
612 return FALSE; 612 return FALSE;
613 } 613 }
614 dict++; 614 dict++;
615 across = FALSE; 615 across = FALSE;
616 current = QPoint(0,0); 616 current = QPoint(0,0);
617 } else { 617 } else {
618 across = TRUE; 618 across = TRUE;
619 current = QPoint(0,0); 619 current = QPoint(0,0);
620 } 620 }
621 } 621 }
622 } 622 }
623 return TRUE; 623 return TRUE;
624} 624}
625 625
626void ComputerPlayer::findBest(QPoint at, const QPoint& d, const QDawg::Node* node, ulong used, uchar* nletter, const Tile** tiles, int n, Tile* blankvalues, int blused) 626void ComputerPlayer::findBest(QPoint at, const QPoint& d, const QDawg::Node* node, ulong used, uchar* nletter, const Tile** tiles, int n, Tile* blankvalues, int blused)
627{ 627{
628 if ( !node ) 628 if ( !node )
629 return; 629 return;
630 QChar l = node->letter(); 630 QChar l = node->letter();
631 const Tile* cur = board->tile(at); 631 const Tile* cur = board->tile(at);
632 if ( cur ) { 632 if ( cur ) {
633 if ( cur->text()[0] == l ) { 633 if ( cur->text()[0] == l ) {
634 bool nextok = board->contains(at+d); 634 bool nextok = board->contains(at+d);
635 if ( node->isWord() && n && (!nextok || !board->tile(at+d)) ) 635 if ( node->isWord() && n && (!nextok || !board->tile(at+d)) )
636 noteChoice(tiles,n,d,blankvalues,blused); 636 noteChoice(tiles,n,d,blankvalues,blused);
637 if ( nextok ) 637 if ( nextok )
638 findBest(at+d, d, node->jump(), used, nletter, tiles, n, blankvalues, blused); 638 findBest(at+d, d, node->jump(), used, nletter, tiles, n, blankvalues, blused);
639 // #### text()[1]... 639 // #### text()[1]...
640 } 640 }
641 } else { 641 } else {
642 if ( nletter[l.unicode()] || nletter[0] ) { 642 if ( nletter[l.unicode()] || nletter[0] ) {
643 int rc = rack->count(); 643 int rc = rack->count();
644 ulong msk = 1; 644 ulong msk = 1;
645 for ( int x=0; x<rc; x++ ) { 645 for ( int x=0; x<rc; x++ ) {
646 if ( !(used&msk) ) { 646 if ( !(used&msk) ) {
647 const Tile* t = rack->tileRef(x); 647 const Tile* t = rack->tileRef(x);
648 if ( t->isBlank() || t->text() == l ) { // #### multi-char value()s 648 if ( t->isBlank() || t->text() == l ) { // #### multi-char value()s
649 bool nextok = board->contains(at+d); 649 bool nextok = board->contains(at+d);
650 tiles[n++] = t; 650 tiles[n++] = t;
651 if ( t->isBlank() ) 651 if ( t->isBlank() )
652 blankvalues[blused++] = Tile(l,0); 652 blankvalues[blused++] = Tile(l,0);
653 if ( node->isWord() && (!nextok || !board->tile(at+d)) ) 653 if ( node->isWord() && (!nextok || !board->tile(at+d)) )
654 noteChoice(tiles,n,d,blankvalues,blused); 654 noteChoice(tiles,n,d,blankvalues,blused);
655 used |= msk; // mark 655 used |= msk; // mark
656 nletter[t->text()[0].unicode()]--; 656 nletter[t->text()[0].unicode()]--;
657 if ( nextok ) 657 if ( nextok )
658 findBest(at+d, d, node->jump(), used, nletter, tiles, n, blankvalues, blused); 658 findBest(at+d, d, node->jump(), used, nletter, tiles, n, blankvalues, blused);
659 n--; 659 n--;
660 nletter[t->text()[0].unicode()]++; 660 nletter[t->text()[0].unicode()]++;
661 if ( t->isBlank() ) { 661 if ( t->isBlank() ) {
662 // keep looking 662 // keep looking
663 blused--; 663 blused--;
664 used &= ~msk; // unmark 664 used &= ~msk; // unmark
665 } else { 665 } else {
666 break; 666 break;
667 } 667 }
668 } 668 }
669 } 669 }
670 msk <<= 1; 670 msk <<= 1;
671 } 671 }
672 } 672 }
673 // #### text()[1]... 673 // #### text()[1]...
674 } 674 }
675 findBest(at, d, node->next(), used, nletter, tiles, n, blankvalues, blused); 675 findBest(at, d, node->next(), used, nletter, tiles, n, blankvalues, blused);
676} 676}
677 677
678void ComputerPlayer::noteChoice(const Tile** tiles, int n, const QPoint& d, const Tile* blankvalues, int blused) 678void ComputerPlayer::noteChoice(const Tile** tiles, int n, const QPoint& d, const Tile* blankvalues, int blused)
679{ 679{
680 int s = board->score(current, tiles, n, blankvalues, d, TRUE, 0); 680 int s = board->score(current, tiles, n, blankvalues, d, TRUE, 0);
681/* 681/*
682if (s>0 || current==QPoint(5,1)){ 682if (s>0 || current==QPoint(5,1)){
683QString st; 683QString st;
684for ( int i=0; i<n; i++ ) 684for ( int i=0; i<n; i++ )
685 st += tiles[i]->text(); 685 st += tiles[i]->text();
686odebug << "" << current.x() << "," << current.y() << ": " << st.latin1() << " (" << n << ") for " << s << "" << oendl; 686odebug << "" << current.x() << "," << current.y() << ": " << st.latin1() << " (" << n << ") for " << s << "" << oendl;
687} 687}
688*/ 688*/
689 if ( s > best_score ) { 689 if ( s > best_score ) {
690 int i; 690 int i;
691 for ( i=0; i<n; i++ ) 691 for ( i=0; i<n; i++ )
692 best[i] = tiles[i]; 692 best[i] = tiles[i];
693 for ( i=0; i<blused; i++ ) 693 for ( i=0; i<blused; i++ )
694 best_blankvalues[i] = blankvalues[i]; 694 best_blankvalues[i] = blankvalues[i];
695 best_n = n; 695 best_n = n;
696 best_blused = blused; 696 best_blused = blused;
697 best_score = s; 697 best_score = s;
698 best_dir = d; 698 best_dir = d;
699 best_start = current; 699 best_start = current;
700 } 700 }
701} 701}
702 702
703int TileItem::smallWidth() 703int TileItem::smallWidth()
704{ 704{
705 return tile_smallw; 705 return tile_smallw;
706} 706}
707 707
708int TileItem::smallHeight() 708int TileItem::smallHeight()
709{ 709{
710 return tile_smallh; 710 return tile_smallh;
711} 711}
712 712
713int TileItem::bigWidth() 713int TileItem::bigWidth()
714{ 714{
715 return tile_bigw; 715 return tile_bigw;
716} 716}
717 717
718int TileItem::bigHeight() 718int TileItem::bigHeight()
719{ 719{
720 return tile_bigh; 720 return tile_bigh;
721} 721}
722 722
723void TileItem::setState( State state ) 723void TileItem::setState( State state )
724{ 724{
725 hide(); 725 hide();
726 s = state; 726 s = state;
727 show(); // ### use update() in Qt 3.0 727 show(); // ### use update() in Qt 3.0
728} 728}
729 729
730void TileItem::setTile(const Tile& tile) 730void TileItem::setTile(const Tile& tile)
731{ 731{
732 hide(); 732 hide();
733 t = tile; 733 t = tile;
734 show(); // ### use update() in Qt 3.0 734 show(); // ### use update() in Qt 3.0
735} 735}
736 736
737void TileItem::setBig(bool b) 737void TileItem::setBig(bool b)
738{ 738{
739 big = b; 739 big = b;
740} 740}
741 741
742void TileItem::drawShape(QPainter& p) 742void TileItem::drawShape(QPainter& p)
743{ 743{
744 static QFont *value_font=0; 744 static QFont *value_font=0;
745 static QFont *big_font=0; 745 static QFont *big_font=0;
746 static QFont *small_font=0; 746 static QFont *small_font=0;
747 if ( !value_font ) { 747 if ( !value_font ) {
748 value_font = new QFont("helvetica",8); 748 value_font = new QFont("helvetica",8);
749 if ( TileItem::bigWidth() < 20 ) { 749 if ( TileItem::bigWidth() < 20 ) {
750 big_font = new QFont("helvetica",12); 750 big_font = new QFont("helvetica",12);
751 small_font = new QFont("helvetica",8); 751 small_font = new QFont("helvetica",8);
752 } else { 752 } else {
753 big_font = new QFont("smoothtimes",17); 753 big_font = new QFont("smoothtimes",17);
754 small_font = new QFont("smoothtimes",10); 754 small_font = new QFont("smoothtimes",10);
755 } 755 }
756 } 756 }
757 757
758 QRect area(x(),y(),width(),height()); 758 QRect area(x(),y(),width(),height());
759 p.setBrush(s == Floating ? yellow/*lightGray*/ : white); 759 p.setBrush(s == Floating ? yellow/*lightGray*/ : white);
760 p.drawRect(area); 760 p.drawRect(area);
761 if ( big ) { 761 if ( big ) {
762 p.setFont(*value_font); 762 p.setFont(*value_font);
763 QString n = QString::number(t.value()); 763 QString n = QString::number(t.value());
764 int w = p.fontMetrics().width('1'); 764 int w = p.fontMetrics().width('1');
765 int h = p.fontMetrics().height(); 765 int h = p.fontMetrics().height();
766 w *= n.length(); 766 w *= n.length();
767 QRect valuearea(x()+width()-w-1,y()+height()-h,w,h); 767 QRect valuearea(x()+width()-w-1,y()+height()-h,w,h);
768 p.drawText(valuearea,AlignCenter,n); 768 p.drawText(valuearea,AlignCenter,n);
769 p.setFont(*big_font); 769 p.setFont(*big_font);
770 area = QRect(x(),y()+tile_btweak,width()-4,height()-1); 770 area = QRect(x(),y()+tile_btweak,width()-4,height()-1);
771 } else { 771 } else {
772 p.setFont(*small_font); 772 p.setFont(*small_font);
773 area = QRect(x()+1+tile_stweak,y()+1,width(),height()-3); 773 area = QRect(x()+1+tile_stweak,y()+1,width(),height()-3);
774 } 774 }
775 if ( t.value() == 0 ) 775 if ( t.value() == 0 )
776 p.setPen(darkGray); 776 p.setPen(darkGray);
777 p.drawText(area,AlignCenter,t.text().upper()); 777 p.drawText(area,AlignCenter,t.text().upper());
778} 778}
779 779
780Board::Board(QPixmap bgshapes, int w, int h, QWidget* parent) : 780Board::Board(QPixmap bgshapes, int w, int h, QWidget* parent) :
781 QCanvasView(new QCanvas(bgshapes,w,h, TileItem::smallWidth(), TileItem::smallHeight()), 781 QCanvasView(new QCanvas(bgshapes,w,h, TileItem::smallWidth(), TileItem::smallHeight()),
782 parent) 782 parent)
783{ 783{