Не могу найти ошибку(морской бой) - 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;
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д