16 FreeBasic - Игра "Прыгающие шашки"


Эту задачу я решал на пятом курсе при подготовке к экзаменам, кажется))), но запомнилось мне другое. Сделал я её быстренько-простенько: черно-белые шашки на коричневом фоне, так как ход шашки был однозначен - ход шашек выбирался цифрой, как на рисунке. Решить то я её решил - запрограммировал, а вот как попереставлять шашки чтобы достичь результата... Помню вопрос одногрупницы о том как же переставить шашки я сказал что незнаю. Она так удивилась!!! как же я тогда составил программу???)))
Составить программу это значит отразить смысл игры, вернее правила игры, на языке программирования. А непосредственно к решению самой задачи(головоломки) это не имеет никакого отношения. Учились-учились и научились)))
## Задача "Прыгающие шашки"
***На семиклеточном поле стоят слева три белые шашки, справа три чёрные и пустая клетка посередине. Нужно поменять шашки местами - чтоб слева стояли чёрные, а справа - белые. Шашка может стать на пустую клетку, если она находится рядом. И может перепрыгнуть соседнюю шашку, если непосредственно за ней находится пустая клетка. Причем есть ещё одна особенность, ещё одно правило: шашки ходят навстречу друг-другу, белые-направо, а чёрные-налево.***
Шашек, вернее поле для шашек, у нас имеет семь клеток - это наш массив на семь элементов. Белые шашки обозначим 1, черные - 2, пустое же место - нулём.
Если вы напишете
`dim as integer a(7)={1,1,1,0,2,2,2}`
то сделаете ошибку))
смотрите

Если сможете "видеть" результат работы вашей программы - считайте что вы хорошо научились))
Ошибка в том что первый элумент массива a(0), это следует учесть инициализируя массив начальными значениями
`dim as integer a(7)={-1,1,1,1,0,2,2,2}`
или так
`dim as integer a(1 to 7)={1,1,1,0,2,2,2}`

Inkey$
Познакомимся ещё с одной функцией Бейсика, без которой не написать хорошей игры(программы)
Это тоже функция ввода как и input, но Inkey ждет нажатия клавиши, а не ввода строки или числа, оговорился, **не ждёт**, в том то и дело, что **не ждет** Она опрашивает клавиатуру, и если в этот моммент никакая клавиша не нажата функция выдаёт **ноль**, а так как функция символьная(текстовая) - значит пустой текст - "". Здесь между кавычками ничего нет, пус-то-та))
обычно её используют так:
`do:k=inkey():while k=""`
этот цикл будет крутиться до тех пор, пока пользователь не нажмёт клавишу, переменная k должна быть текстовой, и после нажатия клавиши будет равна симолу клавишу которым нажали.
Сильное преимущество inkey перед input в отсутствии ожидания Enter для завершения ввода.
`dim as integer a(1 to 7)={1,1,1,0,2,2,2},c,i`
`dim as string k`
`for i=1 to 7`
` locate(3,i*2): print a(I);`
`next i`
`do`
`flag=0`
`do:k=inkey():while k=""`
`c=asc(k)-48`
`if a(c)=0 then continue do`
`if a(c)=1 and c<7 then if a(c+1)=0 then swap(a(c),a(c+1)`
`if a(c)=1 and c<6 then if a(c+2)=0 then swap(a(c),a(c+2)`
`if a(c)=2 and c>1 then if a(c-1)=0 then swap(a(c),a(c-1)`
`if a(c)=2 and c>2 then if a(c-2)=0 then swap(a(c),a(c-2)`
`if a(1)=a(2) and a(2)=a(3) and a(4)=a(5) and a(5)=a(6) and a(4)=0 then flag=1`
`for i=1 to 7`
`locate(3,i*2): print a(I);`
`next i`
`loop while flag`
Немного улучшим нашу программу
Добавим выход по "пробелу" и сброс игры на начало клавиша ESC. А вывод "шашек" сделаем цветным))

### Игра готова - можно искать решение головоломки.

