Шахматный конь проходит максимальное возможное количество ходов, пока не упрётся в тупик.
Идеальная игра - 63 хода...
Но возможен финал и на любом (меньшем ) значении. Писать можно либо на с++ либо на фри паскале. В начале рандомно задаётся начальное положение коня. В конце вывести финальное количество ходов. Помогите, прошу
Другие языки программирования и технологии
Помогите написать программу о шахматах.
Смотри, кароч. Как ходит конь? Конь ходит буковкой Г. Нарисуй это. Например, в тетради в клеточку. Теперь опишем этот ход вектором {dx;dy} относительно центра координат {0;0}. Всего таких векторов будет 8. Это будет наш банк паттернов.
#define HORSE_PATTERN_MAX 8
struct HORSE_MOVE {
int dxVec:8;
int dyVec:8;
} HorseMove[HORSE_PATTERN_MAX] = { {1,2},{-1,2},{2,1},{2,-1},{1,-2},{-1,-2},{-2,1},{-2,-1} };
Теперь сама функция. На вход подаётся указатель на массив unsigned char field[8][8](или сколько захочешь cx*cy.) Это и будет наше поле. Массив инициализирован нулями (т. е. все клетки свободны). В принципе, размер поля ограничевается только размером памяти и быстродействием CPU. Паттерн выбирается случайно rand().
#include "sdtlib.h"
#include "limits.h"
...
unsigned int HorseGame(int cx, int cy, unsigned char *field){
unsigned int result = 0; // кол-во ходов;
struct HORSE_MOVE Current, New; // текущее положение коня;
Current.dxVec = New.dxVec = rand()%cx;
Current.dyVec = New.dyVec = rand()%cy;
while(1){
unsigned int pattern = rand()%HORSE_PATTERN_MAX;
unsigned char flag = 1<<pattern;
unsigned char cell = *(field + (Current.dyVec*cx+Current.dxVec));
if((flag&cell)) continue;
cell = (flag|cell); // нарастание ошибки (следов);
if(cell==UCHAR_MAX) break; // мы слишком наследили - конец игры;
*(field + (Current.dyVec*cx+Current.dxVec)) = cell; // запомним состояние;
// двигаемся дальше
New.dxVec+= HorseMove[pattern].dxVec;
New.dyVec+= HorseMove[pattern].dyVec;
if((New.dxVec<0)||(New.dyVec<0)||(New.dxVec>=cx)||(New.dyVec>=cx)) continue; // ошибка...;
if(*(field + (New.dyVec*cx+New.dxVec))) continue; // ...или клетка занята;
result++; // ход сделан успешно!
Current.dxVec = New.dxVec;
Current.dyVec = New.dyVec;
};
return(result); };
Вот и всё, ребята!


#define HORSE_PATTERN_MAX 8
struct HORSE_MOVE {
int dxVec:8;
int dyVec:8;
} HorseMove[HORSE_PATTERN_MAX] = { {1,2},{-1,2},{2,1},{2,-1},{1,-2},{-1,-2},{-2,1},{-2,-1} };
Теперь сама функция. На вход подаётся указатель на массив unsigned char field[8][8](или сколько захочешь cx*cy.) Это и будет наше поле. Массив инициализирован нулями (т. е. все клетки свободны). В принципе, размер поля ограничевается только размером памяти и быстродействием CPU. Паттерн выбирается случайно rand().
#include "sdtlib.h"
#include "limits.h"
...
unsigned int HorseGame(int cx, int cy, unsigned char *field){
unsigned int result = 0; // кол-во ходов;
struct HORSE_MOVE Current, New; // текущее положение коня;
Current.dxVec = New.dxVec = rand()%cx;
Current.dyVec = New.dyVec = rand()%cy;
while(1){
unsigned int pattern = rand()%HORSE_PATTERN_MAX;
unsigned char flag = 1<<pattern;
unsigned char cell = *(field + (Current.dyVec*cx+Current.dxVec));
if((flag&cell)) continue;
cell = (flag|cell); // нарастание ошибки (следов);
if(cell==UCHAR_MAX) break; // мы слишком наследили - конец игры;
*(field + (Current.dyVec*cx+Current.dxVec)) = cell; // запомним состояние;
// двигаемся дальше
New.dxVec+= HorseMove[pattern].dxVec;
New.dyVec+= HorseMove[pattern].dyVec;
if((New.dxVec<0)||(New.dyVec<0)||(New.dxVec>=cx)||(New.dyVec>=cx)) continue; // ошибка...;
if(*(field + (New.dyVec*cx+New.dxVec))) continue; // ...или клетка занята;
result++; // ход сделан успешно!
Current.dxVec = New.dxVec;
Current.dyVec = New.dyVec;
};
return(result); };
Вот и всё, ребята!


Нет ничего невозможного. Берем массив,
рандомно выбираем клетку и понеслось, периодически по таймеру,
заполнение ячеек, допустим, единичками... :)
Соответственно, после каждого присваивания не
забываем отображать наш массив на экране,
для визуализации процесса пользователю...
Код приводить не буду, так как мне нравится писать исключительно
на диалектах Basic. Сишный и паскальный синтаксис мне не нравится.
рандомно выбираем клетку и понеслось, периодически по таймеру,
заполнение ячеек, допустим, единичками... :)
Соответственно, после каждого присваивания не
забываем отображать наш массив на экране,
для визуализации процесса пользователю...
Код приводить не буду, так как мне нравится писать исключительно
на диалектах Basic. Сишный и паскальный синтаксис мне не нравится.
Похожие вопросы
- Помогите написать программу со switch в СИ
- Помогите написать программу на С. Тема Составление программ с использованием массивов
- Помогите написать программу выключения компьютера на С++
- Помогите написать программу на Visual Basic (найти ошибку)
- Помогите написать программу на ассемблере, завтра экзамен а я в нём совсем не шарю.
- Помогите написать программу на С++
- помогите написать программу на С в Борланде?
- помогите написать программу на Delphi
- Люди помогите написать программы для Pascal очень срочно и очень нужно
- Помогите написать программу на C/C++