diff --git a/kpat.kcfg b/kpat.kcfg
index 8afb181..c57d0ce 100644
--- a/kpat.kcfg
+++ b/kpat.kcfg
@@ -1,39 +1,42 @@
true
true
false
false
svg-oxygen-air
true
2
0
1000000
200000
+
+ 200000
+
diff --git a/simon.cpp b/simon.cpp
index f540570..0316237 100644
--- a/simon.cpp
+++ b/simon.cpp
@@ -1,189 +1,192 @@
/*
* Copyright (C) 2000-2009 Stephan Kulow
* Copyright (C) 2010 Parker Coates
*
* License of original code:
* -------------------------------------------------------------------------
* Permission to use, copy, modify, and distribute this software and its
* documentation for any purpose and without fee is hereby granted,
* provided that the above copyright notice appear in all copies and that
* both that copyright notice and this permission notice appear in
* supporting documentation.
*
* This file is provided AS IS with no warranties of any kind. The author
* shall have no liability with respect to the infringement of copyrights,
* trade secrets or any patents by this file or any part thereof. In no
* event will the author be liable for any lost revenue or profits or
* other special, indirect and consequential damages.
* -------------------------------------------------------------------------
*
* License of modifications/additions made after 2009-01-01:
* -------------------------------------------------------------------------
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation; either version 2 of
* the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see .
* -------------------------------------------------------------------------
*/
#include "simon.h"
#include "dealerinfo.h"
#include "pileutils.h"
#include "patsolve/simonsolver.h"
+#include "settings.h"
#include
Simon::Simon( const DealerInfo * di )
: DealerScene( di )
{
}
void Simon::initialize()
{
setDeckContents();
const qreal dist_x = 1.11;
for ( int i = 0; i < 4; ++i )
{
target[i] = new PatPile( this, i + 1, QStringLiteral( "target%1" ).arg( i ) );
target[i]->setPileRole(PatPile::Foundation);
target[i]->setLayoutPos((i+3)*dist_x, 0);
target[i]->setSpread(0, 0);
target[i]->setKeyboardSelectHint( KCardPile::NeverFocus );
target[i]->setKeyboardDropHint( KCardPile::AutoFocusTop );
}
for ( int i = 0; i < 10; ++i )
{
store[i] = new PatPile( this, 5 + i, QStringLiteral( "store%1" ).arg( i ) );
store[i]->setPileRole(PatPile::Tableau);
store[i]->setLayoutPos(dist_x*i, 1.2);
store[i]->setBottomPadding( 2.5 );
store[i]->setHeightPolicy( KCardPile::GrowDown );
store[i]->setZValue( 0.01 * i );
store[i]->setKeyboardSelectHint( KCardPile::AutoFocusDeepestRemovable );
store[i]->setKeyboardDropHint( KCardPile::AutoFocusTop );
}
setActions(DealerScene::Hint | DealerScene::Demo);
- setSolver( new SimonSolver( this ) );
+ auto solver = new SimonSolver( this );
+ solver->default_max_positions = Settings::simpleSimonSolverIterationsLimit();
+ setSolver( solver );
//setNeededFutureMoves( 1 ); // could be some nonsense moves
}
void Simon::restart( const QList & cards )
{
QList cardList = cards;
QPointF initPos( 0, -deck()->cardHeight() );
for ( int piles = 9; piles >= 3; --piles )
for ( int j = 0; j < piles; ++j )
addCardForDeal( store[j], cardList.takeLast(), true, initPos );
for ( int j = 0; j < 10; ++j )
addCardForDeal( store[j], cardList.takeLast(), true, initPos );
Q_ASSERT( cardList.isEmpty() );
startDealAnimation();
}
bool Simon::checkPrefering(const PatPile * pile, const QList & oldCards, const QList & newCards) const
{
return pile->pileRole() == PatPile::Tableau
&& !oldCards.isEmpty()
&& oldCards.last()->suit() == newCards.first()->suit();
}
bool Simon::checkAdd(const PatPile * pile, const QList & oldCards, const QList & newCards) const
{
if (pile->pileRole() == PatPile::Tableau)
{
if (! (oldCards.isEmpty()
|| oldCards.last()->rank() == newCards.first()->rank() + 1 ))
{
return false;
}
int seqs_count = countSameSuitDescendingSequences(newCards);
if (seqs_count < 0)
return false;
// This is similar to the supermoves of Freecell - we can use empty
// columns to temporarily hold intermediate sub-sequences which are
// not the same suit - only a "false" parent.
// Shlomi Fish
int empty_piles_count = 0;
for (int i = 0; i < 10; ++i )
if (store[i]->isEmpty() && ( store[i]->index() != pile->index() ))
empty_piles_count++;
return (seqs_count <= (1 << empty_piles_count));
}
else
{
return oldCards.isEmpty()
&& newCards.first()->rank() == KCardDeck::King
&& newCards.last()->rank() == KCardDeck::Ace
&& isSameSuitDescending(newCards);
}
}
bool Simon::checkRemove(const PatPile * pile, const QList & cards) const
{
if (pile->pileRole() != PatPile::Tableau)
return false;
int seqs_count = countSameSuitDescendingSequences(cards);
return (seqs_count >= 0);
}
QString Simon::solverFormat() const
{
QString output;
QString tmp;
for (int i = 0; i < 4 ; i++) {
if (target[i]->isEmpty())
continue;
tmp += suitToString(target[i]->topCard()->suit()) + "-K ";
}
if (!tmp.isEmpty())
output += QStringLiteral("Foundations: %1\n").arg(tmp);
for (int i = 0; i < 10 ; i++)
{
cardsListToLine(output, store[i]->cards());
}
return output;
}
static class SimonDealerInfo : public DealerInfo
{
public:
SimonDealerInfo()
: DealerInfo(I18N_NOOP("Simple Simon"), SimpleSimonId)
{}
DealerScene *createGame() const Q_DECL_OVERRIDE
{
return new Simon( this );
}
} simonDealerInfo;