Игра "Сокобан" — 75 строк на С++

Игра "Сокобан" — 75 строк на С++

Игра на C++ и Arctic Engine, подробнее о нем и о goto-ориентированном C++ читайте в предыдущих постах. Если вы снова хотите поговорить о goto, то лучше сделайте это в комментариях к предыдущему посту, в котором детально разобрано, почему goto это не плохо и даже хорошо.

1 int x = 11; 2 int y = 9; 3 Print("....#####\n"); 4 Print("....#...#\n"); 5 Print("....#O..#\n"); 6 Print("..###..O##\n"); 7 Print("..#..O.O.#\n"); 8 Print("###.#.##.#...######\n"); 9 Print("#...#.##.#####..xx#\n"); 10 Print("#.O..O..........xx#\n"); 11 Print("#####.###.#.##..xx#\n"); 12 Print("....#.....#########\n"); 13 Print("....#######\n\n"); 14 Print("Level 1\n"); 15 b: 16 Show(); 17 int vx = 0; 18 int vy = 0; 19 int c = 0; 20 if (IsKey(4)) { 21 vx = -1; 22 } 23 if (IsKey(5)) { 24 vx = 1; 25 } 26 if (IsKey(6)) { 27 vx = 0; 28 vy = 1; 29 } 30 if (IsKey(7)) { 31 vx = 0; 32 vy = -1; 33 } 34 if (Screen(x+vx, y+vy) == ".") { 35 goto ok; 36 } 37 if (Screen(x+vx, y+vy) == "x") { 38 c = 1; 39 goto ok; 40 } 41 if (Screen(x+vx, y+vy) == "O") { 42 goto box; 43 } 44 if (Screen(x+vx, y+vy) == "%") { 45 c = 1; 46 box: 47 At(x+vx*2, y+vy*2); 48 if (Screen(x+vx*2, y+vy*2) == ".") { 49 Print("O"); 50 goto ok; 51 } 52 if (Screen(x+vx*2, y+vy*2) == "x") { 53 Print("%"); 54 goto ok; 55 } 56 } 57 goto b; 58 ok: 59 At(x, y); 60 if (Screen(x, y) == "@") { 61 Print("."); 62 } 63 if (Screen(x, y) == "$") { 64 Print("x"); 65 } 66 At(x+vx, y+vy); 67 if (c == 0) { 68 Print("@"); 69 } 70 if (c == 1) { 71 Print("$"); 72 } 73 x = x+vx; 74 y = y+vy; 75 goto b;
33
2 комментария

Если упарываться по производительности, то можно проиндексировать символы и заменить if_else на switch =)

1
Ответить

Этот коммент точно к этой статье?
Обычно, компиляторы достаточно умны, чтобы превращать if else в switch или наоборот от ситуации.
Если упарываться по производительности, то ассемблер вне конкуренции.

Ответить