Програма для гри у шахи
Знайомство з комп’ютерною програмою, розробленою для використання у грі в шахи, розгляд особливостей застосування на практиці. Загальна характеристика результатів роботи програми. Аналіз основних способів кодування шахової дошки парою натуральних чисел.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | контрольная работа |
Язык | украинский |
Дата добавления | 18.09.2014 |
Размер файла | 479,8 K |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Размещено на http://www.allbest.ru/
1.Технічне завдання
На шаховій дошці розмірами M*N клітинок стоїть слон (фігура, що ходить по діагоналі). З'ясувати, чи може слон дійти до поля (х,у) Якщо може, то за яку найменшу кількість ходів; якщо кількість ходів більша за 1, то вказати, через які проміжні клітинки повинен пройти слон (якщо таких маршрутів кілька, вказати будь-який один з них). Поля шахової дошки кодуються парою натуральних чисел 1..M, 1..N, де перше число - номер горизонталі, а друге - номер вертикалі (1?M,N?1000). Технічні умови: Ви вводите з клавіатури через пропуск числа M, N, а далі координати початкового та кінцевого полів бажаного маршруту слона. Ви виводите на екран число К (мінімальна кількість ходів), а далі в К-1 рядках по 2 числа через пропуск - координати відвіданих полів. Якщо розв'язків немає, вивести 0.
Приклад:
Введення 10 10 1 1 1 7
Виведення 2 4 4
Рис.
2.Аналіз завдання
Розіб'ємо задачу на введення інформації, перевірку інформації за певних умов та виведення результату.
Для введення інформації використаємо діалог с користувачем. Поля шахової дошки кодуються парою натуральних чисел 1..M, 1..N, де перше число - номер горизонталі, а друге - номер вертикалі (1?M,N?1000). Просимо користувача ввести з клавіатури через пропуск числа M, N, а далі координати початкового та кінцевого полів бажаного маршруту слона.
Перевірка інформації полягає в двох аспектах. Перший, це відповідність умові. Другий, це пошук мінімального ходу за допомогою двох функцій : solve та show_result.
Після перевірки, програма виконується і виводиться мінімальна кількість ходів, або координата відвіданих полів.
комп'ютерний програма шахи
3.Алгоритм роботи програми
Таблиця 3.1 - опис констант та змінних.
Ім'я |
Тип даних |
Призначення змінної |
|
m, n |
Цілі числа |
Розміри шахової дошки |
|
xb, yb |
Цілі числа |
Координати початку |
|
xe, ye |
Цілі числа |
Координати кінця |
|
steps |
Цілі числа |
Кількість кроків |
|
begin, end |
Цілі числа |
Координати початку руху та кінцевого пункту |
|
n1, n2 |
Цілі числа |
Номери першої та другої на вивід координати |
|
х, у |
Цілі числа |
Координати відвіданих полів |
|
bg, en |
Цілі числа |
Координати початку та кінця |
Схема
Схема
Схема
Основна програма:
2 - ввід даних, 3 - перевірка ввідних даних на валідність, 4 - якщо початкова і кінцева клітинки різних кольорів, 6 - якщо початкова та кінцева клітини збігаються, 8 - якщо ширина або висота дошки дорівнює одиниці, то слон не може рухатися.
void solve()
2-3 - якщо ширина дошки довше її висоти, замінимо ці значення і координати кожної точки, а у відповіді знову замінимо х і у координати кожної точки, 4-5 - якщо на отриманій дошці, в якій вже висота (за задумом) точно довше висоти, пункт призначення нижче початкової позиції слона, замінимо ці точки ((х1; у1) і (х2; у2)) місцями, а у відповіді виведемо точки в зворотному порядку, 6 - поки слон не може потрапити з 1 ходу з поточною його позиції на кінцеву, шукаємо наступну позицію, 7-9 - перевіримо, чи можна за 2 ходи потрапити в кінцеву позицію для цього перевіримо чи можна з будь клітини, на яку можна перейти 1 ходом, потрапити одним ходом в кінцеву клітку в цьому випадку клітинка, що перевіряється буде збігатися з кліткою, на якій знаходиться слон, пропустимо її, 10-11 - значить можна з клітини (xb; у1) потрапити на клітку (х2; у2) за два ходи, перенесемо слона (xb; у1) на клітину (х; у), а в наступній перевірці циклу abs (xb - xe)! = abs (yb - ye) поверне false, і пошук закінчиться, 13 - якщо кроків n (і n> 1), проміжних клітин n - 1, а номер останнього кроку n - 2 (через нумерації з нуля), 14 - якщо з двох ходів не дійти, просто піднімемося вище.
void show_result()
2 - номер першого на вивід проміжної клітини, останньою і крок для циклу, 3 - номери першої та другої на вивід координати, 3-5 - якщо початкова та кінцева клітина були змінені місцями, проміжні виводимо з останнього по перший.
bool check_input_data() - перевірка ввідних даних.
4.Текст програми
#include <stdio.h>
#include <math.h>
#include <iostream>
using namespace std;
int m, n, xb, yb, xe, ye;
// будемо додавати по кроку кожного разу, коли слон не може з поточної
//позиції перейти на кінцеву клітинку
int steps = 1; // кількість кроків
int intermediate_steps[999][2]; // координати середніх ходів
bool m_and_n_was_swapped = false;
// begin і end - координати початку руху та кінцевого пункту
bool begin_and_end_was_swapped = false;
int abs(int x)
{
return x < 0 ? -x : x;
}
void show_result()
{
// номер першої на вивід середньої клітинки, останньої та крок для
//циклу
int bg = 0, en = steps - 2, step = 1;
// номера першої та другої координати на вивід
int n1 = 0, n2 = 1;
// якщо початкова та кінцева клітинка помінялися місцями
// середні виводимо з останнього по перший
if (begin_and_end_was_swapped)
{
swap(bg, en);
step = -1;
}
if (m_and_n_was_swapped) swap (n1, n2);
cout << steps << endl;
for (int i = bg; i != en + step; i += step)
{
cout << intermediate_steps[i][n1];
cout << ' ' << intermediate_steps[i][n2] << endl;
}
}
void solve()
{
// якщо ширина дошки довше її висоти, поміняємо ці значення
// координати кожної точки, а у відповіді знову поміняємо х і у
// координати кожної точки (або просто виведемо у вигляді (у; х)
if (m > n)
{
swap(m, n);
swap(xb, yb);
swap(xe, ye);
m_and_n_was_swapped = true;
}
// якщо на отриманій дошці, в якій вже висота (за задумом)
// точно довше висоти, пункт призначення нижче початкової позиції
// слона, поміняемо ці точки((х1; у1) і (х2; у2)) місцями,
// а в відповіді виведемо точки в оберненому порядку
if (yb > ye)
{
swap(xb, xe);
swap(yb, ye);
begin_and_end_was_swapped = true;
}
// поки слон не може потрапити з 1 ходу з посаткової позиції
// на кінцеву, шукаємо наступну позицію
while (abs(xb - xe) != abs(yb - ye))
{
// перевіримо, чи можна за 2 ходи потрапити в кінцеву позицію
// для цього перевіримо чи можна з будь клітини, на яку можна
// перейти 1 ходом слона, потрапити одним ходом в кінцеву клітинку
bool can_reach_in_2_steps = false;
for (int x = 1; x <= m && !can_reach_in_2_steps; x++)
{
// цьому випадку клітинка, що перевіряється буде збігатися з
// кліткою, на якый знаходився слон, пропустимо її
int y = abs(xb - x) + yb;
if (abs(x - xe) == abs(y - ye))
{
// значить можна з клітини (xb; у1) потрапити на клітку (х2; у2)
// за два ходи, перенесемо слона (xb; у1) на клітинку (х; у),
// а в наступній перевірці цикла abs(xb - xe) != abs(yb - ye)
// поверне false, і пошук завершиться
can_reach_in_2_steps = true;
xb = x;
yb = y;
// додамо клітинку (х; у) в масив проміжних клітин
steps++;
// якщо кроків n (і n> 1), проміжних клітин n - 1,
// а номер останнього кроку n - 2 (через нумерації з нуля)
intermediate_steps[steps - 2][0] = x;
intermediate_steps[steps - 2][1] = y;
}
}
// якщо з двох ходів не дійти, просто піднімемося вище
if (!can_reach_in_2_steps)
{
if (xb - 1 > m - xb)
{
// якщо перший ряд далі, підемо вгору-вліво
// вгору підніметься на стільки клітин, на скільки і наліво
yb += xb - 1;
// а вліво до першого ряда
xb = 1;
}
else
{
// останній ряд далі, тому підемо вгору-вправо
// вгору підніметься на стільки клітин, на скільки і вправо
yb += m - xb;
// а вправо до першого ряда
xb = m;
}
// додамо клітку (xb; у1) в масив проміжних клітин
steps++;
// якщо кроків n (і n> 1), проміжних клітин n - 1,
// а номер останнього кроку n - 2 (через нумерації з нуля)
intermediate_steps[steps - 2][0] = xb;
intermediate_steps[steps - 2][1] = yb;
}
}
show_result();
}
bool check_input_data()
{
if (m < 1 || m > 1000) return false;
if (n < 1 || n > 1000) return false;
if (xb < 1 || xb > m) return false;
if (xe < 1 || xe > m) return false;
if (yb < 1 || yb > n) return false;
if (ye < 1 || ye > n) return false;
return true;
}
int main(void)
{
cin >> m >> n >> xb >> yb >> xe >> ye;
// перевірка ввідних даних на валідність
if (!check_input_data())
{
cout << "Invalid input data";
return 0;
}
// якщо початкова і кінцева клітинки різних кольорів
if ((xb + yb + xe + ye) % 2) cout << 0;
// якщо початкова та кінцева клітини збігаються
else if (xb == xe && yb == ye) cout << 0;
// якщо ширина або висота дошки дорівнює одиниці,
// то слон не може рухатися
else if (m == 1 || n == 1) cout << 0;
// інакше шукаємо кількість ходів і проміжні клітини
else solve();
return 0;
}
5.Контрольний приклад
Введення:
Поле розміром: 500 ? 500
Координати початку: (50;8)
Координати кінця: (124;45)
Рисунок 5.1 - Результат роботи програми, після введення 500 500 50 8 124 54
Виведення:
1. Виведення мінімальної кількості ходів:0 (ходів немає).
2. Виведення координат відвіданих полів, оскільки розв'язків немає то координати не виводяться.
Введення:
Поле розміром: 678 ? 567
Координати початку: (43;56)
Координати кінця: (223;446)
Рисунок 5.2 - Результат роботи програми, після введення 678 567 43 56 223 446
Виведення:
1. Виведення мінімальної кількості ходів:2 (2 ходи).
2. Виведення координат відвіданих полів: (328;341) ( з координати (43;56) до (328;341) - перший хід, з (328;341) до (223;446) - другий).
Введення:
Поле розміром: 10 ? 10
Координати початку: (1;1)
Координати кінця: (7;7)
Виведення:
Рисунок 5.3 - Результат роботи програми, після введення 10 10 1 1 7 7
Виведення:
3. Виведення мінімальної кількості ходів:1 (1 хід).
4. Виведення координат відвіданих полів: не виводяться, оскільки хід лише 1.
Висновок
Програма розроблена для використання у грі в шахи. Вона зручна якщо гра не наживо з людиною, а через гру в інтернеті, або з комп'ютером (через додатак). Недолік цієї програми у тому, що вона має деякі умови для розрахунку, такі як початкові та кінцеві точки разташування, також не завжди кількість ходів буде задовольняти умовам гри, тому навряд чи дану програму можна застосовувати на практиці. У подальшому можна вдосконалити програму зробивши її універсальною, тобто зробити розрахунок для інших фігур (не тільки для слона) та їх комбінацій і використовувати її як порадник у грі.
Список використаних джерел
1. Основи програмування та алгоритмічні мови /[Парфьонов Ю.Е., Федорченко В.М., Лосєв М.Ю., Щербаков О.В.] - [частина 1-а] - Харків: ХНЕУ, 2008. - 127с.
2. Основи програмування та алгоритмічні мови /[Парфьонов Ю.Е., Федорченко В.М., Лосєв М.Ю., Щербаков О.В.] - [частина 2-а] - Харків: ХНЕУ, 2009. - 179с.
3. Размещено на Allbest.ru
Подобные документы
Cinema 4D як пакет для створення тривимірної графіки та анімації. Аналіз особливостей роботи з комп’ютерною графікою. Загальна характеристика основних етапів розробки дивану та інтер’єру кімнати. Знайомство з перевагами та недоліками растрової графіки.
курсовая работа [2,7 M], добавлен 05.01.2014Об’єктно-орієнтований аналіз, визначення класів та методів. Загальна схема функціонування системи. Представлення учбового матеріалу, питань та відповідей. Графічний інтерфейс користувача для роботи з програмою. Використання програми викладачами.
курсовая работа [1,3 M], добавлен 09.01.2014Дослідження особливостей роботи графічної бібліотеки OpenGL з метою використання її в комп'ютерному моделюванні. Розгляд синтаксису команд та програмного коду команд. Методи максимально реалістичного моделювання горіння вогню. Лістинг програми на мові С.
курсовая работа [182,0 K], добавлен 22.12.2010Позначення і назва програми, забезпечення, необхідне для її функціонування. Опис логічної структури, алгоритм, структура. Типи комп'ютерів і пристроїв, що використовуються при роботі програми. Формат, описання та спосіб кодування вхідних і вихідних даних.
курсовая работа [163,6 K], добавлен 01.04.2016- Розроблення алгоритму і програми а NASM асемблері для додавання / множення чисел з плаваючою крапкою
Розробка алгоритму роботи програми, її загальна характеристика та функціональні особливості, умови ефективного використання. Способи виклику та адреса завантаження, відомості про використання оперативної пам'яті. Посібник системного програміста.
курсовая работа [182,6 K], добавлен 07.06.2016 Розробка програмного продукту в програмному середовищі C++ Builder на прикладі гри "Шахи". Опис предметної області: правила пересування фігур по шаховій дошці. Концептуальна модель програмного продукту. Керівництва для програміста та користувача.
отчет по практике [2,8 M], добавлен 27.02.2015Види списків, особливості їх створення, застосування та можливості удосконалення роботи користувача персонального комп’ютера. Керування та аналіз груп споріднених даних у середовищі програми MS Excel 2010. Опрацювання спискiв за допомогою форми даних.
дипломная работа [2,7 M], добавлен 18.06.2014Програми, які виводять на екран характеристики комп'ютера. Розробка програми "Монітор використання ресурсів комп’ютера" на мові програмування ASM-86. Алгоритм програми та її реалізація. Системні вимоги, інструкція для користувача, лістинг програми.
курсовая работа [22,2 K], добавлен 08.08.2009Опис структури даних та вимоги до них, процедур і функцій користувача, файлів та їх призначення. Інструкція для роботи з програмою. Результати роботи програми, її структура та функціональні компоненти, принципи роботи та сфери практичного застосування.
курсовая работа [330,6 K], добавлен 04.02.2015Знайомство з основами побудови і функціонування комп'ютерних мереж, виділення їх особливостей і відмінностей. Характеристика основних способів побудови мереж. Розрахунок економічної ефективності впровадження корпоративної локальної обчислювальної мережі.
курсовая работа [275,0 K], добавлен 18.11.2014