-
Notifications
You must be signed in to change notification settings - Fork 0
/
Queen.cpp
120 lines (105 loc) · 3.74 KB
/
Queen.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
//
// Queen.cpp
// Chess
//
// Created by mustafa tok on 12.12.2011.
//
#include <iostream>
#include "Component.h"
void Queen::draw(){
if(this->isBlack())
cout << "q";
else
cout << "Q";}
int Queen::canmove(Point &p1, Point &p2){
int dx = p2.getX() - p1.getX();
int dy = p2.getY() - p1.getY();
if(dx != dy && dx != -dy && dx != 0 && dy != 0){
return CANTMOVE;
}
Component* source = this;
Component* target;
target = parent->getComponent(p2.getX(), p2.getY());
AbstractIterator *iterator;
int x = p1.getX();
int y = p1.getY();
if(dx < 0 && dy > 0){
iterator = parent->CreateCrossRightUpwardIterator(x, y);
}else if(dx > 0 && dy > 0){
iterator = parent->CreateCrossRightDownwardIterator(x, y);
}else if(dx < 0 && dy < 0){
iterator = parent->CreateCrossLeftUpwardIterator(x, y);
}else if(dx > 0 && dy < 0){
iterator = parent->CreateCrossLeftDownwardIterator(x, y);
}else if(dy == 0 && dx > 0){
iterator = parent->CreateColumnDownwardIterator(x,y);
}else if(dy == 0 && dx < 0){
iterator = parent->CreateColumnUpwardIterator(x,y);
}else if(dx == 0 && dy > 0){
iterator = parent->CreateRowForwardIterator(x,y);
}else if(dx == 0 && dy < 0){
iterator = parent->CreateRowBackwardIterator(x,y);
}
else{
return CANTMOVE;
}
for(iterator->First(); !iterator->isDone(); iterator->Next()){
//cout << iterator->CurrentItem() << " x : " << iterator->CurrentPoint().getX()<< " y : " << iterator->CurrentPoint().getY()<<endl;
if(p2.getX() == iterator->CurrentPoint().getX() && p2.getY() == iterator->CurrentPoint().getY()){
if(iterator->CurrentItem() == NULL){
delete iterator;///////check
return EMPTYMOVE;
}else if(!iterator->CurrentItem()->isSameColor(source)){
delete iterator;///////check
return ENEMYMOVE;
}
break;
}
if(iterator->CurrentItem() != NULL){
delete iterator;///////check
return CANTMOVE;
}
}
delete iterator;///////check
return CANTMOVE;
}
BoardQueue* Queen::successor(Point &p){
BoardQueue *q = new BoardQueue();
AbstractIterator *it[8] ;
it[0] = parent->CreateCrossLeftDownwardIterator(p.getX(), p.getY());
it[1] = parent->CreateCrossRightDownwardIterator(p.getX(), p.getY());
it[2] = parent->CreateCrossLeftUpwardIterator(p.getX(), p.getY());
it[3] = parent->CreateCrossRightUpwardIterator(p.getX(), p.getY());
it[4] = parent->CreateRowForwardIterator(p.getX(), p.getY());
it[5] = parent->CreateRowBackwardIterator(p.getX(), p.getY());
it[6] = parent->CreateColumnDownwardIterator(p.getX(), p.getY());
it[7] = parent->CreateColumnUpwardIterator(p.getX(), p.getY());
for(int i = 0; i < 8; i++){
for(it[i]->First(); !it[i]->isDone(); it[i]->Next()){
if(it[i]->CurrentItem() == NULL){
Point tp = it[i]->CurrentPoint();
Board *b = parent->clone();
b->moveComponent(p, tp);
q->enqueue(b);
}else if(!this->isSameColor(it[i]->CurrentItem())){
Point tp = it[i]->CurrentPoint();
Board *b = parent->clone();
b->moveComponent(p, tp);
q->enqueue(b);
break;
}else{
break;
}
}
delete it[i];
it[i] = NULL;//////////checkkkkkkk
}
return q;
}
Component* Queen::clone(Board* parent){
Queen *newClone = new Queen(parent, color);
if(this->isTouched()){
newClone->setTouched();
}
return newClone;
}