Не могу найти ошибку(морской бой) - C (СИ)
Формулировка задачи:
Пишу игру морской бой. так вот одна из функций, которые я взял из чужой програмы работает не правильно: ShipTest(Проверка уничтожен ли корабль) delship(обозначить корабль мертвым).
Когда отлаживал то отладчик с ума сходит: стрелка отладчика прыгает вверх в низ, хотя нет там ни циклов и ничего что бы заставило ее себя так вести. Преподователь, хотя он очень хороший програмист разводит руками, и не знает почему так компилируется.
Надеюсь на вашу помощь.
// seawar.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <iostream>
#include <time.h>
#define VER 10 // размер поля по вертикали
#define GOR 10 // размер поля по горизонтали
#define N 4 // количество разных видов кораблей
int Field[VER][GOR]={0};
void printField2()//Распечатать поле
{
printf(" 1234567890");
for(int i=0; i<10; i++)
{
printf("\n%c.", 'A'+i);
for(int j=0; j<10; j++)
switch(Field[i][j])
{
case 0: printf("-"); break;
case 1: printf("1"); break;
case 2: printf("m"); break;
case 3: printf("r"); break;
case 4: printf("X");
}
//printf("\n");
}
printf("\n");
}
struct ship
{
int number;
int qual;
};
int testPoint (int x, int y)//Проверки, не вышло ли за пределы поля
{
if ((x<0) || (x>=GOR)) return 0;
if ((y<0) || (y>=VER)) return 0;
return (!Field [x][y]);
}
int testPointAround (int x, int y)//Проверка соседей точки
{
if ((x<0) || (x>=GOR)) return 1;
if ((y<0) || (y>=VER)) return 1;
return (!Field [x][y]);
}
int testAround (int x, int y)
{
for(int i=x-1; i<=x+1; i++)
for(int j=y-1; j<=y+1; j++)
if (!testPointAround (i, j)) return 0;// Для проверки соседей каждой точки запускаем функцию testPointAround
return 1;
}
int setShip(int coord, int orient, int count)
{
int x=coord/VER;//
int y=coord%GOR;//преобразование в двумерные координаты
int stepX, stepY;
switch(orient)//в зависимоти от направления задаем шаг
{
case 0: stepX=0; stepY=1; break;
case 1: stepX=1; stepY=0; break;
case 2: stepX=0; stepY=-1; break;
case 3: stepX=-1; stepY=0;
}
for(int i=0; i<count; i++)// Проверка полей-кандидатов
{
if(!testPoint (x+stepX*i, y+stepY*i)) return -1;
}
for(int i=0; i<count; i++)// Проверка соседей
{
if(!testAround (x+stepX*i, y+stepY*i)) return -1;
}
for(int i=0; i<count; i++)// Размещение корабля
{
Field[x+stepX*i][y+stepY*i]=1;
}
return 0;
}
void setships()
{
srand (time(NULL));
ship ships[4]={{4,1},{3,2},{2,3},{1,4}};
for(int i=0; i<N; i++)//работа с типом коробля.
{
for(int j=0; j<ships[i].number; j++)
{
int coord;
int orient;
do
{
coord = rand()%100;//образование координаты
orient = rand()%4;//Направление
}
while (setShip(coord, orient, ships[i].qual));
}
}
return;
}
void delship(int x, int y)//обозначить корабль мертвым
{
for(int i=y; Field[i][x]!=0 && Field[i][x]!=2; i++)//проитись циклами в разные стороны до конца
Field[i][x]=4;//палубы корабля и пометить убытым
for(int i=y; Field[i][x]!=0 && Field[i][x]!=2; i--)
Field[i][x]=4;
for(int j=x; Field[y][j]!=0 && Field[y][j]!=2; j++)
Field[y][j]=4;
for(int j=x; Field[y][j]!=0 && Field[y][j]!=2; j--)
Field[y][j]=4;
}
int ShipTest(int x, int y)// Проверка уничтожен ли корабль.
{
for(int i=y; Field[i][x]!=0 && Field[i][x]!=2; i++)//проитись циклами в разные стороны до конца
if(Field[i][x]==1)// корабля и веруть 0 если осталась целая палуба
return 0 ;
for(int i=y; Field[i][x]!=0 && Field[i][x]!=2; i--)
if(Field[i][x]==1)
return 0;
for(int j=x; Field[y][j]!=0 && Field[y][j]!=2; j++)
if(Field[y][j]==1)
return 0;
for(int j=x; Field[y][j]!=0 && Field[y][j]!=2; j--)
if(Field[y][j]==1)
return 0;
return 1;
}
void enter_coord(int &x, int &y)//Ввод и проверка координат
{
int input_true;// призднак правильности данных
char input [80];
do//Ввод и проверка правильности
{
x=0, y=0;
input_true=0;
printf("Your more: ");
gets(input);//Считываем ввод
int i=0;
while ((input[i]==' ') && (input[i++]!='\0')); // пропуск пробелов
// проверка координаты Х
if (('a'<=input[i])&&(input[i]<=('a'+GOR-1))) x=input[i]-'a';
if (('A'<=input[i])&&(input[i]<=('A'+GOR-1))) x=input[i]-'A';
i++; // Переход к следующему символу
while ((input[i]==' ') && (input[i++]!='\0')); // пропуск пробелов
while (('0'<=input[i])&&(input[i]<='9'))
{
y=y*10+(input[i++]-'0');
}
y--;
if((x>=0&&x<=10)&&(y>=0&&y<=10)) input_true=1;
printf("x=%d y=%d\n\n", x+1, y+1);
}while(!input_true);
return;
}
int shoot()//стрельба
{
int x, y;
enter_coord(x,y);
if(Field[x][y]==1)
{
Field[x][y]=3;// 3 - попадание
if(ShipTest(x, y)) // Проверка уничтожен ли корабль.
{
delship(x,y); //если да, то обозначить его
printField2();//ОБНОВИТЬ ПОЛЕ
}
return 1;
}
else
{
Field[x][y]=2;// 2 - мимо
return 0;
}
}
void game()
{
int kill=0;
do
{
kill=kill+shoot();
printField2();
}while(kill<20);
}
int _tmain(int argc, _TCHAR* argv[])
{
setships();
printField2();
game();
//printField();
return 0;
}Решение задачи: «Не могу найти ошибку(морской бой)»
textual
Листинг программы
1 Field[i][x]!=0 && Field[i][x]!=2;