• Skip to content
  • Skip to link menu
KDE 4.2 API Reference
  • KDE API Reference
  • API Reference
  • Sitemap
  • Contact Us
 

kblackbox

kbbballsonboard.cpp

Go to the documentation of this file.
00001 //
00002 // KBlackBox
00003 //
00004 // A simple game inspired by an emacs module
00005 //
00006 /***************************************************************************
00007  *   Copyright (c) 1999-2000, Robert Cimrman                               *
00008  *   cimrman3@students.zcu.cz                                              *
00009  *                                                                         *
00010  *   Copyright (c) 2007, Nicolas Roffet                                    *
00011  *   nicolas-kde@roffet.com                                                *
00012  *                                                                         *
00013  *                                                                         *
00014  *   This program is free software; you can redistribute it and/or modify  *
00015  *   it under the terms of the GNU General Public License as published by  *
00016  *   the Free Software Foundation; either version 2 of the License, or     *
00017  *   (at your option) any later version.                                   *
00018  *                                                                         *
00019  *   This program is distributed in the hope that it will be useful,       *
00020  *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
00021  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
00022  *   GNU General Public License for more details.                          *
00023  *                                                                         *
00024  *   You should have received a copy of the GNU General Public License     *
00025  *   along with this program; if not, write to the                         *
00026  *   Free Software Foundation, Inc.,                                       *
00027  *   51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA               *
00028  ***************************************************************************/
00029 
00030 
00031 #include "kbbballsonboard.h"
00032 
00033 #include <QObject>
00034 
00035 
00036 #include "kbbgamedoc.h"
00037 
00038 
00039 
00040 //
00041 // Constructor / Destructor
00042 //
00043 
00044 KBBBallsOnBoard::KBBBallsOnBoard(KBBGameDoc* parent, const int columns, const int rows) : QObject(parent)
00045 {
00046     m_columns = columns;
00047     m_rows = rows;
00048 }
00049 
00050 
00051 
00052 //
00053 // Public
00054 //
00055 
00056 int KBBBallsOnBoard::absolutePositionToBorderPosition(int position[DIM_MAX])
00057 {
00058     int borderPosition = KBBGameDoc::HIT_POSITION;
00059     if (position[DIM_Y] == 1)
00060         borderPosition = position[DIM_X] - 2;
00061     else if (position[DIM_X] == m_columns + 2)
00062         borderPosition = position[DIM_Y] - 2 + m_columns;
00063     else if (position[DIM_Y] == m_rows + 2)
00064         borderPosition = 1 - position[DIM_X] + 2 * m_columns + m_rows;
00065     else if (position[DIM_X] == 1)
00066         borderPosition = 1 - position[DIM_Y] + 2*(m_rows + m_columns);
00067     
00068     return borderPosition;
00069 }
00070 
00071 
00072 int KBBBallsOnBoard::absolutePositionToBoxPosition(int position[DIM_MAX])
00073 {
00074     return (position[DIM_X]-2)+(position[DIM_Y]-2)*(m_columns);
00075 }
00076 
00077 
00078 void KBBBallsOnBoard::add(int boxPosition)
00079 {
00080     m_balls.append(boxPosition);
00081     emit changes();
00082 }
00083 
00084 
00085 void KBBBallsOnBoard::borderPositionToAbsolutePosition(int borderPosition, int position[DIM_MAX])
00086 {
00087     if (borderPosition < m_columns) {
00088         position[DIM_X] = borderPosition + 2;
00089         position[DIM_Y] = 1;
00090     } else if ((borderPosition >= m_columns) && (borderPosition < m_columns + m_rows)) {
00091         position[DIM_X] = m_columns + 2;
00092         position[DIM_Y] = (borderPosition - m_columns) + 2;
00093     } else if ((borderPosition >= m_columns + m_rows) && (borderPosition < 2*m_columns + m_rows)) {
00094         position[DIM_X] = (m_columns - (borderPosition - m_columns - m_rows)) + 1;
00095         position[DIM_Y] = m_rows + 2;
00096     } else if (borderPosition >= 2*m_columns + m_rows) {
00097         position[DIM_X] = 1;
00098         position[DIM_Y] = (m_rows - (borderPosition - 2*m_columns - m_rows)) + 1;
00099     } else {
00100         position[DIM_X] = KBBGameDoc::HIT_POSITION;
00101         position[DIM_Y] = KBBGameDoc::HIT_POSITION;
00102     }
00103 }
00104 
00105 
00106 const int KBBBallsOnBoard::columns()
00107 {
00108     return m_columns;
00109 }
00110 
00111 
00112 bool KBBBallsOnBoard::contains(int boxPosition)
00113 {
00114     return m_balls.contains(boxPosition);
00115 }
00116 
00117 
00118 int KBBBallsOnBoard::count()
00119 {
00120     return m_balls.count();
00121 }
00122 
00123 
00124 void KBBBallsOnBoard::newBoard(const int columns, const int rows)
00125 {
00126     m_balls.clear();
00127     m_columns = columns;
00128     m_rows = rows;
00129     emit changes();
00130 }
00131 
00132 
00133 int KBBBallsOnBoard::numberOfBallsNotIn(KBBBallsOnBoard* otherBoard)
00134 {
00135     int diff = 0;
00136     
00137     for (int i=0; i<m_balls.count(); i++)
00138         if (!otherBoard->contains(m_balls[i]))
00139             diff++;
00140     
00141     return diff;
00142 }
00143 
00144 
00145 int KBBBallsOnBoard::oppositeBorderPosition(int borderPosition) {
00146     QList<int> points;
00147     return oppositeBorderPositionWithPoints(borderPosition, points);
00148 }
00149 
00150 
00151 int KBBBallsOnBoard::oppositeBorderPositionWithPoints(const int borderPosition,  QList<int> &points) {
00152     // 1. Conversion "border position -> (Absolute) position"
00153     int position[DIM_MAX];
00154     borderPositionToAbsolutePosition(borderPosition, position);
00155 
00156     // 2. Get start direction
00157     int direction[DIM_MAX];
00158     if (borderPosition < m_columns) {
00159         direction[DIM_X] = 0;
00160         direction[DIM_Y] = 1;
00161     } else if ((borderPosition >= m_columns) && (borderPosition < m_columns + m_rows)) {
00162         direction[DIM_X] = -1;
00163         direction[DIM_Y] = 0;
00164     } else if ((borderPosition >= m_columns + m_rows) && (borderPosition < 2*m_columns + m_rows)) {
00165         direction[DIM_X] = 0;
00166         direction[DIM_Y] = -1;
00167     } else if (borderPosition >= 2*m_columns + m_rows) {
00168         direction[DIM_X] = 1;
00169         direction[DIM_Y] = 0;
00170     }
00171 
00172     // 3. Get the outgoing (absolute) position
00173     getOutgoingPosition(position, direction, points);
00174     
00175     // 4. Conversion "(absolute) position -> border position"
00176     return absolutePositionToBorderPosition(position);
00177 }
00178 
00179 
00180 void KBBBallsOnBoard::ray(const int borderPosition, QList<int> &points)
00181 {
00182     oppositeBorderPositionWithPoints(borderPosition, points);
00183 }
00184 
00185 
00186 void KBBBallsOnBoard::remove(int boxPosition)
00187 {
00188     m_balls.removeAll(boxPosition);
00189     emit changes();
00190 }
00191 
00192 
00193 const int KBBBallsOnBoard::rows()
00194 {
00195     return m_rows;
00196 }
00197 
00198 
00199 
00200 //
00201 // Private
00202 //
00203 
00204 void KBBBallsOnBoard::getOutgoingPosition( int position[DIM_MAX], int incomingDirection[DIM_MAX], QList<int> &points)
00205 {
00206     int outgoingDirection[DIM_MAX];
00207     
00208     int nextPosition[DIM_MAX];
00209     nextPosition[DIM_X] = position[DIM_X] + incomingDirection[DIM_X];
00210     nextPosition[DIM_Y] = position[DIM_Y] + incomingDirection[DIM_Y];
00211 
00212     int nextLeftPosition[DIM_MAX];
00213     nextLeftPosition[DIM_X] = nextPosition[DIM_X] + incomingDirection[DIM_Y];
00214     nextLeftPosition[DIM_Y] = nextPosition[DIM_Y] + incomingDirection[DIM_X];
00215 
00216     int nextRightPosition[DIM_MAX];
00217     nextRightPosition[DIM_X] = nextPosition[DIM_X] - incomingDirection[DIM_Y];
00218     nextRightPosition[DIM_Y] = nextPosition[DIM_Y] - incomingDirection[DIM_X];
00219 
00220     bool deviation = false;
00221     if (positionInTheBox(nextPosition) && contains((nextPosition[DIM_X] - 2) + (nextPosition[DIM_Y] - 2) * m_columns)) {
00222         // HIT
00223         position[DIM_X] = KBBGameDoc::HIT_POSITION;
00224         position[DIM_Y] = KBBGameDoc::HIT_POSITION;
00225         points.append(absolutePositionToBoxPosition(nextPosition));
00226     } else if (positionInTheBox(nextLeftPosition) && contains((nextLeftPosition[DIM_X] - 2) + (nextLeftPosition[DIM_Y] - 2) * m_columns)) {
00227         // DEVIATION 1
00228         outgoingDirection[DIM_X] = -incomingDirection[DIM_Y];
00229         outgoingDirection[DIM_Y] = -incomingDirection[DIM_X];
00230         deviation = true;
00231     } else if (positionInTheBox(nextRightPosition) && contains((nextRightPosition[DIM_X] - 2) + (nextRightPosition[DIM_Y] - 2) * m_columns)) {
00232         // DEVIATION 2
00233         outgoingDirection[DIM_X] = incomingDirection[DIM_Y];
00234         outgoingDirection[DIM_Y] = incomingDirection[DIM_X];
00235         deviation = true;
00236     } else {
00237         //NORMAL
00238         position[DIM_X] = nextPosition[DIM_X];
00239         position[DIM_Y] = nextPosition[DIM_Y];
00240         outgoingDirection[DIM_X] = incomingDirection[DIM_X];
00241         outgoingDirection[DIM_Y] = incomingDirection[DIM_Y];
00242     }
00243     
00244     // Out of the Black box? (loop exit condition)
00245     if (positionInTheBox(position)) {
00246         points.append(absolutePositionToBoxPosition(position));
00247         getOutgoingPosition( position, outgoingDirection, points );
00248     } else if (deviation)
00249         // special case: Deviation entering the black box. Player should see the laser ray entering, even if it's in fact deviated before entering...
00250         points.append(absolutePositionToBoxPosition(nextPosition));
00251     
00252     return;
00253 }
00254 
00255 
00256 bool KBBBallsOnBoard::positionInTheBox( int position[DIM_MAX] )
00257 {
00258     return !((position[DIM_X] < 2) || (position[DIM_X] > m_columns + 1) || (position[DIM_Y] < 2) || (position[DIM_Y] > m_rows + 1));
00259 }
00260 
00261 #include "kbbballsonboard.moc"

kblackbox

Skip menu "kblackbox"
  • Main Page
  • Class Hierarchy
  • Alphabetical List
  • Class List
  • File List
  • Class Members

API Reference

Skip menu "API Reference"
  • kblackbox
  • kgoldrunner
  • kmahjongg
  • ksquares
  • libkdegames
  •   highscore
  •   kgame
  •   kggzgames
  •   kggzmod
  •   kggznet
  • libkmahjongg
Generated for API Reference by doxygen 1.5.4
This website is maintained by Adriaan de Groot and Allen Winter.
KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V. | Legal