Minor fixes
This commit is contained in:
parent
a367b26f87
commit
6ed9c48a94
@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
#include <exception>
|
#include <exception>
|
||||||
|
|
||||||
static const std::array<uint8_t, 42> defaultCardsCounter{
|
const std::array<uint8_t, 42> defaultCardsCounter{
|
||||||
4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
|
4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
|
||||||
4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 1, 1, 1, 1, 1, 1, 1, 1};
|
4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 1, 1, 1, 1, 1, 1, 1, 1};
|
||||||
|
|
||||||
@ -48,7 +48,7 @@ void Controller::fillSolveableTable() {
|
|||||||
auto next_ptr = positions.begin(); // инициализируем указатель на позицию, куда будет вставляться следующий камень
|
auto next_ptr = positions.begin(); // инициализируем указатель на позицию, куда будет вставляться следующий камень
|
||||||
|
|
||||||
while (!positions.empty()) {
|
while (!positions.empty()) {
|
||||||
int id = genRandId();
|
auto id = genRandId();
|
||||||
|
|
||||||
emplace_table(id, *next_ptr, positions); // вставляем id в next_ptr
|
emplace_table(id, *next_ptr, positions); // вставляем id в next_ptr
|
||||||
not_end--; // уменьшаем счётчик оставшихся для вставки камней
|
not_end--; // уменьшаем счётчик оставшихся для вставки камней
|
||||||
@ -60,10 +60,10 @@ void Controller::fillSolveableTable() {
|
|||||||
else
|
else
|
||||||
id = getFreeSingularId(id);
|
id = getFreeSingularId(id);
|
||||||
|
|
||||||
emplace_table(id, *next_ptr, positions);
|
emplace_table(id, *next_ptr, positions); // вставляем id в next_ptr
|
||||||
not_end--;
|
not_end--; // уменьшаем счётчик оставшихся для вставки камней
|
||||||
|
|
||||||
next_rand(positions, next_ptr, true, not_end);
|
next_rand(positions, next_ptr, true, not_end); // Находим случайную новую позицию
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -124,17 +124,18 @@ void Controller::next_rand(PosSet& positions,
|
|||||||
|
|
||||||
const auto rand_ptr = ptr; // сохраняем предыдущее положение итератора
|
const auto rand_ptr = ptr; // сохраняем предыдущее положение итератора
|
||||||
|
|
||||||
while (!canOverlap && ptr != positions.end() && wouldOverlap(prev, *ptr)) // Пока не найдём тот, что не будет закрывать только что вставленную позицию, если не canBeUp или дошли до конца набора
|
if (!canOverlap) {
|
||||||
|
while (ptr != positions.end() && wouldOverlap(prev, *ptr)) // Пока не найдём тот, что не будет закрывать только что вставленную позицию, если не canBeUp или дошли до конца набора
|
||||||
ptr++; // наращиваем итератор
|
ptr++; // наращиваем итератор
|
||||||
|
|
||||||
if (ptr == positions.end()) { // если ни одна из позиций начиная с rand_ptr не подошла (нельзя выбирать накрывающую предыдущий камень и все позиции накрывают)
|
if (ptr == positions.end()) { // если ни одна из позиций начиная с rand_ptr не подошла (нельзя выбирать накрывающую предыдущий камень и все позиции накрывают)
|
||||||
ptr = positions.begin(); // начинаем с начала
|
ptr = positions.begin(); // начинаем с начала
|
||||||
|
|
||||||
while (!canOverlap && ptr != rand_ptr && wouldOverlap(prev, *ptr)) // Пока не найдём тот, что не будет закрывать только что вставленную позицию, если не canBeUp и не дошли до rand_ptr
|
while (ptr != rand_ptr && wouldOverlap(prev, *ptr)) // Пока не найдём тот, что не будет закрывать только что вставленную позицию, если не canBeUp и не дошли до rand_ptr
|
||||||
ptr++; // наращиваем итератор
|
ptr++; // наращиваем итератор
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ptr == rand_ptr && !canOverlap && wouldOverlap(prev, *ptr)) { // если итератор совпадает с rand_ptr и при этом ptr перекрывает prev,
|
if (ptr == rand_ptr && wouldOverlap(prev, *ptr)) { // если итератор совпадает с rand_ptr и при этом ptr перекрывает prev,
|
||||||
if (not_end == positions.size()) // если уже все позиции добавлены в набор
|
if (not_end == positions.size()) // если уже все позиции добавлены в набор
|
||||||
ptr = positions.begin(); // просто выбираем первую из них
|
ptr = positions.begin(); // просто выбираем первую из них
|
||||||
else { // иначе
|
else { // иначе
|
||||||
@ -148,6 +149,7 @@ void Controller::next_rand(PosSet& positions,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Controller::wouldOverlap(const ThreePoint& prev, const ThreePoint& next) {
|
bool Controller::wouldOverlap(const ThreePoint& prev, const ThreePoint& next) {
|
||||||
@ -318,7 +320,7 @@ CardT Controller::getFreeSingularId(CardT prev) {
|
|||||||
* It also changes point to top right coordinate of card
|
* It also changes point to top right coordinate of card
|
||||||
*/
|
*/
|
||||||
CardT* Controller::getCardByPosition(ThreePoint& point) {
|
CardT* Controller::getCardByPosition(ThreePoint& point) {
|
||||||
int8_t topIndex = -1; // начинаем с -1, чтобы если не нашёлся ни один камень, получить невалидную позицию
|
int topIndex = -1; // начинаем с -1, чтобы если не нашёлся ни один камень, получить невалидную позицию
|
||||||
CardT* res = nullptr; // указатель на элемент массива
|
CardT* res = nullptr; // указатель на элемент массива
|
||||||
|
|
||||||
ThreePoint realPos(point); // сохраняем копию позиции, чтобы при смещении не ломать позицию, для которой ищем
|
ThreePoint realPos(point); // сохраняем копию позиции, чтобы при смещении не ломать позицию, для которой ищем
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
#include <wx/filename.h>
|
#include <wx/filename.h>
|
||||||
#include <wx/stdpaths.h>
|
#include <wx/stdpaths.h>
|
||||||
|
|
||||||
static const char* tileImageNames[TILE_IMAGES_N] = {
|
const char* tileImageNames[TILE_IMAGES_N] = {
|
||||||
// clang-format off
|
// clang-format off
|
||||||
"Pin1", "Pin2", "Pin3", "Pin4", "Pin5", "Pin6", "Pin7", "Pin8", "Pin9",
|
"Pin1", "Pin2", "Pin3", "Pin4", "Pin5", "Pin6", "Pin7", "Pin8", "Pin9",
|
||||||
"Sou1", "Sou2", "Sou3", "Sou4", "Sou5", "Sou6", "Sou7", "Sou8", "Sou9",
|
"Sou1", "Sou2", "Sou3", "Sou4", "Sou5", "Sou6", "Sou7", "Sou8", "Sou9",
|
||||||
@ -37,8 +37,8 @@ void Drawer::drawTable(wxDC& dc) const {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static const wxColor lGreen{0x07, 0x55, 0x2b};
|
const wxColor lGreen{0x07, 0x55, 0x2b};
|
||||||
static const wxColor dGreen{0x01, 0x2d, 0x16};
|
const wxColor dGreen{0x01, 0x2d, 0x16};
|
||||||
|
|
||||||
void Drawer::composeBG() {
|
void Drawer::composeBG() {
|
||||||
bgBitmap = wxBitmap(resolution); // создаём битмап размером со всю панейль
|
bgBitmap = wxBitmap(resolution); // создаём битмап размером со всю панейль
|
||||||
|
2
Drawer.h
2
Drawer.h
@ -30,8 +30,6 @@ public:
|
|||||||
|
|
||||||
wxSize composeMinSize(const Dimensions& gridSize) const;
|
wxSize composeMinSize(const Dimensions& gridSize) const;
|
||||||
|
|
||||||
wxSize tableSize;
|
|
||||||
|
|
||||||
wxSize tilePixelSize; // кратно 3x4, по умолчанию 600x800
|
wxSize tilePixelSize; // кратно 3x4, по умолчанию 600x800
|
||||||
wxSize resolution;
|
wxSize resolution;
|
||||||
wxRect boardPixelRect;
|
wxRect boardPixelRect;
|
||||||
|
@ -47,13 +47,13 @@ MainFrame::MainFrame()
|
|||||||
void MainFrame::initMenu() {
|
void MainFrame::initMenu() {
|
||||||
wxMenu* menuGame = new wxMenu; // Создаём подменю
|
wxMenu* menuGame = new wxMenu; // Создаём подменю
|
||||||
menuGame->Append(IDM_New_Game, _("Начать сначала\tCTRL+N")); // Создаем пункт меню с id обработчика IDM_New_Game, далее аналогично
|
menuGame->Append(IDM_New_Game, _("Начать сначала\tCTRL+N")); // Создаем пункт меню с id обработчика IDM_New_Game, далее аналогично
|
||||||
menuGame->Append(IDM_Open, _("Открыть карту"));
|
menuGame->Append(IDM_Open, _("Открыть карту\tCTRL+O"));
|
||||||
menuGame->AppendCheckItem(IDM_Solveable, _("Генерировать решаемую карту"));
|
menuGame->AppendCheckItem(IDM_Solveable, _("Генерировать решаемую карту"));
|
||||||
menuGame->AppendSeparator(); // Добавляем горизонтальный разделитель в меню
|
menuGame->AppendSeparator(); // Добавляем горизонтальный разделитель в меню
|
||||||
menuGame->Append(IDM_Undo, _("Отменить ход"));
|
menuGame->Append(IDM_Undo, _("Отменить ход"));
|
||||||
menuGame->Append(IDM_Reshuffle, _("Перемешать поле"));
|
menuGame->Append(IDM_Reshuffle, _("Перемешать поле"));
|
||||||
menuGame->AppendSeparator();
|
menuGame->AppendSeparator();
|
||||||
menuGame->Append(IDM_Exit, _("Выход"));
|
menuGame->Append(IDM_Exit, _("Выход\tCTRL+Q"));
|
||||||
|
|
||||||
wxMenu* menuHelp = new wxMenu;
|
wxMenu* menuHelp = new wxMenu;
|
||||||
menuHelp->Append(IDM_Help, _("Инструкция"));
|
menuHelp->Append(IDM_Help, _("Инструкция"));
|
||||||
|
@ -20,13 +20,13 @@ TextDlg::TextDlg(wxWindow* parent, wxWindowID id, const wxString& title, const w
|
|||||||
wxDefaultSize, wxSP_WRAP);
|
wxDefaultSize, wxSP_WRAP);
|
||||||
|
|
||||||
const wxClientDC dc(text); // создаём dc, используя для него настройки статического текста
|
const wxClientDC dc(text); // создаём dc, используя для него настройки статического текста
|
||||||
const wxSize lineSize = dc.GetTextExtent(wxString('W', 40U)); // получаем из dc размеры строчки из 40 символов 'W' (так как текст удобнее всего читать, если в нём около 40-60 символов в строке)
|
const wxSize& lineSize = dc.GetTextExtent(wxString('W', 40U)); // получаем из dc размеры строчки из 40 символов 'W' (так как текст удобнее всего читать, если в нём около 40-60 символов в строке)
|
||||||
|
|
||||||
scrollableWnd->SetScrollbars(lineSize.x, lineSize.y, 0, 0); // устанавливаем скорость скролла (количество пикселей, прокручиваемых при одинарном прокручивании колеса мыши, или нажатие кнопки)
|
scrollableWnd->SetScrollbars(lineSize.x, lineSize.y, 0, 0); // устанавливаем скорость скролла (количество пикселей, прокручиваемых при одинарном прокручивании колеса мыши, или нажатие кнопки)
|
||||||
|
|
||||||
text->Wrap(lineSize.x); // Делаем перенос строк для того, чтобы вместить текст в ширину строки
|
text->Wrap(lineSize.x); // Делаем перенос строк для того, чтобы вместить текст в ширину строки
|
||||||
|
|
||||||
auto textSize = text->GetClientSize(); // получаем размер статического текста
|
const wxSize& textSize = text->GetClientSize(); // получаем размер статического текста
|
||||||
|
|
||||||
scrollableWnd->SetVirtualSize(textSize.x, textSize.y); // устанавливаем виртуальный размер окна прокрутки равным размерам статического текста
|
scrollableWnd->SetVirtualSize(textSize.x, textSize.y); // устанавливаем виртуальный размер окна прокрутки равным размерам статического текста
|
||||||
|
|
||||||
|
@ -16,7 +16,7 @@ bool XmlLayout::openFile(const wxString& openPath) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Dimensions XmlLayout::getDimensions() {
|
Dimensions XmlLayout::getDimensions() {
|
||||||
auto root = layoutDoc.GetRoot(); // сохраняем в ссылке указатель на корневой элемент XML-документа
|
auto root = layoutDoc.GetRoot(); // сохраняем указатель на корневой элемент XML-документа
|
||||||
|
|
||||||
lx = wxAtoi(root->GetAttribute("lx")); // считываем минимальный x
|
lx = wxAtoi(root->GetAttribute("lx")); // считываем минимальный x
|
||||||
ly = wxAtoi(root->GetAttribute("ly")); // считываем минимальный y
|
ly = wxAtoi(root->GetAttribute("ly")); // считываем минимальный y
|
||||||
|
2
utils.h
2
utils.h
@ -16,7 +16,7 @@ wxString PRemaining(uint8_t remaining);
|
|||||||
#define mmin(a, b) (a + b - abs(a - b)) / 2 // среднее арифметическое минус половина разницы
|
#define mmin(a, b) (a + b - abs(a - b)) / 2 // среднее арифметическое минус половина разницы
|
||||||
#define mmax(a, b) (a + b + abs(a - b)) / 2 // среднее арифметическое плюс половина разницы
|
#define mmax(a, b) (a + b + abs(a - b)) / 2 // среднее арифметическое плюс половина разницы
|
||||||
|
|
||||||
using CardT = int16_t;
|
using CardT = int8_t;
|
||||||
|
|
||||||
struct Dimensions : wxSize { // используется там, где необходимо задать размеры в трёх координатах
|
struct Dimensions : wxSize { // используется там, где необходимо задать размеры в трёх координатах
|
||||||
Dimensions(int _z, int _x, int _y) : z(_z), wxSize(_x, _y){};
|
Dimensions(int _z, int _x, int _y) : z(_z), wxSize(_x, _y){};
|
||||||
|
Loading…
x
Reference in New Issue
Block a user