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

  • Вид работы:
    Контрольная работа
  • Предмет:
    Информационное обеспечение, программирование
  • Язык:
    Украинский
    ,
    Формат файла:
    MS Word
    279,91 Кб
  • Опубликовано:
    2014-09-29
Вы можете узнать стоимость помощи в написании студенческой работы.
Помощь в написании работы, которую точно примут!

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

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)

}

}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. 


Не нашли материал для своей работы?
Поможем написать уникальную работу
Без плагиата!