File indexing completed on 2024-04-21 04:02:01
0001 /* 0002 KBlackBox - A simple game inspired by an emacs module 0003 0004 SPDX-FileCopyrightText: 1999-2000 Robert Cimrman <cimrman3@students.zcu.cz> 0005 SPDX-FileCopyrightText: 2007 Nicolas Roffet <nicolas-kde@roffet.com> 0006 0007 SPDX-License-Identifier: GPL-2.0-or-later 0008 */ 0009 0010 0011 0012 #ifndef KBBGAMEDOC_H 0013 #define KBBGAMEDOC_H 0014 0015 #include <QObject> 0016 #include <QRandomGenerator> 0017 0018 class KBBBallsOnBoard; 0019 #include "kbbmainwindow.h" 0020 class KBBTutorial; 0021 0022 0023 0024 /** 0025 * @brief Game document (Logical board) 0026 * 0027 * The game document (=logical board) manages a game, that is: 0028 * - the score 0029 * - the balls the user placed on the board 0030 * - the real (hidden) balls of the black box 0031 */ 0032 class KBBGameDoc : public QObject 0033 { 0034 Q_OBJECT 0035 0036 public: 0037 /** 0038 * When a laser ray enter the black box, it exits on a defined border position, except if the laser ray hits a ball. In this case, it doesn't exit the black box. In this case, we defined the exit position as the HIT_POSITION. 0039 * This position is "virtual" and must be different to all other possible "real" border positions. (That's why we defined it as a negative (<0) position). 0040 */ 0041 static const int HIT_POSITION = -1; 0042 0043 static const int SCORE_LOST = 999; 0044 static const int SCORE_ONE = 3; 0045 static const int SCORE_TWO = 9; 0046 0047 0048 /** 0049 * @brief Constructor 0050 */ 0051 KBBGameDoc(KBBMainWindow *parent, KBBTutorial* tutorial); 0052 0053 0054 /** 0055 * @brief Get the number of columns 0056 */ 0057 int columns() const; 0058 0059 /** 0060 * @brief Stop the game, show solution and compute final score 0061 */ 0062 void gameOver(); 0063 0064 /** 0065 * @brief Check if the player started to play 0066 * 0067 * Check if the game is running and if the player shot at least one laser ray. 0068 * Before that, the player doesn't need to confirm the end of the game, if he tries to start a new game. 0069 */ 0070 bool gameReallyStarted(); 0071 0072 bool mayShootRay(const int incomingPosition) const; 0073 0074 /** 0075 * @brief Create new board game and initialize game 0076 * 0077 * @param balls Number of balls to place on the board 0078 * @param columns Number of columns 0079 * @param rows Number of rows 0080 */ 0081 void newGame(int balls, int columns, int rows); 0082 0083 /** 0084 * @brief Number of balls the user placed on the board 0085 */ 0086 int numberOfBallsPlaced(); 0087 0088 /** 0089 * @brief Number of balls the user has to place on the board 0090 */ 0091 int numberOfBallsToPlace(); 0092 0093 /** 0094 * @brief Get the number of rows 0095 */ 0096 int rows() const; 0097 0098 /** 0099 * @brief Get current score 0100 */ 0101 int score(); 0102 0103 /** 0104 * @brief Shoot a ray 0105 * 0106 * This is the main player action. A laser ray is shot from a border position, interacts with the balls in the black box and get out (or hit a ball). 0107 * This costs 1 or 2 score points, depending where the laser ray exits. 0108 * 0109 * @param borderPosition Incoming border position, where the laser ray starts 0110 * @return Outgoing border position, where the laser leaves the black box. If the laser hits a ball, the result is HIT_POSITION (that is not a valid border position). 0111 */ 0112 int shootRay(int borderPosition); 0113 0114 /** 0115 * @brief Initialize the tutorial 0116 */ 0117 void startTutorial(); 0118 0119 0120 KBBBallsOnBoard* m_balls; 0121 KBBBallsOnBoard* m_ballsPlaced; 0122 0123 0124 public Q_SLOTS: 0125 void timeChanged(); 0126 0127 0128 Q_SIGNALS: 0129 void isRunning(bool); 0130 void updateStats(); 0131 0132 0133 private: 0134 void setRunning(bool r); 0135 0136 /** 0137 * @brief Sets the score value 0138 * 0139 * @param n New score 0140 */ 0141 void setScore( int n ); 0142 0143 void clean(const int columns, const int rows); 0144 0145 int m_columns; 0146 bool m_gameReallyStarted; 0147 int m_rows; 0148 QRandomGenerator m_random; 0149 int m_score; 0150 KBBTutorial* m_tutorial; 0151 }; 0152 0153 #endif //KBBGAMEDOC_H