kblackbox
kbbballsonboard.cpp
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031 #include "kbbballsonboard.h"
00032
00033 #include <QObject>
00034
00035
00036 #include "kbbgamedoc.h"
00037
00038
00039
00040
00041
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
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
00153 int position[DIM_MAX];
00154 borderPositionToAbsolutePosition(borderPosition, position);
00155
00156
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
00173 getOutgoingPosition(position, direction, points);
00174
00175
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
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
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
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
00233 outgoingDirection[DIM_X] = incomingDirection[DIM_Y];
00234 outgoingDirection[DIM_Y] = incomingDirection[DIM_X];
00235 deviation = true;
00236 } else {
00237
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
00245 if (positionInTheBox(position)) {
00246 points.append(absolutePositionToBoxPosition(position));
00247 getOutgoingPosition( position, outgoingDirection, points );
00248 } else if (deviation)
00249
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"