Loading...
momchilgenov avatar momchilgenov 2 Точки

Координати на съседни по връх клетки

Здравейте,
Разработвам малка игра.

В конкретния случай имам двумерен char масив 5 на 5,в който имам Х O или нищо в клетките.Въпроса ми е, как по дадени координати на клетка x и y да намеря координатите на всички съседни по връх клетки, в които има символ О и да ги запазя в речник?

 

 

Аз лично реших да създам масив 7 на7,с цел да избегна множеството if случаи,при което да намеря координатите в големия масив на тези клетки и да ги преобразувам в координатите на малкия масив преди да ги запазя в речника.

 

До тук наклепотих ето това:

 

https://pastebin.com/8LxM2Vaf

Мисля че някъде при променянето на координатите идва проблема-ако някой има решение по друг начин също ще съм много благодарен.

Тагове:
0
Programming Basics
Vesso1980 avatar Vesso1980 486 Точки
Best Answer

Нещо по тези обяснения не мога да разбера точно какво се опитваш да направиш. Какво разбираш под "съседни по връх клетки" ? Всички съседни клетки на клетката с координати x и y ? Или само съседните по диагонал, които докосват върховете на квадратчето-клетка ? Във последния for цикъл в който въртиш ot x - 1 до x + 1 обхождаш всички съседни клетки, така че вероятно това има предвид. Аз виждам няколко проблема в кодът ти. 

1. Няма смисъл да правиш по голяма матрица в която да копираш по-малката, защото ако сложиш проверките в try - catch блок, няма опасност да ти хвърли грешка ако удариш по индекс извън матрицата. Просто ще мине на следващата итерация на цикъла. Примерен код:

for (int i = x - 1; i <= x + 1; i++) {
    for (int j = y - 1; j <= y + 1 ; j++) {
        try {
            if (tempGameField[i][j] == 'O') {
                map.put(i - 1, j - 1);
            }
        } catch (IndexOutOfBoundsException e) {
        }
    }
}

2. Второ нямаш проверка, която да изключва клетката, около която проверяваш, защото ако и тя е O ще я вземеш и нея, а предполагам идеята е тя да не се проверява. И просто добавяш едно ифче, което ти гарантира че ще прескочи клетката в центъра:

if (i == x && j == y ){
    continue;
}

3. Неможе да пазиш координатите на намерените клетки в map, защото там ключовете са уникални и примерно ако си вкарал клетка с координати 1, 1 и после искаш да вкараш клетка 1, 3 то ще загубиш първата, защото няма как да държиш два еднакви ключа в мапа. Или си направи List<int[]> където да си слагаш x  на позиция 0 и y на позиция 1 или си направи Class Cell (което аз бих направил) който ще има полета x, y, и value, за да ти държи цялата информация за клетката.

Ако нещо не съм разбрал правилно по обясненията или кода е добре да доуточним.

Успех!

0
momchilgenov avatar momchilgenov 2 Точки

Мерси много,

Аз вчера доста си блъсках главата,и накрая осъзнах че не ми се запазват всички в map, обаче забравих че трябва ключовете да са различни.Това едното,второто в последствие реших да пробвам просто да прескачам случаите ,при които индекса щеше да е извън матрицата,и го направих с continue, подобно на твоя код и пробвах с масив и правилно работеше,но естествено с масив няма да работи защото няма да може да се прави разлика между координати с 0 и просто 0 от незапълване на масива,за това реших да ползвам лист.А за проверката на самата клетка дали има О в себе си не ми е нужна ,вярно че не обясних особено добре ,но там попринцип няма как да има, защото в самата архитектура на програмата има няколко проверки чрез методи, които изключват варианта в самата клетка да има O.А иначе под съседни по връх имам предвид всички клетки ,които имат общ връх с дадената клетка-примерно на numpad-а на стандартна клавиатура,5-цата е съседна по връх с всички останали цифри без 0

А за клас Cell по принцип бих ползвал, но просто програмата не е особено голяма и за това мисля че с лист би било по-оптимално и просто,а ако беше сериозен проект със сигурност щях да ползвам ООП.Иначе благодаря много за помощта! Ако има нещо пак ще питам :).

1
Vesso1980 avatar Vesso1980 486 Точки

Да прав си за масива , че ако е на ред или колона 0, то няма как да се разбере дали е дефолтната стойност или индекса. Това може да се реши като инициализираш масивчетата с стойности -1 в началото и тогава няма как да се обърка, но щом си го измислил с лист значи е ок. Супер е че си правиш такива проекти, защото така се учи най-добре и е доста по-интересно. Успех!

0
Можем ли да използваме бисквитки?
Ние използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Можете да се съгласите с всички или част от тях.
Назад
Функционални
Използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Използваме „сесийни“ бисквитки, за да Ви идентифицираме временно. Те се пазят само по време на активната употреба на услугите ни. След излизане от приложението, затваряне на браузъра или мобилното устройство, данните се трият. Използваме бисквитки, за да предоставим опцията „Запомни Ме“, която Ви позволява да използвате нашите услуги без да предоставяте потребителско име и парола. Допълнително е възможно да използваме бисквитки за да съхраняваме различни малки настройки, като избор на езика, позиции на менюта и персонализирано съдържание. Използваме бисквитки и за измерване на маркетинговите ни усилия.
Рекламни
Използваме бисквитки, за да измерваме маркетинг ефективността ни, броене на посещения, както и за проследяването дали дадено електронно писмо е било отворено.