Има ли все пак да се съкратят if else изявленията, вместо да се въртят в кръг

Имам котка, която тича по екрана и спира да драска по средата на екрана два пъти. Текущият ми код изглежда така

private void scratch(){
for (int i = xPos; i < getWidth(); i+=0) {
    xPos = i;
    // swap images
    if (currentImage == nekoPics[0]) 
        currentImage = nekoPics[2];
    else if (currentImage == nekoPics[2])
        currentImage = nekoPics[4];
    else if (currentImage == nekoPics[4])
        currentImage = nekoPics[5];
    else if (currentImage == nekoPics[5])
        currentImage = nekoPics[4];
    else if (currentImage == nekoPics[4]) 
        currentImage = nekoPics[5];
    else 
        currentImage = nekoPics[0]

Има ли по-лесен начин да се направят операторите if else от това да се движат в огромен кръг като този?

Благодаря предварително (PS: предполагам, че можете да направите това с някакъв брояч, но не бях толкова сигурен как да постъпя по този въпрос, оценявам всяка помощ)


person Sim    schedule 21.02.2013    source източник
comment
можете да използвате switch-case.   -  person Subhrajyoti Majumder    schedule 21.02.2013
comment
какво означава i+=0????   -  person BobTheBuilder    schedule 21.02.2013
comment
5-то if винаги ще се оценява като false, защото сте го проверили в 3-то if.   -  person Navin    schedule 21.02.2013
comment
Опитайте речник, вместо if/else просто достъп до местоположението в dict.   -  person Inbar Rose    schedule 21.02.2013


Отговори (4)


Можете да запазите индекса на текущото изображение и да го увеличавате при всяка итерация, например:

currentImage = nekoPics[currentIndex%6];
currentIndex++;

or

currentImage = nekoPics[currentIndex];
if (++currentIndex==6) currentIndex=0;

Това изисква изображенията в nekoPics да бъдат сортирани според реда на анимацията.

person Javier    schedule 21.02.2013
comment
направи това, работи добре, това е един метод, как да накарам това да спре да работи и да оставя другия метод да започне да работи, така че котката да изтича отново до края на екрана, след като се почеше? По принцип започва да работи с public void moveIn, след това започва да се драска, след което имам и метод moveOut, за да го накарам да работи до края, но не мога да накарам това да стартира, след като приключи с драскотините - person Sim; 21.02.2013

В допълнение към Карта, предложена другаде, можете просто да използвате масив; ще трябва да следите индекса на текущото изображение:

int[5] nextImageList
  = { 2, ?, 4, 5, 4 }

next = nextImageList[currentImageIndex];
currentImage = nekoPics[next];
currentImageIndex = next;

Не е необходимо „ако“, след като инициализирате currentImage и currentImageIndex. Не бях сигурен дали 1 е валиден индекс някъде, ако не, всичко може да влезе в слота 1 в масива.

person arcy    schedule 21.02.2013
comment
Вероятно най-простият отговор за начинаещи. Предложих редакция, тъй като масивът е съставен от (поне) 6 слота, а не 5. Третият слот също е неизвестен. - person afsantos; 21.02.2013

Вероятно ще бъде по-лесно да кодирате, ако спрете тази котка да застане пред екрана ви...

Сериозно обаче, можете да разрешите това, като направите обект, който определя вашата последователност от картини.

person Community    schedule 21.02.2013

Щях да публикувам отговор, подобен на rcook, използвайки масив. Виждам го като най-простото решение за разбиране.

Отговорът му обаче има малка грешка относно размерите на масива. Публикувам това за пълнота, но заслугата трябва да бъде насочена към него.

// Elsewhere, in your initialization:
int currentImageIndex = 0; // Assuming [0] is your first image.
int[] nextImageList = { 2, -1, 4, -1, 5, 4 };
// Given the current index, this array will direct you
// to the next image index. Those -1 are unknown (to us).
// Set them to the values you need.

private void scratch() {
    for (int i = xPos; i < getWidth(); ) {
        xPos = i;

        // Swap images.
        currentImageIndex = nextImageList[currentImageIndex];
        currentImage = nekoPics[currentImageIndex];

        // What else you were doing here.
    }
}
person afsantos    schedule 21.02.2013
comment
благодаря, наистина помогна да се справим с това, наздраве човече - person Sim; 22.02.2013