• Skip to content
  • Skip to link menu
KDE API Reference
  • KDE API Reference
  • kdegames API Reference
  • KDE Home
  • Contact Us
 

kblackbox

  • sources
  • kde-4.14
  • kdegames
  • kblackbox
kbbballsonboard.cpp
Go to the documentation of this file.
1 //
2 // KBlackBox
3 //
4 // A simple game inspired by an emacs module
5 //
6 /***************************************************************************
7  * Copyright (c) 1999-2000, Robert Cimrman *
8  * cimrman3@students.zcu.cz *
9  * *
10  * Copyright (c) 2007, Nicolas Roffet *
11  * nicolas-kde@roffet.com *
12  * *
13  * *
14  * This program is free software; you can redistribute it and/or modify *
15  * it under the terms of the GNU General Public License as published by *
16  * the Free Software Foundation; either version 2 of the License, or *
17  * (at your option) any later version. *
18  * *
19  * This program is distributed in the hope that it will be useful, *
20  * but WITHOUT ANY WARRANTY; without even the implied warranty of *
21  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
22  * GNU General Public License for more details. *
23  * *
24  * You should have received a copy of the GNU General Public License *
25  * along with this program; if not, write to the *
26  * Free Software Foundation, Inc., *
27  * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA *
28  ***************************************************************************/
29 
30 
31 #include "kbbballsonboard.h"
32 
33 #include <QObject>
34 
35 
36 #include "kbbgamedoc.h"
37 
38 
39 
40 //
41 // Constructor / Destructor
42 //
43 
44 KBBBallsOnBoard::KBBBallsOnBoard(KBBGameDoc* parent, const int columns, const int rows) : QObject(parent)
45 {
46  m_columns = columns;
47  m_rows = rows;
48 }
49 
50 
51 
52 //
53 // Public
54 //
55 
56 int KBBBallsOnBoard::absolutePositionToBorderPosition(int position[DIM_MAX])
57 {
58  int borderPosition = KBBGameDoc::HIT_POSITION;
59  if (position[DIM_Y] == 1)
60  borderPosition = position[DIM_X] - 2;
61  else if (position[DIM_X] == m_columns + 2)
62  borderPosition = position[DIM_Y] - 2 + m_columns;
63  else if (position[DIM_Y] == m_rows + 2)
64  borderPosition = 1 - position[DIM_X] + 2 * m_columns + m_rows;
65  else if (position[DIM_X] == 1)
66  borderPosition = 1 - position[DIM_Y] + 2*(m_rows + m_columns);
67 
68  return borderPosition;
69 }
70 
71 
72 int KBBBallsOnBoard::absolutePositionToBoxPosition(int position[DIM_MAX])
73 {
74  return (position[DIM_X]-2)+(position[DIM_Y]-2)*(m_columns);
75 }
76 
77 
78 void KBBBallsOnBoard::add(int boxPosition)
79 {
80  m_balls.append(boxPosition);
81  emit changes();
82 }
83 
84 
85 void KBBBallsOnBoard::borderPositionToAbsolutePosition(int borderPosition, int position[DIM_MAX])
86 {
87  if (borderPosition < m_columns) {
88  position[DIM_X] = borderPosition + 2;
89  position[DIM_Y] = 1;
90  } else if ((borderPosition >= m_columns) && (borderPosition < m_columns + m_rows)) {
91  position[DIM_X] = m_columns + 2;
92  position[DIM_Y] = (borderPosition - m_columns) + 2;
93  } else if ((borderPosition >= m_columns + m_rows) && (borderPosition < 2*m_columns + m_rows)) {
94  position[DIM_X] = (m_columns - (borderPosition - m_columns - m_rows)) + 1;
95  position[DIM_Y] = m_rows + 2;
96  } else if (borderPosition >= 2*m_columns + m_rows) {
97  position[DIM_X] = 1;
98  position[DIM_Y] = (m_rows - (borderPosition - 2*m_columns - m_rows)) + 1;
99  } else {
100  position[DIM_X] = KBBGameDoc::HIT_POSITION;
101  position[DIM_Y] = KBBGameDoc::HIT_POSITION;
102  }
103 }
104 
105 
106 int KBBBallsOnBoard::columns()
107 {
108  return m_columns;
109 }
110 
111 
112 bool KBBBallsOnBoard::contains(int boxPosition)
113 {
114  return m_balls.contains(boxPosition);
115 }
116 
117 
118 int KBBBallsOnBoard::count()
119 {
120  return m_balls.count();
121 }
122 
123 
124 void KBBBallsOnBoard::newBoard(const int columns, const int rows)
125 {
126  m_balls.clear();
127  m_columns = columns;
128  m_rows = rows;
129  emit changes();
130 }
131 
132 
133 int KBBBallsOnBoard::numberOfBallsNotIn(KBBBallsOnBoard* otherBoard)
134 {
135  int diff = 0;
136 
137  for (int i=0; i<m_balls.count(); i++)
138  if (!otherBoard->contains(m_balls[i]))
139  diff++;
140 
141  return diff;
142 }
143 
144 
145 int KBBBallsOnBoard::oppositeBorderPosition(int borderPosition) {
146  QList<int> points;
147  return oppositeBorderPositionWithPoints(borderPosition, points);
148 }
149 
150 
151 int KBBBallsOnBoard::oppositeBorderPositionWithPoints(const int borderPosition, QList<int> &points) {
152  // 1. Conversion "border position -> (Absolute) position"
153  int position[DIM_MAX];
154  borderPositionToAbsolutePosition(borderPosition, position);
155 
156  // 2. Get start direction
157  int direction[DIM_MAX];
158  if (borderPosition < m_columns) {
159  direction[DIM_X] = 0;
160  direction[DIM_Y] = 1;
161  } else if ((borderPosition >= m_columns) && (borderPosition < m_columns + m_rows)) {
162  direction[DIM_X] = -1;
163  direction[DIM_Y] = 0;
164  } else if ((borderPosition >= m_columns + m_rows) && (borderPosition < 2*m_columns + m_rows)) {
165  direction[DIM_X] = 0;
166  direction[DIM_Y] = -1;
167  } else if (borderPosition >= 2*m_columns + m_rows) {
168  direction[DIM_X] = 1;
169  direction[DIM_Y] = 0;
170  }
171 
172  // 3. Get the outgoing (absolute) position
173  getOutgoingPosition(position, direction, points);
174 
175  // 4. Conversion "(absolute) position -> border position"
176  return absolutePositionToBorderPosition(position);
177 }
178 
179 
180 void KBBBallsOnBoard::ray(const int borderPosition, QList<int> &points)
181 {
182  oppositeBorderPositionWithPoints(borderPosition, points);
183 }
184 
185 
186 void KBBBallsOnBoard::remove(int boxPosition)
187 {
188  m_balls.removeAll(boxPosition);
189  emit changes();
190 }
191 
192 
193 int KBBBallsOnBoard::rows()
194 {
195  return m_rows;
196 }
197 
198 
199 
200 //
201 // Private
202 //
203 
204 void KBBBallsOnBoard::getOutgoingPosition( int position[DIM_MAX], int incomingDirection[DIM_MAX], QList<int> &points)
205 {
206  int outgoingDirection[DIM_MAX];
207 
208  int nextPosition[DIM_MAX];
209  nextPosition[DIM_X] = position[DIM_X] + incomingDirection[DIM_X];
210  nextPosition[DIM_Y] = position[DIM_Y] + incomingDirection[DIM_Y];
211 
212  int nextLeftPosition[DIM_MAX];
213  nextLeftPosition[DIM_X] = nextPosition[DIM_X] + incomingDirection[DIM_Y];
214  nextLeftPosition[DIM_Y] = nextPosition[DIM_Y] + incomingDirection[DIM_X];
215 
216  int nextRightPosition[DIM_MAX];
217  nextRightPosition[DIM_X] = nextPosition[DIM_X] - incomingDirection[DIM_Y];
218  nextRightPosition[DIM_Y] = nextPosition[DIM_Y] - incomingDirection[DIM_X];
219 
220  bool deviation = false;
221  if (positionInTheBox(nextPosition) && contains((nextPosition[DIM_X] - 2) + (nextPosition[DIM_Y] - 2) * m_columns)) {
222  // HIT
223  position[DIM_X] = KBBGameDoc::HIT_POSITION;
224  position[DIM_Y] = KBBGameDoc::HIT_POSITION;
225  points.append(absolutePositionToBoxPosition(nextPosition));
226  } else if (positionInTheBox(nextLeftPosition) && contains((nextLeftPosition[DIM_X] - 2) + (nextLeftPosition[DIM_Y] - 2) * m_columns)) {
227  // DEVIATION 1
228  outgoingDirection[DIM_X] = -incomingDirection[DIM_Y];
229  outgoingDirection[DIM_Y] = -incomingDirection[DIM_X];
230  deviation = true;
231  } else if (positionInTheBox(nextRightPosition) && contains((nextRightPosition[DIM_X] - 2) + (nextRightPosition[DIM_Y] - 2) * m_columns)) {
232  // DEVIATION 2
233  outgoingDirection[DIM_X] = incomingDirection[DIM_Y];
234  outgoingDirection[DIM_Y] = incomingDirection[DIM_X];
235  deviation = true;
236  } else {
237  //NORMAL
238  position[DIM_X] = nextPosition[DIM_X];
239  position[DIM_Y] = nextPosition[DIM_Y];
240  outgoingDirection[DIM_X] = incomingDirection[DIM_X];
241  outgoingDirection[DIM_Y] = incomingDirection[DIM_Y];
242  }
243 
244  // Out of the Black box? (loop exit condition)
245  if (positionInTheBox(position)) {
246  points.append(absolutePositionToBoxPosition(position));
247  getOutgoingPosition( position, outgoingDirection, points );
248  } else if (deviation)
249  // special case: Deviation entering the black box. Player should see the laser ray entering, even if it's in fact deviated before entering...
250  points.append(absolutePositionToBoxPosition(nextPosition));
251 
252  return;
253 }
254 
255 
256 bool KBBBallsOnBoard::positionInTheBox( int position[DIM_MAX] )
257 {
258  return !((position[DIM_X] < 2) || (position[DIM_X] > m_columns + 1) || (position[DIM_Y] < 2) || (position[DIM_Y] > m_rows + 1));
259 }
260 
261 #include "kbbballsonboard.moc"
QList::clear
void clear()
KBBBallsOnBoard::absolutePositionToBoxPosition
int absolutePositionToBoxPosition(int position[DIM_MAX])
Convert (absolute) position to box position.
Definition: kbbballsonboard.cpp:72
kbbgamedoc.h
KBBBallsOnBoard::remove
void remove(int boxPosition)
Remove a ball on this board.
Definition: kbbballsonboard.cpp:186
KBBBallsOnBoard::oppositeBorderPosition
int oppositeBorderPosition(int borderPosition)
Compute the opposite border position of the given position.
Definition: kbbballsonboard.cpp:145
KBBGameDoc
Game document (Logical board)
Definition: kbbgamedoc.h:56
kbbballsonboard.h
KBBBallsOnBoard::KBBBallsOnBoard
KBBBallsOnBoard(KBBGameDoc *parent, const int columns, const int rows)
Constructor.
Definition: kbbballsonboard.cpp:44
QList::count
int count(const T &value) const
QList::append
void append(const T &value)
QObject
KBBBallsOnBoard::absolutePositionToBorderPosition
int absolutePositionToBorderPosition(int position[DIM_MAX])
Convert (absolute) position to border position.
Definition: kbbballsonboard.cpp:56
QList::removeAll
int removeAll(const T &value)
KBBGameDoc::HIT_POSITION
static const int HIT_POSITION
When a laser ray enter the black box, it exits on a defined border position, except if the laser ray ...
Definition: kbbgamedoc.h:65
KBBBallsOnBoard::borderPositionToAbsolutePosition
void borderPositionToAbsolutePosition(int borderPosition, int position[DIM_MAX])
Convert border position to (abosulte) position.
Definition: kbbballsonboard.cpp:85
KBBBallsOnBoard::ray
void ray(const int borderPosition, QList< int > &points)
Compute the trajectory of a ray with the balls of the set.
Definition: kbbballsonboard.cpp:180
QList< int >
KBBBallsOnBoard::changes
void changes()
KBBBallsOnBoard::newBoard
void newBoard(const int columns, const int rows)
Define a new board and remove all balls.
Definition: kbbballsonboard.cpp:124
QList::contains
bool contains(const T &value) const
KBBBallsOnBoard::contains
bool contains(int boxPosition)
Check if there is a ball at the given position in the black box.
Definition: kbbballsonboard.cpp:112
KBBBallsOnBoard::oppositeBorderPositionWithPoints
int oppositeBorderPositionWithPoints(const int borderPosition, QList< int > &points)
Definition: kbbballsonboard.cpp:151
KBBBallsOnBoard::numberOfBallsNotIn
int numberOfBallsNotIn(KBBBallsOnBoard *otherBoard)
Compares 2 boards and return the number of differences.
Definition: kbbballsonboard.cpp:133
DIM_Y
#define DIM_Y
Definition: kbbballsonboard.h:45
KBBBallsOnBoard::add
void add(int boxPosition)
Add a ball on this board.
Definition: kbbballsonboard.cpp:78
DIM_MAX
#define DIM_MAX
Definition: kbbballsonboard.h:46
KBBBallsOnBoard::columns
int columns()
Definition: kbbballsonboard.cpp:106
KBBBallsOnBoard::count
int count()
Number of balls on this board.
Definition: kbbballsonboard.cpp:118
KBBBallsOnBoard::rows
int rows()
Definition: kbbballsonboard.cpp:193
DIM_X
#define DIM_X
Definition: kbbballsonboard.h:44
KBBBallsOnBoard
Set of balls (or various objects) with positions on the board.
Definition: kbbballsonboard.h:62
This file is part of the KDE documentation.
Documentation copyright © 1996-2020 The KDE developers.
Generated on Mon Jun 22 2020 13:18:20 by doxygen 1.8.7 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.

kblackbox

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

kdegames API Reference

Skip menu "kdegames API Reference"
  • granatier
  • kapman
  • kblackbox
  • kgoldrunner
  • kigo
  • kmahjongg
  • KShisen
  • ksquares
  • libkdegames
  •   highscore
  •   libkdegamesprivate
  •     kgame
  • libkmahjongg
  • palapeli
  •   libpala

Search



Report problems with this website to our bug tracking system.
Contact the specific authors with questions and comments about the page contents.

KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V. | Legal