Skip to content

Commit 2b1a726

Browse files
committed
initial commit
0 parents  commit 2b1a726

30 files changed

+1344
-0
lines changed

Cartes.pro

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
QT += widgets
2+
QT += core
3+
CONFIG += console
4+
5+
SOURCES += main.cpp \
6+
card.cpp \
7+
deck.cpp \
8+
board.cpp \
9+
cardwidget.cpp \
10+
cardproxy.cpp \
11+
cardspot.cpp \
12+
freecell.cpp \
13+
abstractcardholder.cpp \
14+
columnspot.cpp \
15+
cardspotproxy.cpp \
16+
acespot.cpp
17+
18+
HEADERS += \
19+
card.h \
20+
deck.h \
21+
board.h \
22+
cardwidget.h \
23+
cardproxy.h \
24+
cardspot.h \
25+
freecell.h \
26+
abstractcardholder.h \
27+
columnspot.h \
28+
cardspotproxy.h \
29+
acespot.h
30+
31+
RESOURCES += \
32+
resources.qrc
33+

Cartes.pro.user

Lines changed: 257 additions & 0 deletions
Large diffs are not rendered by default.

abstractcardholder.cpp

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
#include "abstractcardholder.h"
2+
3+
AbstractCardHolder::AbstractCardHolder()
4+
{
5+
mParent = 0;
6+
mChild = 0;
7+
}
8+
9+
AbstractCardHolder* AbstractCardHolder::getParent()
10+
{
11+
return mParent;
12+
}
13+
14+
void AbstractCardHolder::setChild(Card* card)
15+
{
16+
mChild = card;
17+
}
18+
19+
Card* AbstractCardHolder::getChild()
20+
{
21+
return mChild;
22+
}
23+
24+
int AbstractCardHolder::getZIndex()
25+
{
26+
return 0;
27+
}

abstractcardholder.h

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
#ifndef ABSTRACTCARDHOLDER_H
2+
#define ABSTRACTCARDHOLDER_H
3+
4+
class QPoint;
5+
class Card;
6+
7+
class AbstractCardHolder
8+
{
9+
public:
10+
AbstractCardHolder();
11+
AbstractCardHolder* getParent();
12+
13+
virtual void setChild(Card*);
14+
Card* getChild();
15+
16+
virtual bool canStackCard(Card* card) = 0;
17+
virtual bool isStackable() = 0;
18+
19+
virtual QPoint getChildPosition() = 0;
20+
virtual int getZIndex();
21+
22+
protected:
23+
AbstractCardHolder* mParent;
24+
Card* mChild;
25+
};
26+
27+
#endif // ABSTRACTCARDHOLDER_H

acespot.cpp

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
#include "acespot.h"
2+
#include "board.h"
3+
#include "cardwidget.h"
4+
#include "cardspotproxy.h"
5+
#include <QFrame>
6+
7+
AceSpot::AceSpot(Board* board) : CardSpot(board)
8+
{
9+
mProxy = new CardSpotProxy(this);
10+
QFrame* widget = new QFrame();
11+
widget->resize(CardWidget::WIDTH, CardWidget::HEIGHT);
12+
widget->setStyleSheet("background-color:#00FF00;border:1px solid black;");
13+
mProxy->setWidget(widget);
14+
mBoard->addItem(mProxy);
15+
}
16+
17+
bool AceSpot::canStackCard(Card* card)
18+
{
19+
if (CardSpot::canStackCard(card) && card->getValue() == ACE) {
20+
return true;
21+
}
22+
return false;
23+
}
24+
25+
bool AceSpot::isStackable()
26+
{
27+
return true;
28+
}
29+
30+
void AceSpot::setChild(Card* card)
31+
{
32+
CardSpot::setChild(card);
33+
if (card) {
34+
card->setOnAceSpot(true);
35+
}
36+
}

acespot.h

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
#ifndef ACESPOT_H
2+
#define ACESPOT_H
3+
4+
#include "cardspot.h"
5+
6+
class Board;
7+
class Card;
8+
9+
class AceSpot : public CardSpot
10+
{
11+
public:
12+
AceSpot(Board*);
13+
bool canStackCard(Card*);
14+
bool isStackable();
15+
void setChild(Card *);
16+
};
17+
18+
#endif // ACESPOT_H

board.cpp

Lines changed: 158 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,158 @@
1+
#include "board.h"
2+
#include "cardwidget.h"
3+
#include "cardproxy.h"
4+
#include "columnspot.h"
5+
#include "acespot.h"
6+
#include "freecell.h"
7+
8+
#include <QGraphicsScene>
9+
#include <QGraphicsView>
10+
#include <QGraphicsItem>
11+
#include <QPointF>
12+
13+
Board::Board() : QObject()
14+
{
15+
int i;
16+
17+
for (i = 0; i < NB_COLUMNS; i++) {
18+
mLeafColumns[i] = 0;
19+
}
20+
21+
mSelectedCard = 0;
22+
23+
mBoardWidget = new QGraphicsView();
24+
mBoardWidget->setStyleSheet("background-color:green;");
25+
26+
mScene = new QGraphicsScene(QRectF(0, - (int)(CardWidget::HEIGHT * 1.2), 1200, 700), mBoardWidget);
27+
mBoardWidget->setScene(mScene);
28+
29+
Freecell* freecell;
30+
for (i = 0; i < 4; i++) {
31+
freecell = new Freecell(this);
32+
freecell->setPosition(QPointF(i * CardWidget::WIDTH, mScene->sceneRect().y()));
33+
mFreeCells.push_back(freecell);
34+
}
35+
36+
AceSpot* aceSpot;
37+
for (i = 0; i < 4; i++) {
38+
aceSpot = new AceSpot(this);
39+
aceSpot->setPosition(QPointF((4+i) * CardWidget::WIDTH, mScene->sceneRect().y()));
40+
mAceSpots.push_back(aceSpot);
41+
}
42+
43+
ColumnSpot* columnSpot;
44+
for (i = 0; i < NB_COLUMNS; i++) {
45+
columnSpot = new ColumnSpot(this);
46+
columnSpot->setPosition(QPointF(i * CardWidget::WIDTH, 0));
47+
mColumns[i] = columnSpot;
48+
}
49+
50+
mDeck = new Deck(this);
51+
52+
dealCards();
53+
mBoardWidget->show();
54+
}
55+
56+
void Board::addItem(QGraphicsProxyWidget *proxy)
57+
{
58+
mScene->addItem(proxy);
59+
}
60+
61+
void Board::dealCards()
62+
{
63+
Card* card;
64+
int i = 0, col = 0;
65+
while (mDeck->getSize()) {
66+
card = mDeck->drawCard();
67+
QPoint pos((i % NB_COLUMNS) * CardWidget::WIDTH, (i / NB_COLUMNS) * CardWidget::HEIGHT / 8);
68+
card->setPosition(pos);
69+
card->setParent(mLeafColumns[col]);
70+
mLeafColumns[col] = card;
71+
72+
// first line
73+
if (i / NB_COLUMNS == 0) {
74+
card->setParent(mColumns[i]);
75+
}
76+
col = ++i % NB_COLUMNS;
77+
}
78+
}
79+
80+
void Board::freeCard(Card* card)
81+
{
82+
Card* cell = 0;//getFreeCell();
83+
if (cell) {
84+
cell = card;
85+
}
86+
}
87+
88+
int Board::countFreeCells()
89+
{
90+
int count = 0;
91+
std::vector<Freecell*>::iterator it;
92+
for (it = mFreeCells.begin(); it < mFreeCells.end(); it++) {
93+
if ((*it)->isEmpty()) {
94+
count++;
95+
}
96+
}
97+
98+
return count;
99+
}
100+
101+
bool Board::hasEnoughFreecells(int cardsToMove)
102+
{
103+
int capability = countFreeCells() + 1;
104+
105+
return capability >= cardsToMove;
106+
}
107+
108+
void Board::automaticMove(Card* card)
109+
{
110+
std::vector<AceSpot*>::iterator itAce;
111+
for (itAce = mAceSpots.begin(); itAce < mAceSpots.end(); itAce++) {
112+
113+
}
114+
115+
std::vector<Freecell*>::iterator itFreecell;
116+
for (itFreecell = mFreeCells.begin(); itFreecell < mFreeCells.end(); itFreecell++) {
117+
if ((*itFreecell)->isEmpty()) {
118+
card->setParent(*itFreecell);
119+
break;
120+
}
121+
}
122+
}
123+
124+
void Board::unselectCard()
125+
{
126+
if (mSelectedCard) {
127+
mSelectedCard->setSelected(false);
128+
mSelectedCard = 0;
129+
}
130+
}
131+
132+
void Board::selectCard(Card* card)
133+
{
134+
if (mSelectedCard == card) {
135+
unselectCard();
136+
} else if (mSelectedCard && card->canStackCard(mSelectedCard)) {
137+
if (card->isOnAceSpot()) {
138+
mSelectedCard->setOnAceSpot(true);
139+
}
140+
mSelectedCard->setParent(card);
141+
} else {
142+
setSelectedCard(card);
143+
}
144+
}
145+
146+
void Board::setSelectedCard(Card* card)
147+
{
148+
if (mSelectedCard) {
149+
mSelectedCard->setSelected(false);
150+
}
151+
mSelectedCard = card;
152+
mSelectedCard->setSelected(true);
153+
}
154+
155+
Card* Board::getSelectedCard()
156+
{
157+
return mSelectedCard;
158+
}

board.h

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
#ifndef BOARD_H
2+
#define BOARD_H
3+
4+
#include <vector>
5+
#include <QObject>
6+
7+
#include "card.h"
8+
#include "deck.h"
9+
10+
class QGraphicsProxyWidget;
11+
class QGraphicsScene;
12+
class QGraphicsView;
13+
class AceSpot;
14+
class ColumnSpot;
15+
class Freecell;
16+
17+
class Board : public QObject
18+
{
19+
Q_OBJECT
20+
public:
21+
Board();
22+
23+
void dealCards();
24+
void freeCard(Card* card);
25+
int countFreeCells();
26+
bool hasEnoughFreecells(int cardsToMove);
27+
28+
void automaticMove(Card*);
29+
void unselectCard();
30+
void selectCard(Card*);
31+
32+
void setSelectedCard(Card*);
33+
Card* getSelectedCard();
34+
void addItem(QGraphicsProxyWidget*);
35+
36+
protected:
37+
std::vector<AceSpot*> mAceSpots;
38+
std::vector<Freecell*> mFreeCells;
39+
40+
const static int NB_COLUMNS = 8;
41+
Card* mLeafColumns[NB_COLUMNS];
42+
ColumnSpot* mColumns[NB_COLUMNS];
43+
44+
Deck* mDeck;
45+
QGraphicsView *mBoardWidget;
46+
QGraphicsScene* mScene;
47+
48+
Card* mSelectedCard;
49+
};
50+
51+
#endif // BOARD_H

0 commit comments

Comments
 (0)