/ / Моят алгоритъм за движение не работи правилно - c, масиви, случайни, движи се

Моят алгоритъм за преместване не работи правилно - c, масиви, случайни, движи се

След много тревоги, мисля, че съм приковал източника на моя проблем, когато играчите ми не се движат правилно на терена:

 for (t = 1; t <= ROUNDS; t++){
if (t % 10 == 0) {
print_game (field);
}
if (teamsize > 1){

for (m = 0; m < SIZE_TEAM; m++){
if (team [m].presence == 1){
if (team [m].direction == East){
if (team [m].y == 24){
if (field [team [m].x][team [m].y - 1] != 0){
rem (field [team [m].x][team [m].y - 1], teamsize);
field [team [m].x][team [m].y - 1] = team [m].id;
teamsize--;
}
else {
field [team [m].x][team [m].y - 1] = team [m].id;
}
}

if (field [team [m].x][team [m].y + 1] != 0) {
rem (field [team [m].x][team [m].y + 1], teamsize);
field [team [m].x][team [m].y + 1] = team [m].id;
teamsize--;
}
else {
field [team [m].x][team [m].y + 1] = team [m].id;
}
field [team [m].x][team [m].y] = 0;
}
else if (team [i].direction == West){
if (team [m].y == 0){
if (field [team [m].x][team [m].y + 1] != 0){
rem (field [team [m].x][team [m].y + 1], teamsize);
field [team [m].x][team [m].y + 1] = team [m].id;
teamsize--;
}
else {
field [team [m].x][team [m].y + 1] = team [m].id;
}
}
if (field [team [m].x][team [m].y - 1] != 0) {
rem (field [team [m].x][team [m].y - 1], teamsize);
field [team [m].x][team [m].y - 1] = team [m].id;
teamsize--;
}
else {
field [team [m].x][team [m].y - 1] = team [m].id;
}
field [team [m].x][team [m].y] = 0;
}
else if (team [i].direction == North){
if (team [m].x == 0){
if (field [team [m].x + 1][team [m].y] != 0){
rem (field [team [m].x + 1][team [m].y], teamsize);
field [team [m].x + 1][team [m].y] = team [m].id;
teamsize--;
}
else {
field [team [m].x + 1][team [m].y] = team [m].id;
}
if (field [team [m].x - 1][team [m].y] != 0){
rem (field [team [m].x - 1][team [m].y], teamsize);
field [team [m].x - 1][team [m].y] = team [m].id;
teamsize--;
}
else {
field [team [m].x - 1][team [m].y] = team [m].id;
}
field [team [m].x][team [m].y] = 0;
}
else if (team [i].direction == South){
if (team [m].x == 24){
if (field [team [m].x - 1][team [m].y] != 0){
rem (field [team [m].x - 1][team [m].y], teamsize);
field [team [m].x - 1][team [m].y] = team [m].id;
teamsize--;
}
else {
field [team [m].x - 1][team [m].y] = team [m].id;
}
if (field [team [m].x + 1][team [m].y] != 0){
rem (field [team [m].x + 1][team [m].y], teamsize);
field [team [m].x + 1][team [m].y] = team [m].id;
teamsize--;
}
else {
field [team [m].x + 1][team [m].y] = team [m].id;
}
field [team [m].x][team [m].y] = 0;
}
}
}
}
}
}
}

print_game (field);
return 0;
}

Как да разбера това? Е, аз тествах части от кода и резултатите излязоха добре. Едва когато включих този огромен цикъл, нещата станаха сложни. Както и да е, да ме уведомите, ако видите някакви странности.

Също така, тук е моята Rem функция:

int rem (int id, int teamsize){
int k;
for (k = 0; k < teamsize; k++){
if (team [k].id == id){
team [k].presence = 0;
}
}
}

И моят enum:

   enum move_direction {East = 1, West = 2, North = 3, South = 4};

Отговори:

0 за отговор № 1

Като погледнете как сте декларирали променливата k извън външния цикъл, когато сте могли да направите следното: for(int k=0;k < teamsize; ++k) Предполагам, че сте междинен потребител на езика С като мен.

Тъй като не сте свързали вашия преди това публикуван въпрос тук, аз отивам стриктно от този пост тук само.

Моето разбиране е, че имате проблеми с двете масиви, които връщат структурни данни, team и field.

Възможно ли е двата структури да не са съвместими или дори по-лоши некаларелни данни?

Когато кодирате екипния масив вдвуизмерен полеви масив линейният масив от екипи е по същество израз, чийто резултат трябва да бъде получен чрез оценка. Въпреки че имате отделните елементи за структурни данни с типа int return, масивът на екипа ще трябва да има тип връщане на структурата на екипа, за да могат тези случаи да бъдат елементи на екипния масив.

Както може би вече знаете, C масивът е по съществоуказател, който сочи към първия елемент в масива. Това въвеждане на езика C предполага, че двете масиви се намират в две различни пространства на паметта. Следователно, за да се извлекат данните в масива, компилаторът ще трябва да премине към екипния масив, за да извлече необходимите им данни.

Само по мисловния процес е логично да се приеметази стойност int трябва да се върне в скобите за позициониране на масива, така че да може да се достигне до елемент с правилен масив. Но не всичко работи логично.

Много е възможно кодът да не се компилира поради сложността на тези некаларни данни.