Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.05.2009, 03:21   #1
[MI_nor]
Пользователь
 
Регистрация: 03.11.2008
Сообщений: 94
По умолчанию Расстановка кораблей в игре "Морской бой"

Собственно прошу помочь с алгоритмом. Необходимо расставить свои корабли в морском бое. с движением и поворотом проблем нет, но при "нахлесте" кораблей друг на друга предыдущий затирается, т.е удаляется и на его месте ничего не остается. Массив 10 на 10, 0- пусто, 1 - корабль. Двигаю единицами.
Код:
void change_my_field(int p)
 {
  int k,l,m;
  for (k=0;k<p;k+=2)
   {
    my_pole[ship[k+1]][ship[k]]=1; //risuem tekushii korabl
   }
 }

void return_ship() //vozvr isxodnie znach  indeksov nach polog korablya
 {
  ship[0]=3;
  ship[1]=4;
  ship[2]=4;
  ship[3]=4;
  ship[4]=5;
  ship[5]=4;
  ship[6]=6;
  ship[7]=4;
 }
void del_oun_ship(int pol,int N, int p) //udalaem predidushii korabl
 {
  if (pol==0)
  switch(N)
    {
     case 75:
	     {
	      my_pole[ship[p-1]][ship[p-2]+1]=0;
	     }break;
     case 77:
	     {
	      my_pole[ship[1]][ship[0]-1]=0;
	     }break;
     case 80:
	     {
	      int k;
	      for (k=0;k<p;k+=2)
	       {
		my_pole[ship[k+1]-1][ship[k]]=0;
	       }
	     }break;
     case 72:
	     {
	      int k;
	      for (k=0;k<p;k+=2)
	       {
		my_pole[ship[k+1]+1][ship[k]]=0;
	       }
	     }break;
     case 666:{
	       int k;
		  for (k=2;k<p;k+=2)
		   {
		    my_pole[ship[1]+(ship[k]-ship[0])][ship[0]]=0;


		   }
	      }break;
    }
  else
  switch(N)
    {
     case 75:
	     {
	      int k;
	      for (k=0;k<p;k+=2)
	       my_pole[ship[k+1]][ship[k]+1]=0;
	     }break;
     case 77:
	     {
	      int k;
	       for (k=0;k<p;k+=2)
		my_pole[ship[k+1]][ship[k]-1]=0;

	     }break;
     case 80:
	     {
	      my_pole[ship[1]-1][ship[0]]=0;
	     }break;
     case 72:
	     {
	      my_pole[ship[p-1]+1][ship[p-2]]=0;
	     }break;
     case 666:{
	       int k;
		  for (k=2;k<p;k+=2)
		   {
		    my_pole[ship[1]][ship[0]+(ship[k+1]-ship[1])]=0;
		   }
	      }break;
    }
 }


void make_field(int p, int i, int j) //sama rasstanovka
 {
  int poz=0;
  char ch='\0';

  ch=getche();
  //int buf[4],cur[4];
  int k;
  init_comp_field();
//  change_my_field(p);
  do{
     //char ch='\0';
     //--4x palupa              
     ch=getch();
     switch(ch)
       {
	case 75: {//vlevo
		  if ((ship[p-1]>=0 && ship[0] >0)
		       &&
		      (ship[p-2]>0)
		     // && pr(75,0,p,i-1,j-1)==1
		      ) {         int k=0;
				  for(i=0;i<p;i+=2)
				   ship[i]--;
				   change_my_field(p);
				   del_oun_ship(poz%2,75,p);
				  //make_field();
				 }
		 }break;
	case 77: {//vpravo
		  if ((ship[0]<9 && ship[p-2] <9)
		       &&
		      (ship[p-1]<=9)
		     // && pr(77,poz%2,p,i-1,j+1)==1
		     ) {
				  for(i=0;i<p;i+=2)
				   ship[i]++;
				   change_my_field(p);
				   del_oun_ship(poz%2,77,p);
				  //make_field();
				 }
		 }break;
	case 80: {//vniz
		  if ((ship[p-1]<9 && ship[1] <9)
		       &&
		      (ship[p-1]>=0)
		      //&& pr(80,poz%2,p,i+2,j)==1
		      ) {
				  for(i=1;i<p;i+=2)
				   ship[i]++;
				   change_my_field(p);
				   del_oun_ship(poz%2,80,p);
				  //make_field();
				 }
		 }break;
	case 72: {//vverx
		  if ((ship[p-1]>0 && ship[1] >0)
		       &&
		      (ship[p-1]<=9)
		      //&& pr(72,poz%2,p,i-1,j)==1
		      ) {
				  for(i=1;i<p;i+=2)
				   ship[i]--;
				   change_my_field(p);
				   del_oun_ship(poz%2,72,p);
				  //make_field();
				 }
		 }break;

	case 'c':{
		  int k;
		  if (ship[0]+p/2-1<=9 && ship[1]+p/2-1<=9){
		  if (poz%2==0)

		    for (k=2;k<p;k+=2)
		     {
		      ship[k]-=ship[k]-ship[0];
		      ship[k+1]+=(k+1)/2;
		     }
		  else
		  for (k=2;k<p;k+=2)
		   {
		    ship[k]+=ship[k+1]-ship[1];
		    ship[k+1]=ship[1];
		   }
		  poz++;
		  change_my_field(p);
		  del_oun_ship(poz%2,666,p);
		  }
		 }break;
       }
     init_player_field();
    }
  while (ch!=' ');
  return_ship();
  //--konec
 }
[MI_nor] вне форума Ответить с цитированием
Старый 23.05.2009, 00:23   #2
[MI_nor]
Пользователь
 
Регистрация: 03.11.2008
Сообщений: 94
По умолчанию

И еще поправочка: корабли на "проверку возможности передвижения" проверяться не должны, предполанается что они свободно путешествуют по полю до нажатия пробела, и там уже идет проверка возможности постановки корабля в эту точку. предполагалось испоьзовать буфер для того чтобы запоминать то, что находилось на поле до передвижения, но в плане если например горизонтальный 2х палубник двигать на гор 4х палубник это неудобно. возможно ли обойтись без обозначения кораблей по номерам палуб?

Всем спасибо за моральную поддержку, проблему решил использованием дополнительной матрицы

Последний раз редактировалось [MI_nor]; 23.05.2009 в 21:19. Причина: Ы
[MI_nor] вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
создать в Паскале копию игры "Морской бой" Керкси Фолс Помощь студентам 6 17.11.2013 13:19
Проблема с реализацией логики в игре "парные картинки" Zaher Помощь студентам 4 22.12.2009 21:53
Морской бой NikolayBest Паскаль, Turbo Pascal, PascalABC.NET 0 13.05.2009 22:07
Шесть задач на "Бой программистов" Влада Помощь студентам 2 08.11.2008 17:48
"Морской бой" на "Турбе" Cezar Помощь студентам 10 15.05.2007 20:28