Не могу найти ошибку(морской бой) - 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;

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

7   голосов , оценка 4 из 5