Назад | Начало урока | Вперед
Содержание

Глава 1


GENDATA CField::GenerateMove(int x, int y) {
int a, i, j, sumx, razx, razy, sumy, cx, cy;
static c = -1; POINT pos = {
-1, -1
}; int dir; int IsKilled;
GENDATA data;
POINT pt;
int u;

//генерирование следующего случайного хода
pt.x = x;
pt.y = y;
if(pt.x == -1 || pt.y == -1) {

if(c == -1) {
a = GenerateNumber(100);
c = (a/10)%2 + a%2;
}
u=0;

while(1) {

u++;
if(u>20) {
a = GenerateNumber(100);
if(m_Event[a/10][a-(a/10)*10] != CANNOT &&
m_Event[a/10][a-(a/10)*10] != SHIPKILLED &&
m_Event[a/10][a-(a/10)*10] != NEARKILLEDSHIP &&
m_Event[a/10][a-(a/10)*10] != SHIPWOUND)
{
pos.x = (a-(a/10)*10);
pos.y = (a/10);
break;
}
}
a = GenerateNumber(100);
if((((a/10)%2+a%2)%2 == c%2) &&
m_Event[a/10][a-(a/10)*10] != CANNOT &&
m_Event[a/10][a-(a/10)*10] != SHIPKILLED &&
m_Event[a/10][a-(a/10)*10] != NEARKILLEDSHIP &&
m_Event[a/10][a-(a/10)*10] != SHIPWOUND)
{
pos.x = (a-(a/10)*10);
pos.y = (a/10);
break;
}
}//end while
}
else {
if((pt.y+1<10 && m_Event[pt.y+1][pt.x] == SHIPWOUND)||
(pt.y-1>=0 && m_Event[pt.y-1][pt.x] == SHIPWOUND)){
dir = VERT;
}
else {}
if((pt.x+1<10 && m_Event[pt.y][pt.x+1] == SHIPWOUND)||
(pt.x-1>=0 && m_Event[pt.y][pt.x-1] == SHIPWOUND)){
dir = HOR;
}
else{
dir = ONLYONE;
}

//здесь должно выполняться (к примеру вправо): след. элемент существует,
//и неравен CANNOT(тобишь по нему не стреляли), через один элемент, если
//он существует, то вправо, вверх и вниз не должно быть кораблей.
switch(dir) {

case HOR:
for(i=1; i<4; i++)
if(pt.x+i==10 || m_Event[pt.y][pt.x+i] != SHIPWOUND) break;
if(pt.x+i<10 && m_Event[pt.y][pt.x+i] != CANNOT
&& m_Event[pt.y][pt.x+i] != NEARKILLEDSHIP &&
((pt.x+i+1<10 && ((pt.y-1>=0 &&
m_Event[pt.y-1][pt.x+i+1] != SHIP &&
m_Event[pt.y-1][pt.x+i+1] != SHIPKILLED &&
m_Event[pt.y-1][pt.x+i+1] != SHIPWOUND)
|| pt.y-1==-1) &&
m_Event[pt.y][pt.x+i+1] != SHIPKILLED &&
m_Event[pt.y][pt.x+i+1] != SHIPWOUND &&
((pt.y+1<10 &&
m_Event[pt.y+1][pt.x+i+1] != SHIP &&
m_Event[pt.y+1][pt.x+i+1] != SHIPKILLED &&
m_Event[pt.y+1][pt.x+i+1] != SHIPWOUND)
|| pt.y+1==10))
|| pt.x+i+1==10)) {
pos.x=pt.x+i; pos.y=pt.y; break;
}
for(i=1; i<4; i++)
if(m_Event[pt.y][pt.x-i] != SHIPWOUND || pt.x-i==-1) break;
if(pt.x-i>=0 && m_Event[pt.y][pt.x-i] != CANNOT &&
m_Event[pt.y][pt.x-i] != NEARKILLEDSHIP &&
((pt.x-i-1>=0 &&
((pt.y-1>=0 && m_Event[pt.y-1][pt.x-i-1] != SHIP &&
m_Event[pt.y-1][pt.x-i-1] != SHIPKILLED) ||
pt.y-1==-1) &&
m_Event[pt.y][pt.x-i-1] != SHIPKILLED &&
((pt.y+1<10 && m_Event[pt.y+1][pt.x-i-1] != SHIP &&
m_Event[pt.y+1][pt.x-i-1] != SHIPKILLED) ||
pt.y+1==10))
|| pt.x-i-1==-1)) {
pos.x=pt.x-i;
pos.y=pt.y; break;
}
break;

case VERT:

for(i=1; i<4; i++)
if(m_Event[pt.y+i][pt.x] != SHIPWOUND || pt.y+i==10) break;
if(pt.y+i<10 && m_Event[pt.y+i][pt.x] != CANNOT
&& m_Event[pt.y+i][pt.x] != NEARKILLEDSHIP &&
((pt.y+i+1<10 &&
((pt.x-1>=0 && m_Event[pt.y+i+1][pt.x-1] != SHIP &&
m_Event[pt.y+i+1][pt.x-1] != SHIPKILLED) || pt.x-1==-1)
&& m_Event[pt.y+i+1][pt.x] != SHIPKILLED
&& ((pt.x+1<10 && m_Event[pt.y+i+1][pt.x+1] != SHIP &&
m_Event[pt.y+i+1][pt.x+1] != SHIPKILLED) || pt.x+1==10))
|| pt.y+i+1==10)) {
pos.x=pt.x;
pos.y=pt.y+i; break;
}
for(i=1; i<4; i++)
if(m_Event[pt.y-i][pt.x] != SHIPWOUND || pt.y-i==-1) break;
if(pt.y-i>=0 && m_Event[pt.y-i][pt.x] != CANNOT
&& m_Event[pt.y-i][pt.x] != NEARKILLEDSHIP &&
((pt.y-i-1>=0 &&
((pt.x-1>=0 && m_Event[pt.y-i-1][pt.x-1] != SHIP &&
m_Event[pt.y-i-1][pt.x-1] != SHIPKILLED) || pt.x-1==-1)
&& m_Event[pt.y-i-1][pt.x] != SHIPKILLED
&& ((pt.x+1<10 && m_Event[pt.y-i-1][pt.x+1] != SHIP &&
m_Event[pt.y-i-1][pt.x+1] != SHIPKILLED) || pt.x+1==10))
|| pt.y-i-1==-1)) {
pos.x=pt.x;
pos.y=pt.y-i; break;
}
break;

case ONLYONE:

if(pt.x+1<10 && m_Event[pt.y][pt.x+1] != CANNOT
&& m_Event[pt.y][pt.x+1] != NEARKILLEDSHIP &&
((pt.x+2<10 && ((pt.y-1>=0 && m_Event[pt.y-1][pt.x+2] != SHIP &&
m_Event[pt.y-1][pt.x+2] != SHIPKILLED) || pt.y-1==-1)
&& m_Event[pt.y][pt.x+2] != SHIPKILLED
&& ((pt.y+1<10 && m_Event[pt.y+1][pt.x+2] != SHIP &&
m_Event[pt.y+1][pt.x+2] != SHIPKILLED) || pt.y+1==10))
|| pt.x+2==10)) {
pos.x=pt.x+1; pos.y=pt.y; break;
}
if(pt.x-1>=0 && m_Event[pt.y][pt.x-1] != CANNOT
&& m_Event[pt.y][pt.x-1] != NEARKILLEDSHIP &&
((pt.x-2>=0 && ((pt.y-1>=0 && m_Event[pt.y-1][pt.x-2] != SHIP &&
m_Event[pt.y-1][pt.x-2] != SHIPKILLED) || pt.y-1==-1)
&& m_Event[pt.y][pt.x-2] != SHIPKILLED
&& ((pt.y+1<10 && m_Event[pt.y+1][pt.x-2] != SHIP &&
m_Event[pt.y+1][pt.x-2] != SHIPKILLED) || pt.y+1==10))
|| pt.x-2==-1)) {
pos.x=pt.x-1; pos.y=pt.y; break;
}
if(pt.y+1<10 && m_Event[pt.y+1][pt.x] != CANNOT
&& m_Event[pt.y+1][pt.x] != NEARKILLEDSHIP &&
((pt.y+2<10 && ((pt.x-1>=0 && m_Event[pt.y+2][pt.x-1] != SHIP &&
m_Event[pt.y+2][pt.x-1] != SHIPKILLED) || pt.x-1==-1)
&& m_Event[pt.y+2][pt.x] != SHIPKILLED
&& ((pt.x+1<10 && m_Event[pt.y+2][pt.x+1] != SHIP &&
m_Event[pt.y+2][pt.x+1] != SHIPKILLED) || pt.x+1==10))
|| pt.y+2==10)) {
pos.x=pt.x; pos.y=pt.y+1; break;
}
if(pt.y-1>=0 && m_Event[pt.y-1][pt.x] != CANNOT
&& m_Event[pt.y-1][pt.x] != NEARKILLEDSHIP &&
((pt.y-2>=0 && ((pt.x-1>=0 && m_Event[pt.y-2][pt.x-1] != SHIP &&
m_Event[pt.y-2][pt.x-1] != SHIPKILLED) || pt.x-1==-1)
&& m_Event[pt.y-2][pt.x] != SHIPKILLED
&& ((pt.x+1<10 && m_Event[pt.y-2][pt.x+1] != SHIP &&
m_Event[pt.y-2][pt.x+1] != SHIPKILLED) || pt.x+1==10))
|| pt.y-2==-1)) {
pos.x=pt.x;
pos.y=pt.y-1; break;
}
break;
}
}

//проверка на попадание
if(m_Event[pos.y][pos.x] == SHIP) {

m_Event[pos.y][pos.x] = SHIPWOUND;
IsKilled = SHIPKILLED;
for(i=1; i<4; i++)
if(m_Event[pos.y][pos.x+i] != SHIPWOUND || pos.x+i==10)break;
if(m_Event[pos.y][pos.x+i] == SHIP && pos.x+i<10)
IsKilled = SHIPWOUND;
for(i=1; i<4; i++)
if(m_Event[pos.y][pos.x-i] != SHIPWOUND || pos.x-i==-1)break;
if(m_Event[pos.y][pos.x-i] == SHIP && pos.x-i>=0)
IsKilled = SHIPWOUND;
for(i=1; i<4; i++)
if(m_Event[pos.y+i][pos.x] != SHIPWOUND || pos.y+i==10)break;
if(m_Event[pos.y+i][pos.x] == SHIP && pos.y+i<10)
IsKilled = SHIPWOUND;
for(i=1; i<4; i++)
if(m_Event[pos.y-i][pos.x] != SHIPWOUND || pos.y-i==-1)break;
if(m_Event[pos.y-i][pos.x] == SHIP && pos.y-i>=0)
IsKilled = SHIPWOUND;
if(IsKilled == SHIPKILLED) {
sumx = razx = sumy = razy = 0;
for(i=1; i<4; i++) {
if(m_Event[pos.y][pos.x+i] == SHIPWOUND && pos.x+i<10) {
m_Event[pos.y][pos.x+i] = SHIPKILLED;
sumx++;
}
if(m_Event[pos.y][pos.x-i] == SHIPWOUND && pos.x-i>=0) {
m_Event[pos.y][pos.x-i] = SHIPKILLED;
razx++;
}
if(m_Event[pos.y+i][pos.x] == SHIPWOUND && pos.y+i<10) {
m_Event[pos.y+i][pos.x] = SHIPKILLED;
sumy++;
}
if(m_Event[pos.y-i][pos.x] == SHIPWOUND && pos.y-i>=0) {
m_Event[pos.y-i][pos.x] = SHIPKILLED;
razy++;
}
}
m_Event[pos.y][pos.x] = SHIPKILLED;
if(pos.x-razx-1>=0) x = pos.x-razx-1;
else x = pos.x-razx;
if(pos.x+sumx+1<10) cx = pos.x+sumx+1;
else cx = pos.x+sumx;
if(pos.y-razy-1>=0) y = pos.y-razy-1;
else y = pos.y-razy;
if(pos.y+sumy+1<10) cy = pos.y+sumy+1;
else cy = pos.y+sumy;
for(i=y; i<=cy; i++)
for(j=x; j<=cx; j++)
if(m_Event[i][j] != SHIPKILLED)
m_Event[i][j] = NEARKILLEDSHIP;
InvalidateRect(CRect(x*20, y*20, (cx+1)*20, (cy+1)*20));
data.x = (int)pos.x;
data.y = (int)pos.y;
data.IsKilled = SHIPKILLED;
}
else {
data.x = (int)pos.x;
data.y = (int)pos.y;
data.IsKilled = SHIPWOUND;
InvalidateRect(CRect(pos.x*20, pos.y*20, (pos.x+1)*20, (pos.y+1)*20));
}
}
else {
m_Event[pos.y][pos.x] = CANNOT; if(pt.x == -1 || pt.y == -1) {
data.x = (int)pos.x;
data.y = (int)pos.y;
data.IsKilled = EMPTY;
InvalidateRect(CRect(pos.x*20, pos.y*20, (pos.x+1)*20, (pos.y+1)*20));
}
else {
data.x = (int)pt.x*10+pos.x;
data.y = (int)pt.y*10 + pos.y;
data.IsKilled = SHIPNOTKILLED;
InvalidateRect(CRect(pos.x*20, pos.y*20, (pos.x+1)*20, (pos.y+1)*20));
}
}
return data;
}


Назад | Начало урока | Вверх | Вперед
Содержание

Hosted by uCoz