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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 13.08.2012, 17:04   #1
shrek1993
Пользователь
 
Регистрация: 24.10.2010
Сообщений: 67
По умолчанию Расстановка кораблей в морском бою

Я делаю игру "морской бой" но при вводе компьютера возникают проблемы вот последняя и самая печальная
Код:
long random (int tip){
	int N;
	srand(time(NULL));
	if (tip==1){
		N=rand()%9+0;
		return N;}
	if (tip==2){
		N=rand()%4+1;
		return N;}
}
void rast_K(int g,int n){
	int i,j,h,f,fl=0,fl_u=0,fl_d=0,fl_l=0,fl_r=0;
	do{
		i=random(1);
		j=random(1);
	}
	while(pole_K[i][j]!=0);
	pole_K[i][j]=1;
	n--;
	if(n>0){
		for(h=1;h<=n;h++){
			if(i+h>9)
				fl_d=1;
			if(i-h<0)
				fl_u=1;
			if(j-h<0)
				fl_l=1;
			if(j+h>9)
				fl_r=1;
			if(pole_K[i+h][j]!=0)
				fl_d=1;
			if(pole_K[i-h][j]!=0)
				fl_u=1;
			if(pole_K[i][j-h]!=0)
				fl_l=1;
			if(pole_K[i][j+h]!=0)
				fl_r=1;}
		if(fl_u==1&&fl_d==1&&fl_l==1&&fl_r==1){
			pole_K[i][j]=0;
			fl=1;
			rast_K(g,g);}
		else{
			f=random(2);
			fl=1;
			for(h=0;h<=n;h++){
				if(f==1&&fl_u==0){
					pole_K[i-h][j]=1;
					fl=0;}
				if(f==2&&fl_d==0){
					pole_K[i+h][j]=1;
					fl=0;}
				if(f==3&&fl_l==0){
					pole_K[i][j-h]=1;
					fl=0;}
				if(f==4&&fl_r==0){
					pole_K[i][j+h]=1;
					fl=0;}}
			if(fl==1){
				pole_K[i][j]=0;
				rast_K(g,g);}}
	if(fl==0)
		afto_ogr(i,j);}}
как я понял:
Код рабочий но не эффективный в том плане, что при в воде последних кораблей он сильно часто выбирает уже занятые места и перегружает память в следствии чего выдаёт ошибку.
Подскажите как исправить
Если я нарушил какие-либо правила прошу простить и сообщить...
shrek1993 вне форума Ответить с цитированием
Старый 20.08.2012, 16:32   #2
Nixond
Пользователь
 
Регистрация: 06.10.2008
Сообщений: 13
По умолчанию

Не хочется детально разбираться в коде, тем более имхо некрасивом.
Могу посоветовать лишь идею, как можно расставить корабли случайным образом.

Благо поле не большое, так что можно делать все в лоб.

1) Перебираем все типы кораблей в цикле, для каждого типа - перебираем нужно кол-во.
Интуитивно хочется расставить сначала 4-палубник, потом 3-палубники и т.д.
Возможно если расставлять в другом порядке, то не хватит места.

2) Перебираем в случайном порядке два направления: горизонтальное и вертикальное.

3) Для каждого очередного корабля и выбранного направления имеем массивчик пустых клеток на доске. Перемешиваем массив случайным образом и пробуем поставить корабль в очередную клетку массива, если получилось - переходим к следующему кораблю.

Кажется, что такой алгоритм часто будет работать. Возможно существуют ситуации, когда расставить не получится. Тогда надо смотреть, насколько часто такие ситуации происходят. Если очень редко, то можно весь алгоритм запустить в цикле:
пока (не расставим корабли нормально) {srand(clock()); алгоритм();}.

Если работать будет плохо, можно попробовать какой-нибудь метод отжига или генетический алгоритм. А еще лучше погуглить на эту тему.

Будут вопросы - обращайтесь.

P.S. Конечно, это самая наивная случайная расстановка. По-моему вы ее и хотели реализовать. Более разумно ставить большие корабли в кучу. Достичь на компьютере этого можно присвоив каждой клетке индекс привлекательности, и при установке волнообразно увеличивать этот индекс, начиная с соседних клеток. Ну и при установке корабля учитывать это число как-нибудь.

Последний раз редактировалось Nixond; 20.08.2012 в 16:41.
Nixond вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Расстановка кораблей в морском бою shrek1993 Visual C++ 1 19.04.2013 00:03
Вопрос по Морскому бою Stwl3 Компоненты Delphi 4 03.05.2011 20:30
Стратегия в морском бою Олександр17 Gamedev - cоздание игр: Unity, OpenGL, DirectX 13 28.11.2010 12:52
Расстановка кораблей в игре "Морской бой" [MI_nor] Общие вопросы C/C++ 1 23.05.2009 00:23
Как расставить корабли в морском бое? Vsadnik Общие вопросы C/C++ 1 24.12.2008 16:28