Програма для гри у шахи

 

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Цілі числаКоординати початку та кінця

Схема



Схема

Схема


Основна програма:

- ввід даних, 3 - перевірка ввідних даних на валідність, 4 - якщо початкова і кінцева клітинки різних кольорів, 6 - якщо початкова та кінцева клітини збігаються, 8 - якщо ширина або висота дошки дорівнює одиниці, то слон не може рухатися.solve()

-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 - якщо з двох ходів не дійти, просто піднімемося вище.show_result()

- номер першого на вивід проміжної клітини, останньою і крок для циклу, 3 - номери першої та другої на вивід координати, 3-5 - якщо початкова та кінцева клітина були змінені місцями, проміжні виводимо з останнього по перший.check_input_data() - перевірка ввідних даних.


4.Текст програми


#include <stdio.h>

#include <math.h>

#include <iostream>namespace std;m, n, xb, yb, xe, ye;

// будемо додавати по кроку кожного разу, коли слон не може з поточної

//позиції перейти на кінцеву клітинкуsteps = 1; // кількість кроківintermediate_steps[999][2]; // координати середніх ходівm_and_n_was_swapped = false;

// begin і end - координати початку руху та кінцевого пунктуbegin_and_end_was_swapped = false;abs(int x)

{x < 0 ? -x : x;

}show_result()

{

// номер першої на вивід середньої клітинки, останньої та крок для

//циклуbg = 0, en = steps - 2, step = 1;

// номера першої та другої координати на вивідn1 = 0, n2 = 1;

// якщо початкова та кінцева клітинка помінялися місцями

// середні виводимо з останнього по перший(begin_and_end_was_swapped)

{(bg, en);= -1;

}(m_and_n_was_swapped) swap (n1, n2);

<< steps << endl;(int i = bg; i != en + step; i += step)

{<< intermediate_steps[i][n1];<< ' ' << intermediate_steps[i][n2] << endl;

}

}solve()

{

// якщо ширина дошки довше її висоти, поміняємо ці значення

// координати кожної точки, а у відповіді знову поміняємо х і у

// координати кожної точки (або просто виведемо у вигляді (у; х)(m > n)

{(m, n);(xb, yb);(xe, ye);_and_n_was_swapped = true;

}

// якщо на отриманій дошці, в якій вже висота (за задумом)

// точно довше висоти, пункт призначення нижче початкової позиції

// слона, поміняемо ці точки((х1; у1) і (х2; у2)) місцями,

// а в відповіді виведемо точки в оберненому порядку(yb > ye)

{(xb, xe);(yb, ye);_and_end_was_swapped = true;

}

// поки слон не може потрапити з 1 ходу з посаткової позиції

// на кінцеву, шукаємо наступну позицію(abs(xb - xe) != abs(yb - ye))

{

// перевіримо, чи можна за 2 ходи потрапити в кінцеву позицію

// для цього перевіримо чи можна з будь клітини, на яку можна

// перейти 1 ходом слона, потрапити одним ходом в кінцеву клітинкуcan_reach_in_2_steps = false;(int x = 1; x <= m && !can_reach_in_2_steps; x++)

{

// цьому випадку клітинка, що перевіряється буде збігатися з

// кліткою, на якый знаходився слон, пропустимо їїy = abs(xb - x) + yb;(abs(x - xe) == abs(y - ye))

{

// значить можна з клітини (xb; у1) потрапити на клітку (х2; у2)

// за два ходи, перенесемо слона (xb; у1) на клітинку (х; у),

// а в наступній перевірці цикла abs(xb - xe) != abs(yb - ye)

// поверне false, і пошук завершиться_reach_in_2_steps = true;= x;= y;

// додамо клітинку (х; у) в масив проміжних клітин++;

// якщо кроків n (і n> 1), проміжних клітин n - 1,

// а номер останнього кроку n - 2 (через нумерації з нуля)_steps[steps - 2][0] = x;_steps[steps - 2][1] = y;

}

}

// якщо з двох ходів не дійти, просто піднімемося вище(!can_reach_in_2_steps)

{(xb - 1 > m - xb)

{

// якщо перший ряд далі, підемо вгору-вліво

// вгору підніметься на стільки клітин, на скільки і наліво+= xb - 1;

// а вліво до першого ряда= 1;

}

{

// останній ряд далі, тому підемо вгору-вправо

// вгору підніметься на стільки клітин, на скільки і вправо+= m - xb;

// а вправо до першого ряда= m;

}

// додамо клітку (xb; у1) в масив проміжних клітин++;

// якщо кроків n (і n> 1), проміжних клітин n - 1,

// а номер останнього кроку n - 2 (через нумерації з нуля)_steps[steps - 2][0] = xb;_steps[steps - 2][1] = yb;

}

}_result();

}check_input_data()

{(m < 1 || m > 1000) return false;(n < 1 || n > 1000) return false;(xb < 1 || xb > m) return false;(xe < 1 || xe > m) return false;(yb < 1 || yb > n) return false;(ye < 1 || ye > n) return false;true;

}main(void)

{>> m >> n >> xb >> yb >> xe >> ye;

// перевірка ввідних даних на валідність(!check_input_data())

{<< "Invalid input data";0;

}

// якщо початкова і кінцева клітинки різних кольорів((xb + yb + xe + ye) % 2) cout << 0;

// якщо початкова та кінцева клітини збігаютьсяif (xb == xe && yb == ye) cout << 0;

// якщо ширина або висота дошки дорівнює одиниці,

// то слон не може рухатисяif (m == 1 || n == 1) cout << 0;

// інакше шукаємо кількість ходів і проміжні клітиниsolve();0;

}

5.Контрольний приклад


Введення:

Поле розміром: 500 × 500

Координати початку: (50;8)

Координати кінця: (124;45)


Рисунок 5.1 - Результат роботи програми, після введення 500 500 50 8 124 54


Виведення:

.Виведення мінімальної кількості ходів:0 (ходів немає).

.Виведення координат відвіданих полів, оскільки розв'язків немає то координати не виводяться.

Введення:

Поле розміром: 678 × 567

Координати початку: (43;56)

Координати кінця: (223;446)

Рисунок 5.2 - Результат роботи програми, після введення 678 567 43 56 223 446


Виведення:

.Виведення мінімальної кількості ходів: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 хід).

.Виведення координат відвіданих полів: не виводяться, оскільки хід лише 1.

Висновок


Програма розроблена для використання у грі в шахи. Вона зручна якщо гра не наживо з людиною, а через гру в інтернеті, або з комп'ютером (через додатак). Недолік цієї програми у тому, що вона має деякі умови для розрахунку, такі як початкові та кінцеві точки разташування, також не завжди кількість ходів буде задовольняти умовам гри, тому навряд чи дану програму можна застосовувати на практиці. У подальшому можна вдосконалити програму зробивши її універсальною, тобто зробити розрахунок для інших фігур (не тільки для слона) та їх комбінацій і використовувати її як порадник у грі.

Список використаних джерел


1.Основи програмування та алгоритмічні мови /[Парфьонов Ю.Е., Федорченко В.М., Лосєв М.Ю., Щербаков О.В.] - [частина 1-а] - Харків: ХНЕУ, 2008. - 127с.

.Основи програмування та алгоритмічні мови /[Парфьонов Ю.Е., Федорченко В.М., Лосєв М.Ю., Щербаков О.В.] - [частина 2-а] - Харків: ХНЕУ, 2009. - 179с.

3.


1.Технічне завдання На шаховій дошці розмірами M*N клітинок стоїть слон (фігура, що ходить по діагоналі). З'ясувати, чи може слон дійти до поля (х,у) Якщ

Больше работ по теме:

КОНТАКТНЫЙ EMAIL: [email protected]

Скачать реферат © 2017 | Пользовательское соглашение

Скачать      Реферат

ПРОФЕССИОНАЛЬНАЯ ПОМОЩЬ СТУДЕНТАМ