diff options
author | toma <toma@283d02a7-25f6-0310-bc7c-ecb5cbfe19da> | 2009-11-25 17:56:58 +0000 |
---|---|---|
committer | toma <toma@283d02a7-25f6-0310-bc7c-ecb5cbfe19da> | 2009-11-25 17:56:58 +0000 |
commit | c90c389a8a8d9d8661e9772ec4144c5cf2039f23 (patch) | |
tree | 6d8391395bce9eaea4ad78958617edb20c6a7573 /kjumpingcube/cubebox.cpp | |
download | tdegames-c90c389a8a8d9d8661e9772ec4144c5cf2039f23.tar.gz tdegames-c90c389a8a8d9d8661e9772ec4144c5cf2039f23.zip |
Copy the KDE 3.5 branch to branches/trinity for new KDE 3.5 features.
BUG:215923
git-svn-id: svn://anonsvn.kde.org/home/kde/branches/trinity/kdegames@1054174 283d02a7-25f6-0310-bc7c-ecb5cbfe19da
Diffstat (limited to 'kjumpingcube/cubebox.cpp')
-rw-r--r-- | kjumpingcube/cubebox.cpp | 292 |
1 files changed, 292 insertions, 0 deletions
diff --git a/kjumpingcube/cubebox.cpp b/kjumpingcube/cubebox.cpp new file mode 100644 index 00000000..91a90cc6 --- /dev/null +++ b/kjumpingcube/cubebox.cpp @@ -0,0 +1,292 @@ +/* **************************************************************************** + This file is part of the game 'KJumpingCube' + + Copyright (C) 1998-2000 by Matthias Kiefer + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +**************************************************************************** */ +#include <assert.h> +#include <math.h> +#include "cubebox.h" +#include "kcubeboxwidget.h" + + +CubeBox::CubeBox(const int d) + :CubeBoxBase<Cube>(d) +{ + initCubes(); +} + +CubeBox::CubeBox(const CubeBox& box) + :CubeBoxBase<Cube>(box.dim()) +{ + initCubes(); + + int i,j; + for(i=0;i<dim();i++) + for(j=0;j<dim();j++) + { + *cubes[i][j]=*box.cubes[i][j]; + } + + currentPlayer=box.currentPlayer; +} + +CubeBox::CubeBox(KCubeBoxWidget& box) + :CubeBoxBase<Cube>(box.dim()) +{ + initCubes(); + + int i,j; + for(i=0;i<dim();i++) + for(j=0;j<dim();j++) + { + *cubes[i][j]=*box[i][j]; + } + + currentPlayer=(CubeBox::Player)box.player(); + +} + + +CubeBox::~CubeBox() +{ +} + + +CubeBox& CubeBox::operator=(const CubeBox& box) +{ + if(this!=&box) + { + if(dim()!=box.dim()) + { + setDim(box.dim()); + } + + + for(int i=0;i<dim();i++) + for(int j=0;j<dim();j++) + { + *cubes[i][j]=*box.cubes[i][j]; + } + } + + currentPlayer=box.currentPlayer; + + return *this; +} + + +CubeBox& CubeBox::operator=(KCubeBoxWidget& box) +{ + if(dim()!=box.dim()) + { + setDim(box.dim()); + } + + for(int i=0;i<dim();i++) + for(int j=0;j<dim();j++) + { + *cubes[i][j]=*box[i][j]; + } + + currentPlayer=(CubeBox::Player)box.player(); + + return *this; +} + + + + +bool CubeBox::simulateMove(Player fromWhom,int row, int column) +{ + bool finished; + bool playerWon=false; + + if(cubes[row][column]->owner()!=(Cube::Owner)fromWhom && cubes[row][column]->owner()!=Cube::Nobody) + return false; + + cubes[row][column]->increase((Cube::Owner)fromWhom); + + do + { + int i,j; + finished=true; + playerWon=true; + + // check all Cubes + for(i=0;i<dim();i++) + { + for(j=0;j<dim();j++) + { + if(cubes[i][j]->overMax()) + { + increaseNeighbours(fromWhom,i,j); + cubes[i][j]->decrease(); + finished=false; + } + + if(cubes[i][j]->owner()!=(Cube::Owner)fromWhom) + playerWon=false; + } + } + + if(playerWon) + return true; + } + while(!finished); + + + return true; +} + +double CubeBox::assessField(Player player) const +{ + int cubesOne=0; + int cubesTwo=0; + int pointsOne=0; + int pointsTwo=0; + Player otherPlayer = ((player==One)? Two : One); + bool playerWon=true; + bool otherPlayerWon=true; + + int i,j; + + for(i=0;i<dim();i++) + { + for(j=0;j<dim();j++) + { + if(cubes[i][j]->owner()==(Cube::Owner)One) + { + cubesOne++; + pointsOne+=(int)pow((float)cubes[i][j]->value(),2); + } + else if(cubes[i][j]->owner()==(Cube::Owner)Two) + { + cubesTwo++; + pointsTwo+=(int)pow((float)cubes[i][j]->value(),2); + } + + if(cubes[i][j]->owner()!=(Cube::Owner)player) + playerWon=false; + + if(cubes[i][j]->owner()!=(Cube::Owner)otherPlayer) + otherPlayerWon=false; + } + + } + + + + if(player==One) + { + return (int)pow((float)cubesOne,2)+pointsOne-(int)pow(cubesTwo,2)-pointsTwo; + } + else + return (int)pow((float)cubesTwo,2)+pointsTwo-(int)pow(cubesOne,2)-pointsOne; + +} + +bool CubeBox::playerWon(Player who) const +{ + int i,j; + + for(i=0;i<dim();i++) + for(j=0;j<dim();j++) + { + if(cubes[i][j]->owner()!=(Cube::Owner)who) + return false; + } + + return true; +} + + +void CubeBox::increaseNeighbours(CubeBox::Player forWhom,int row,int column) +{ + Cube::Owner _player = (Cube::Owner)(forWhom); + + if(row==0) + { + if(column==0) // top left corner + { + cubes[0][1]->increase(_player); + cubes[1][0]->increase(_player); + return; + } + else if(column==dim()-1) // top right corner + { + cubes[0][dim()-2]->increase(_player); + cubes[1][dim()-1]->increase(_player); + return; + } + else // top edge + { + cubes[0][column-1]->increase(_player); + cubes[0][column+1]->increase(_player); + cubes[1][column]->increase(_player); + return; + } + } + else if(row==dim()-1) + { + if(column==0) // left bottom corner + { + cubes[dim()-2][0]->increase(_player); + cubes[dim()-1][1]->increase(_player); + return; + } + + else if(column==dim()-1) // right bottom corner + { + cubes[dim()-2][dim()-1]->increase(_player); + cubes[dim()-1][dim()-2]->increase(_player); + return; + } + else // bottom edge + { + cubes[dim()-1][column-1]->increase(_player); + cubes[dim()-1][column+1]->increase(_player); + cubes[dim()-2][column]->increase(_player); + return; + } + } + else if(column==0) // left edge + { + cubes[row-1][0]->increase(_player); + cubes[row+1][0]->increase(_player); + cubes[row][1]->increase(_player); + return; + } + else if(column==dim()-1) // right edge + { + cubes[row-1][dim()-1]->increase(_player); + cubes[row+1][dim()-1]->increase(_player); + cubes[row][dim()-2]->increase(_player); + return; + } + else + { + cubes[row][column-1]->increase(_player); + cubes[row][column+1]->increase(_player); + cubes[row-1][column]->increase(_player); + cubes[row+1][column]->increase(_player); + return; + } + + +} |