2013-09-01 2 views
0

Я начинаю на C, и мне просто нужно создать простую программу на CM-DOS, похожую на Bejeweled.«Сдвиг» элементов 2D-массива в пустые пространства внутри массива

Я почти закончил с кодировкой, но есть только одна проблема:

В Bejeweled, когда совпадения найдены, выше этих матчей элементы заменят пустые пространства, созданные с помощью спичек (так называемый «Pull Down»).

У меня возникли проблемы с ним, потому что программа просто игнорирует мой код для сноса и

просто выводят пустое пространство, как есть.

Помогите?

Моя программа представляет собой 2D-массив из [6] [6].

Инициализация (b); это функция, которая проверяет, имеет ли сгенерированный алфавит какие-либо совпадения с существующими алфавитами. Если да, то он будет перегруппировать сгенерированный алфавит в другой, пока не будет соответствовать.

Он в основном заполняет случайные алфавиты от «A» до «D» в b [8] [8], затем преобразует b [8] [8] в a [6] [6], затем печатает сетку.

Вот мой проблематичный снос код:

void pull(char a[6][6], char b[8][8]) 
{ 
int j=0,i=0,loop=0; 


while(loop){ 
for (i = 1; i <= 5; i++) 
{ 
for (j = 1; j <= 5; j++) 
{ 
if(a[i][j]==' ') 
{ 
a[i][j]=a[i-1][j]; 
loop=1; 
} 
else if (a[i][j] == a[0][j]) 
{ 
a[i][j] = rand()%4 + 'A'; 
initialize(b);    
} 
} 
} 
} 
} 

Это то, что я хочу (для примера)

C A B C D C 

A B C D B D 

D C D !A A A! // Match Found 

A B D C B C 

B D C A C D 

C D C B C C 

Тогда

C A B C D C 

A B C D B D 

D C D ? ? ? // ? = space 

A B D C B C 

B D C A C D 

C D C B C C 

Тогда

C A B C D C 

A B C ? ? ? // ? = space gets swapped upward 

D C D D B D 

A B D C B C 

B D C A C D 

C D C B C C 

А потом

C A B ? ? ? 

A B C C D C 

D C D D B D 

A B D C B C 

B D C A C D 

C D C B C C 

Если? достигает максимальной высоты, он генерирует новые случайные алфавиты в?

C A B A* C* B* // *New Alphabets 

A B C C D C 

D C D D B D 

A B D C B C 

B D C A C D 

C D C B C C 
+0

Для массива размера N ** **, действительные индексы массива являются ** 0 ** ** до N-1 **. – Mahesh

+0

Причина, по которой я положил i = 1 до тех пор, пока i <= 5 не захочет? чтобы быть замененным вверх до i = 0, тогда код пойдет для моего оператора «else if», который будет работать только тогда, когда i = 0 –

ответ

0
void nomatch(char a[6][6]) 
{ 
int i, j,k; 
int ini; 

ini=0; 
do { 
for (k = 0; k < 7; k++) 
{ 
for (i = 0; i < 7; i++) 
{ 
for (j = 0; j < 7; j++) 
{ 
if (a[i][j] == a[i+1][j] && a[i+1][j] == a[i+2][j]) 
{ 
a[i + 1][j] = get_randltr(a[i][j]); 
a[i + 2][j] = get_randltr(a[i][j]); 
ini=1; 
} 
if (a[i][j] == a[i][j+1] && a[i][j+1] == a[i][j+2]) 
{ 
a[i][j + 1] = get_randltr(a[i][j]); 
a[i][j + 2] = get_randltr(a[i][j]); 
ini=1; 
} 
else 
ini=0; 
} 
} 
} 
}while(ini); 
} 

void initialize(char a[8][8]) 
{ 
int i, j; 
int ini; 

ini=0; 
do { 
for (i = 1; i < 7; i++) 
{ 
for (j = 1; j < 7; j++) 
{ 
if (a[i][j] == a[i-1][j] && a[i-1][j] == a[i-2][j]) 
{ 
a[i - 1][j] = get_randltr(a[i][j]); 
a[i - 2][j] = get_randltr(a[i][j]); 
ini=1; 
} 
if (a[i][j] == a[i+1][j] && a[i+1][j] == a[i+2][j]) 
{ 
a[i + 1][j] = get_randltr(a[i][j]); 
a[i + 2][j] = get_randltr(a[i][j]); 
ini=1; 
} 
if (a[i][j] == a[i][j-1] && a[i][j-1] == a[i][j-2]) 
{ 
a[i][j - 1] = get_randltr(a[i][j]); 
a[i][j - 2] = get_randltr(a[i][j]); 
ini=1; 
} 
if (a[i][j] == a[i][j+1] && a[i][j+1] == a[i][j+2]) 
{ 
a[i][j + 1] = get_randltr(a[i][j]); 
a[i][j + 2] = get_randltr(a[i][j]); 
ini=1; 
} 
else 
ini=0; 
} 
} 
}while(ini); 
} 

void pulling(char b[6][6]) 
{ 
int rowc, i, colc,empty,temp; 

for(colc = 0; colc < 5; colc++) 
{  
for (i = 0; i < 5; i++) 
{  
for (rowc = 0; rowc < 5; rowc++) 
{ 
empty = b[rowc][colc]; 

if (empty != '*') 
{ 
if(b[rowc+1][colc] == '*') 
{ 
temp = b[rowc][colc]; 
b[rowc][colc] = b[rowc+1][colc]; 
b[rowc+1][colc] = temp; 

} 
} 
} 

} 

} 
for (rowc=0; rowc<6; rowc++) 
{ 
for (colc=0; colc<6; colc++) 
{ 
if(b[rowc][colc] == '*') 
{ 
b[rowc][colc] = rand()%4 + 'A'; 
nomatch(b); 
} 
} 
} 
} 
Смежные вопросы