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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 08.12.2010, 21:10   #1
серг
Форумчанин
 
Регистрация: 02.11.2009
Сообщений: 179
По умолчанию как реализовать алгоритм

есть матрица - игровое поле и функция прорисовки в поле человечка ( зеленый круг ) и ящиков (синие кубики)
Код:
#include <graphics.h>
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
#include <dos.h>
#include <time.h>

const int Width=16;
const int Height=16;
const int CellSize=30;
int i,j,x=8,y=14;

time_t u;
time_t u1;
time_t time1;
time_t time2;

int Cell[16][16]={
	{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
	{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
	{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
	{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
	{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
	{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
	{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
	{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
	{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
	{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
	{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
	{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
	{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
	{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
	{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
	{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
};



void Graphinit()
{
	int gdriver=DETECT,gmode,errorcode;
	initgraph(&gdriver,&gmode,"");
	errorcode=graphresult();
	if(errorcode !=grOk)
	{
		printf("Grafics error:%s\n",grapherrormsg(errorcode));
		printf("Press any key to halt:");
		getch();
		exit(1);
	}
}

void DrawField()
{
	int i;
	int j;
	setcolor(WHITE);
	rectangle(0, 0, 30 * Width, 30 * Height);
	for (i = 1; i < (Width - 1); i++){
		line(i*CellSize,1, i*CellSize,Height*CellSize);
		for (j = 1; j <= (Height - 1); j++){
		line(1, i * CellSize, Width * CellSize, i * CellSize);
	setfillstyle(1, WHITE);
		}
	}

	for (i = 0; i < Height; i++)
	{
		for (j = 0; j < Width; j++)
		{
			if (Cell[i][j] == 1)
			{
				bar(j * CellSize, i * CellSize, (j + 1) * CellSize,  (i + 1) * CellSize);
			}
		}
	}
	setfillstyle(1, YELLOW);
for (i=0; i<Height;i++)
{
	for (j=0;j<Width; j++)
	{
		if (Cell[i][j] == 0)
		{
    bar(j * CellSize, i * CellSize, (j + 1) * CellSize, (i + 1) * CellSize);
		}
	}
}

	int Radius=15;
	setcolor(GREEN);
	setfillstyle(1, GREEN);
	for (i=0; i<Height;i++)
	{
		for (j=0;j<Width; j++)
		{
			if (Cell[i][j] == 2)
			{
				fillellipse((2 * x + 1) * Radius, (2 * y + 1) * Radius, Radius, Radius);
			}
		}
	}

	setfillstyle(1, BLUE);
	for (i=0; i<Height;i++)
	{
		for (j=0;j<Width; j++)
		{
			if (Cell[i][j] == 3)
			{
				bar(j * CellSize, i * CellSize, (j + 1) * CellSize, (i + 1) * CellSize);
			}
		}
	}

}
нужно создать Список ящиков - одномерный массив собственного типа.
Mas[i].X - это x (int);
Mas[i].Y - это y (int);
Mas[i].Ex - это индекс, что ящик есть (Bool).

i - это номер ячейки такого списка (массива). Ящик добавляется условием в цикле: если Mas[i].Ex = False (нет ящика), запишем в эту ячейку начальные координаты (Mas[i].X = 4, Mas[i].Y = 0) и Mas[i].Ex = True. Все, ящик есть. Теперь условие в таймере будет щупать массив Mas в таймере по i и искать Mas[i].Ex = True, ...найдет, значит будет обрабатывать его падение.

Сама DrawField() тоже будет отрисовывать ящики, проверяя Mas[i].Ex, и для этого ей уже не нужно сканировать всю матрицу карты, только список ящиков и человечка. Нужно будет только прогнать один раз восстановление карты позади и затем новое положение всех объектов.

подскажите как это реализовать на С (есть идея прописать это через структуру но не уверен в ее правильности)?
да и получается что нужно переделать отрисовку ящиков под этот список( в коде выделено красным)

вот ссыль на более подробное обсуждение темы http://www.programmersforum.ru/showt...=125787&page=2

координаты ящиков берутся отсюда (w-высота поля,h-длина)
Код:
           int randomstack(){
	int w=0;
	srand (time(NULL));
	int h=rand()%14+1;
	Cell[w][h]=3;
	return(h);
}

Последний раз редактировалось серг; 08.12.2010 в 21:24.
серг вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Нужно реализовать алгоритм Shamonya Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 2 15.11.2010 14:54
Реализовать алгоритм нахождения базисных циклов Fasolka Помощь студентам 0 03.05.2010 14:44
Алгоритм Дейкстры поиска путей в графе. Как реализовать с помощью приоритетной очереди? Zefick Помощь студентам 0 04.06.2009 14:03
Реализовать алгоритм на С++ Unknown_dev Фриланс 2 13.10.2008 10:26
как на асме реализовать алгоритм манчестерского кодирования Lanches Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 0 17.07.2007 13:50