Помощь в написании студенческих работ
Антистрессовый сервис

Проектирование игры в шахматы

КурсоваяПомощь в написанииУзнать стоимостьмоей работы

Изображение, на котором представлена шахматная доска с шахматными фигурами белого и чёрного цветов. Эл. F — шахматная фигура (последовательность заглавных, строчных букв не более чем из 2-х символов). Эл. F — шахматная фигура (последовательность заглавных, строчных букв не более чем из 2-х символов). Модуль 1 содержит функции решения основных подзадач и определения входных и выходных данных. С… Читать ещё >

Проектирование игры в шахматы (реферат, курсовая, диплом, контрольная)

Министерство образования и наук Российской Федерации НОВОСИБИРСКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ КАФЕДРА ПРИКЛАДНОЙ МАТЕМАТИКИ Курсовая работа по практикуму на ЭВМ: Структуры данных и алгоритмы Факультет прикладной математики и информатики Группа ПМИ-22

Студентка Малыгина Д.Н.

Преподаватель Тракимус Ю.В.

Новосибирск

1. Условие задачи

Задано описание шахматной позиции в обычной шахматной нотации. Например, «белые: Кр g1, Л f1, пп f2, g2, h3; чёрные: Кр b8, К e5, С e6, Ф a2, пп a7, b7». По описанию позиции напечатать изображение этой позиции, содержащее поле, разбитое на клетки подходящего размера, внутри которых записано название фигуры и её цвет (для занятых в позиции клеток). Определить все возможные ходы фигур. Переместить фигуру на возможное для неё место. шахматная позиция фигура ход

2. Анализ задачи

2.1 Исходные данные задачи

C = (B, W)

C — (описание шахматной позиции) сложная величина состоящая из 2-х эл. B и W

B = (N, Fj, Ki)? {? }

B — (фигуры чёрного цвета) сложная величина состоящая из 2-х эл. F, K или пустого множества

Fj — шахматная фигура j = 1, 16

Ki = (Xi, Yj) Ki — координата шахматной фигуры i = 1, 64

Xi? {`a', …, `h'} i = 1, 8 координата по x

Yj? {`1', …, `8'} j = 1, 8 координата по y

W = (N, Fj, Ki)? {? }

W — (фигуры белого цвета) сложная величина состоящая из 2-х эл. F, K или пустого множества

Fj — шахматная фигура j = 1, 16

Ki = (Xi, Yj) Ki — координата шахматной фигуры i = 1, 64

Xi? {`a', …, `h'} i = 1, 8 координата по x

Yj? {`1', …, `8'} j = 1, 8 координата по y

2.2 Результат

D = (T, n)? {? }

D — сложная величина состоящая из 2-х эл. или пустого множества

T = ti

Т — вид в котором шахматная фигура, включая её координаты, представлена в таблице

Ns — номер шахматной фигуры, под которым она обозначена в в таблице s = 1,32

Xj — номер под которым координата по X, шахматной фигуры, обозначена в в таблицеj = 1, 8

Yi — номер под которым координата по Y, шахматной фигуры, в таблицеi = 1, 8

n — величина обозначающая фактическое количество элементов Т, n = 1,32

2.3 Решение

Основное решение поставленной задачи составит в нахождении соответствующих значений входной величины т. е. все возможные варианты ходов фигуры

Формальная постановка задачи

— определение фигуры (сама фигура, цвет)

— в зависимости от определённой фигуры, выбор одного из нескольких алгоритмов решения

— изменение итоговых данных

3. Структуры исходных данных и результатов задачи

3.1 Входные данные

Внешнее представление:

С - описание шахматной позиции, представлена в виде 2-х элементов отделённых друг от друга '; '

1 элемент: В — фигуры чёрного цвета, состоит из 2-х элементов отделённых друг от друга запятыми и пробелами

1 эл. F — шахматная фигура (последовательность заглавных, строчных букв не более чем из 2-х символов)

2 эл. K — координата шахматной фигуры (последовательность из 2-х символов:

первый — строчная латинская буква, второй — цифра)

2 элемент: W — фигуры белого цвета, состоит из 2-х элементов отделённых друг от друга запятыми и пробелами

1 эл. F — шахматная фигура (последовательность заглавных, строчных букв не более чем из 2-х символов)

2 эл. K — координата шахматной фигуры (последовательность из 2-х символов:

первый — строчная латинская буква, второй — цифра)

Внутреннее представление:

С представлено, по частям в виде символьного массива

3.2 Выходные данные

Внешнее представление:

Изображение, на котором представлена шахматная доска с шахматными фигурами белого и чёрного цветов

Внутреннее представление:

Статическая таблица, состоящая из двух частей:

1-я часть список из трёх эл. (номер фигуры, координата по Х, координата по Y)

2-я часть n — фактическое количество эл. в таблице

— структура таблицы

struct elem

{

int chessmanNo;

int x;

int y;

}

struct work

{

elem table [32];

int n;

}

4. Укрупнённый алгоритм решения задачи

{

flg = 0;

if (выбор фигуры)

{

if (белые)

flg = 1;

if (королль)

//возможные ходы

king (a, b, flg);

if (ферзь)

//возможные ходы

queen (a, b, flg);

if (слон)

//возможные ходы

bishop (a, b, flg);

if (ладья)

//возможные ходы

rook (a, b, flg);

if (конь)

//возможные ходы

kNight (a, b, flg);

if (пешка)

//возможные ходы

pawn (a, b, flg);

}

//перенос выбраной фигуры

else

{

if (место занято) срубить фигуру;

else

переместить фигуру;

}

}

5. Структура программы

Текст программы разбит на четыре модуля.

Модуль 1 содержит функции решения основных подзадач и определения входных и выходных данных.

Модуль 2 содержит функции графического вывода данных.

Модуль 3 содержит объявление структур и подпрограмм.

Модуль 4 содержит вспомогательные функции, реализующие основной алгоритм решения задачи.

5.1 Модуль 1

Главная функция main:

— назначение:

определения входных и выходных данных задачи.

— прототип: void main ()

5.2 Модуль 2

процедура input_fl

— назначение:

ввод из файла обозначения фигур привычных пользователю инициализация структур: color1, color2

— прототип: void input_fl (color1 *B, color2 *W)

процедура initchess

— назначение:

инициализация шахматных фигур (фигуры видные пользователю)

— прототип: void initchess ()

процедура figchess

— назначение: задаем место фигуры на изображении видном пользователю

iфигура, y, x — координаты

— прототип: void figchess (int i, int y, int x)

процедура myalg

— назначение: подпрограмма связывающая алгоритм решения задачи и вывод результата

— прототип: void myalg ()

процедура InitializeComponent

— назначение: инициализация компонент относящихся к выводу результата

— прототип: void InitializeComponent (void)

процедура clik

— назначение: подпрограмма связывающая нахождение возможных ходов

— прототип: void clik (int a, int b, stack **course)

5.3 Модуль 3

содержит объявление структур: color1, color2 (структуры содержащие обозначение фигур удобных пользователю и их соответствующее обозначения в программе),

work (таблица содержащая результат), stack (стек для хранения возможных ходов) содержит объявление процедур: myscanf, king, queen, bishop, rook, kNight, pawn, in_stack

содержит объявление функций: occupied_space, out_stack

5.4 Модуль 4

функция searchBlack

— назначение: поиск номера, соответствующего шахматной фигуре, под которые данная фигура известна программе

— прототип: searchBlack (char *s, color1 B)

B — объявление структуры содержащей информацию о фигурах чёрного цвета (входной параметр)

s — символьный массив содержащий обозначение фигуры данная функция возвращает номер под которые данная фигура известна программе функция searchWhite

— назначение: поиск номера, соответствующего шахматной фигуре, под которые данная фигура известна программе

— прототип: int searchWhite (char *s, color2 W)

W — объявление структуры содержащей информацию о фигурах белого цвета (входной параметр)

s — символьный массив содержащий обозначение фигуры данная функция возвращает номер под которыми данная фигура известна программе процедура myscanf

— назначение: считывание пользовательского обозначения фигур

— прототип: void myscanf (color1 B, color2 W, work *el)

возвращает указатель на таблицу с основным результатом программы процедура king

— назначение: определение возможных ходов короля

— прототип: void king (stack **B, int a, int c, int f, work ell)

процедура queen

— назначение: определение возможных ходов ферзя

— прототип: void queen (stack **B, int a, int c, int f, work ell)

процедура bishop

— назначение: определение возможных ходов слона

— прототип: void bishop (stack **B, int a, int c, int f, work ell)

процедура rook

— назначение: определение возможных ходов ладьи

— прототип: void rook (stack **B, int a, int c, int f, work ell)

процедура kNight

— назначение: определение возможных ходов коня

— прототип: void kNight (stack **B, int a, int c, int f, work ell)

процедура pawn

— назначение: определение возможных ходов пешки

— прототип: void pawn (stack **B, int a, int c, int f, work ell)

процедура in_stack

— назначение: операция положить в стек

— прототип: void in_stack (stack **Q, int x1, int y1)

функция out_stack

— назначение: операция положить в стек

— прототип: int out_stack (stack**Q, int *x1, int *y1)

5.5 Структура программы по управлению

6. Текст программы

/*chessman.h*/

#include «StdAfx.h»

#include

#include

#include

#include «chessman.h»

FILE *fl, *fll, *fll2, *input;

//Координаты по x

char x [] = «abcdefgh» ;

//Координаты по y

char y [] = «87 654 321» ;

void openfile (work ell)

{

if ((fll = fopen («fll.txt», «w»)) == NULL)

perror («error»);

else{

for (int i = 0; i<= ell. n; i++){

fprintf (fll," %d «, ell. table[i]. chessmanNo);

fprintf (fll," %d «, ell. table[i]. x);

fprintf (fll," %d «, ell. table[i]. y);

}

fclose (fll);

}

}

void closefile (work *ell)

{

if ((fll = fopen («fll.txt», «r»)) == NULL)

perror («error»);

else{

for (int i = 0; fscanf (fll," %d «,&(ell->table[i]. chessmanNo)) ≠ EOF; i++){

fscanf (fll," %d «,&(ell->table[i]. x));

fscanf (fll," %d «,&(ell->table[i]. y));

ell->n = i;

}

fclose (fll);

}

}

void openfile_stakc (stack **B)

{

if ((fll2 = fopen («fll2.txt», «w»)) == NULL)

perror («error»);

else{

int f, v;

while (out_stack (&(*B), &f, &v)){

fprintf (fll," %d «, f);

fprintf (fll," %dn", v);

}

fclose (fll2);

}

}

void closefil_stakc (stack **B)

{

if ((fll2 = fopen («fll2.txt», «r»)) == NULL)

perror («error»);

else{

int p, r;

while (fscanf (fll2," %d «,&p) ≠ EOF){

fscanf (fll," %d «,&r);

in_stack (&(*B), p, r);

}

fclose (fll2);

}

}

//поиск по чёрным фигурам

int searchBlack (char *s, color1 B)

{

for (int k = 0; k<16; k++){

if (!strcmp (B.Bcolor[k]. chessman, s))

return B. Bcolor[k]. No;

}

return -1;

}

//поиск по белым фигурам

int searchWhite (char *s, color2 W)

{

for (int k = 0; k<16; k++){

if (!strcmp (W.Wcolor[k]. chessman, s))

return W. Wcolor[k]. No;

}

return -1;

}

//считывание обозначение пользователя

void myscanf (color1 B, color2 W, work *el)

{

if ((input = fopen («input.txt», «r»)) == NULL)

perror («error»);

else{

int wrk, i;

el->n = 0;

char sym[5], chessm[3], chessman[3], slovo[8], same = '0', sign[] = «;» ;

// Считываем информацию о фигурах из файла

while (fscanf (input," %s" ,&slovo) ≠ EOF)

{

//чёрные фигуры

if (strcmp (B.chessBlack, slovo) == 0)

{

//считываем до ;

fscanf (input," %s" ,&sym);

while (sym[0] ≠ sign[0])

{

// координата

if (sym[1] >= '0' && sym[1] <= '9')

{

//если одинаковые фигуры

if (same ≠ '0')

{

strcpy (chessm, chessman);

strcat (chessm,&same);

wrk = searchBlack (chessm, B);

el->table[el->n]. chessmanNo = wrk;

//выясняем координату по x

i = 0;

while (sym[0] ≠ x[i])

i++;

el->table[el->n]. x = i;

//выясняем координату по y

i = 0;

while (sym[1] ≠ y[i])

i++;

el->table[el->n]. y = i;

//переходим к следующему элементу таблицы

el->n++;

same++;

}

else

{

//выясняем координату по x

i = 0;

while (sym[0] ≠ x[i])

i++;

el->table[el->n]. x = i;

//выясняем координату по y

i = 0;

while (sym[1] ≠ y[i])

i++;

el->table[el->n]. y = i;

//переходим к следующему элементу таблицы

el->n++;

same++;

}

}

//фигура

else

{

wrk = searchBlack (sym, B);

el->table[el->n]. chessmanNo = wrk;

same = '0';

strcpy (chessman, sym);

}

fscanf (input," %s" ,&sym);

}

}

//белые фигуры

else

{

//считываем до ;

fscanf (input," %s" ,&sym);

while (sym[0] ≠ sign[0])

{

// координата

if (sym[1] >= '0' && sym[1] <= '9')

{

//если одинаковые фигуры

if (same ≠ '0')

{

strcpy (chessm, chessman);

strcat (chessm,&same);

wrk = searchWhite (chessm, W);

el->table[el->n]. chessmanNo = wrk;

//выясняем координату по x

i = 0;

while (sym[0] ≠ x[i])

i++;

el->table[el->n]. x = i;

//выясняем координату по y

i = 0;

while (sym[1] ≠ y[i])

i++;

el->table[el->n]. y = i;

//переходим к следующему элементу таблицы

el->n++;

same++;

}

else

{

//выясняем координату по x

i = 0;

while (sym[0] ≠ x[i])

i++;

el->table[el->n]. x = i;

//выясняем координату по y

i = 0;

while (sym[1] ≠ y[i])

i++;

el->table[el->n]. y = i;

//переходим к следующему элементу таблицы

el->n++;

same++;

}

}

//фигура

else

{

wrk = searchWhite (sym, W);

el->table[el->n]. chessmanNo = wrk;

same = '0';

strcpy (chessman, sym);

}

fscanf (input," %s" ,&sym);

}

}

}

}

fclose (input);

}

//что в данной клетке

int occupied_space (int K1, int K2, work ell)

{

for (int i = 0; i <= ell. n; i++){

if (ell.table[i]. x == K1 && ell. table[i]. y == K2)

return ell. table[i]. chessmanNo;

}

return -1;

}

//пешка рядом

int pawn_of_king (int x, int y, int flg, work elem)

{

const int s = x, c = y;

int M = -3, N = -3;

//белые

if (flg == 1) (7 < N && N < 16))

return 0;

//не одна из пешек не претендует на это место

return 1;

//чёрные

else{

if ((s-1 >= 0 && s-1 <= 7)&&(c+1 >= 0 && c+1 <= 7))

M = occupied_space (s-1, c+1, elem);

if ((s+1 >= 0 && s+1 <= 7)&&(c+1 >= 0 && c+1 <= 7))

N = occupied_space (s+1, c+1, elem);

//важный ход пешки

if ((23 < M && M < 32) && (23 < N && N < 32))

return 0;

//не одна из пешек не претендует на это место

return 1;

}

}

//конь рядом

int kNight_of_king (int x, int y, int flg, work elem)

{

const int s = x, c = y;

int M = -3, N = M, V = M, K = M, G = M, Q = M, P = M, D = M;

//если фигура входит в границы

if ((s+2 >= 0 && s+2 <= 7)&&(c+1 >= 0 && c+1 <= 7))

M = occupied_space (s+2, c+1, elem);

//если фигура входит в границы

if ((s+2 >= 0 && s+2 <= 7)&&(c-1 >= 0 && c-1 <= 7))

N = occupied_space (s+2, c-1, elem);

//если фигура входит в границы

if ((s-2 >= 0 && s-2 <= 7)&&(c+1 >= 0 && c+1 <= 7))

V = occupied_space (s-2, c+1, elem);

//если фигура входит в границы

if ((s-2 >= 0 && s-2 <= 7)&&(c-1 >= 0 && c-1 <= 7))

K = occupied_space (s-2, c-1, elem);

//если фигура входит в границы

if ((s-1 >= 0 && s-1 <= 7)&&(c-2 >= 0 && c-2 <= 7))

G = occupied_space (s-1, c-2, elem);

//если фигура входит в границы

if ((s+1 >= 0 && s+1 <= 7)&&(c-2 >= 0 && c-2 <= 7))

Q = occupied_space (s+1, c-2, elem);

//если фигура входит в границы

if ((s-1 >= 0 && s-1 <= 7)&&(c+2 >= 0 && c+2 <= 7))

P = occupied_space (s-1, c+2, elem);

//если фигура входит в границы

if ((s+1 >= 0 && s+1 <= 7)&&(c+2 >= 0 && c+2 <= 7))

D = occupied_space (s+1, c+2, elem);

//определение цвета фигур

if (flg == 1)

elseQ == 17

}

//слон рядом

int bishop_of_king (int x, int y, int flg, work elem)

{

int M = -1, g1, g2, g3, g4;

const int s = x, c = y;

//цвет

if (flg == 1){

g1 = 2;

g2 = 4;

g3 = 5;

g4 = 20;

}

else{

g1 = 18;

g2 = 19;

g3 = 21;

g4 = 3;

}

//пока фигура входит в границы или является сама королём

do{

x++;

y++;

if ((x <= 7 && x >= 0)&&(y <= 7 && y >= 0))M == g3)

return 0;

}while ((M == -1|| M == g4) && (x <= 7 && x >= 0)&&(y <= 7 && y >= 0));

x = s, y =c;

//пока фигура входит в границы или является сама королём

do{

x++;

y—;

if ((x <= 7 && x >= 0)&&(y <= 7 && y >= 0))M == g2

}while ((M == -1|| M == g4) && (x <= 7 && x >= 0)&&(y <= 7 && y >= 0));

x = s, y =c;

//пока фигура входит в границы или является сама королём

do{

x—;

y—;

if ((x <= 7 && x >= 0)&&(y <= 7 && y >= 0))

M = occupied_space (x, y, elem);

if (M == g1

}while ((M == -1|| M == g4) && (x <= 7 && x >= 0)&&(y <= 7 && y >= 0));

x = s, y =c;

//пока фигура входит в границы или является сама королём

do{

x—;

y++;

if ((x <= 7 && x >= 0)&&(y <= 7 && y >= 0))

M = occupied_space (x, y, elem);

if (M == g1

}while ((M == -1|| M == g4) && (x <= 7 && x >= 0)&&(y <= 7 && y >= 0));

return 1;

}

//лодья рядом

int rook_of_king (int x, int y, int flg, work elem)

{

int M = -1, g1, g2, g3, g4;

const int s = x, c = y;

if (flg == 1){

g1 = 0;

g2 = 4;

g3 = 7;

g4 = 20;

}

else{

g1 = 16;

g2 = 19;

g3 = 23;

g4 = 3;

}

//пока фигура входит в границы или является сама королём

do{

x++;

if (x <= 7 && x >= 0) M == g2

}while ((M == -1|| M == g4) && (x <= 7 && x >= 0));

x = s, y = c;

//пока фигура входит в границы или является сама королём

do{

x—;

if (x <= 7 && x >= 0)

M = occupied_space (x, y, elem);

if (M == g1

}while ((M == -1|| M == g4) && (x <= 7 && x >= 0));

x = s, y = c;

//пока фигура входит в границы или является сама королём

do{

y—;

if (y <= 7 && y >= 0) M == g3)

return 0;

}while ((M == -1|| M == g4) && (y <= 7 && y >= 0));

y = c;

//пока фигура входит в границы или является сама королём

do{

y++;

if (y <= 7 && y >= 0)

}while ((M == -1|| M == g4) && (y <= 7 && y >= 0));

return 1;

}

//король рядом

int king_of_king (int x, int y, int flg, work elem)

{

int g, M;

const int a = x, b = y;

if (flg == 1)

g = 3;

else

g = 20;

//если фигура входит в границы

if ((a+1 >= 0 && a+1 <= 7)&&(b+1 >= 0 && b+1 <= 7)){

M = occupied_space (a+1, b+1, elem);

if (M == g)

return 0;

}

//если фигура входит в границы

if ((a-1 >= 0 && a-1 <= 7)&&(b-1 >= 0 && b-1 <= 7)){

M = occupied_space (a-1, b-1, elem);

if (M == g)

return 0;

}

//если фигура входит в границы

if ((a+1 >= 0 && a+1 <= 7)&&(b-1 >= 0 && b-1 <= 7)){

M = occupied_space (a+1, b-1, elem);

if (M == g)

return 0;

}

//если фигура входит в границы

if ((a-1 >= 0 && a-1 <= 7)&&(b+1 >= 0 && b+1 <= 7)){

M = occupied_space (a-1, b+1, elem);

if (M == g)

return 0;

}

//если фигура входит в границы

if (a-1 >= 0 && a-1 <= 7){

M = occupied_space (a-1, b, elem);

if (M == g)

return 0;

}

//если фигура входит в границы

if (a+1 >= 0 && a+1 <= 7){

M = occupied_space (a+1, b, elem);

if (M == g)

return 0;

}

//если фигура входит в границы

if (b+1 >= 0 && b+1 <= 7){

M = occupied_space (a, b+1, elem);

if (M == g)

return 0;

}

//если фигура входит в границы

if (b-1 >= 0 && b-1 <= 7){

M = occupied_space (a, b-1, elem);

if (M == g)

return 0;

}

return 1;

}

//связывающая подпрограмма для короля

int communication_king (int k, int c, int f, work el){

if (king_of_king (k, c, f, el)){

if (pawn_of_king (k, c, f, el)){

if (rook_of_king (k, c, f, el)){

if (bishop_of_king (k, c, f, el)){

if (kNight_of_king (k, c, f, el))

return 1;

}

}

}

}

return 0;

}

//король

void king (stack **B, int a, int c, int f, work ell)

{

const int a1 = a, b1 = c;

int W1 = 16, B1 = 0, g1, g2, M;

//цвет

if (f == 1){

g1 = B1;

g2 = B1 + 15;

}

else{

g1 = W1;

g2 = W1 + 15;

}

//просмотр всех вариантов хода королём

//если фигура входит в границы

if ((a1+1 >= 0 && a1+1 <= 7)&&(b1+1 >= 0 && b1+1 <= 7)){

//не одна из фигур не претендует на клетку

if (communication_king (a1+1, b1+1, f, ell)) M == -1)

in_stack (&(*B), a1+1, b1+1);

}

//если фигура входит в границы

if ((a1−1 >= 0 && a1−1 <= 7)&&(b1−1 >= 0 && b1−1 <= 7)){

//не одна из фигур не претендует на клетку

if (communication_king (a1−1, b1−1, f, ell))

M = occupied_space (a1−1, b1−1, ell);

if ((M >= g1 && M <= g2)

}

//если фигура входит в границы

if ((a1+1 >= 0 && a1+1 <= 7)&&(b1−1 >= 0 && b1−1 <= 7)){

//не одна из фигур не претендует на клетку

if (communication_king (a1+1, b1−1, f, ell))

M = occupied_space (a1+1, b1−1, ell);

if ((M >= g1 && M <= g2)

}

//если фигура входит в границы

if ((a1−1 >= 0 && a1−1 <= 7)&&(b1+1 >= 0 && b1+1 <= 7)){

//не одна из фигур не претендует на клетку

if (communication_king (a1−1, b1+1, f, ell)) M == -1)

in_stack (&(*B), a1−1, b1+1);

}

//если фигура входит в границы

if (a1−1 >= 0 && a1−1 <= 7){

//не одна из фигур не претендует на клетку

if (communication_king (a1−1, b1, f, ell))

}

//если фигура входит в границы

if (a1+1 >= 0 && a1+1 <= 7){

//не одна из фигур не претендует на клетку

if (communication_king (a1+1, b1, f, ell))

}

//если фигура входит в границы

if (b1+1 >= 0 && b1+1 <= 7){

//не одна из фигур не претендует на клетку

if (communication_king (a1, b1+1, f, ell))

M = occupied_space (a1, b1+1, ell);

if ((M >= g1 && M <= g2)

}

//если фигура входит в границы

if (b1−1 >= 0 && b1−1 <= 7){

//не одна из фигур не претендует на клетку

if (communication_king (a1, b1−1, f, ell))

}

}

//ферзь

void queen (stack **B, int a, int c, int f, work ell)

{

bishop (&(*B), a, c, f, ell);

rook (&(*B), a, c, f, ell);

}

//слон

void bishop (stack **B, int a, int c, int f, work ell)

{

const int a1 = a, b1 = c;

int W1 = 16, B1 = 0, g1, g2, g3, M;

//цвет

if (f == 1){

g1 = B1;

g2 = B1 + 15;

g3 = 3;

}

else{

g1 = W1;

g2 = W1 + 15;

g3 = 20;

}

//просмотр всех вариантов хода слоном

//до тех пор пока не встретится король противника или очередная клетка будет занята

do M == -1) && M ≠ g3)

in_stack (&(*B), a, c);

while ((M == -1)&&((a >= 0 && a <= 7)&&(c >= 0 && c <= 7)) && M ≠ g3);

a = a1, c = b1;

//до тех пор пока не встретится король противника или очередная клетка будет занята

dowhile ((M == -1)&&((a >= 0 && a <= 7)&&(c >= 0 && c <= 7)) && M ≠ g3);

a = a1, c = b1;

//до тех пор пока не встретится король противника или очередная клетка будет занята

do M == -1) && M ≠ g3)

in_stack (&(*B), a, c);

while ((M == -1)&&((a >= 0 && a <= 7)&&(c >= 0 && c <= 7)) && M ≠ g3);

a = a1, c = b1;

//до тех пор пока не встретится король противника или очередная клетка будет занята

dowhile ((M == -1)&&((a >= 0 && a <= 7)&&(c >= 0 && c <= 7)) && M ≠ g3);

}

//лодья

void rook (stack **B, int a, int c, int f, work ell)

{

const int a1 = a, b1 = c, z1 = -1, z2 = 8;

int W1 = 16, B1 = 0, g1, g2, g3, M;

//цвет

if (f == 1){

g1 = B1;

g2 = B1 + 15;

g3 = 3;

}

else{

g1 = W1;

g2 = W1 + 15;

g3 = 20;

}

//просмотр всех вариантов хода ладьёй

//до тех пор пока не встретится король противника или очередная клетка будет занята

dowhile ((M == -1) && ((a > z1) && (a < z2)) && M ≠ g3);

a = a1, c = b1;

//до тех пор пока не встретится король противника или очередная клетка будет занята

do M == -1) && M ≠ g3)

in_stack (&(*B), a, c);

while ((M == -1) && ((a > z1) && (a < z2)) && M ≠ g3);

a = a1, c = b1;

//до тех пор пока не встретится король противника или очередная клетка будет занята

do

c—;

M = occupied_space (a, c, ell);

if ((c > z1 && c < z2) && ((M >= g1 && M <= g2) while ((M == -1) && ((c > z1) && (c < z2)) && M ≠ g3);

a = a1, c = b1;

//до тех пор пока не встретится король противника или очередная клетка будет занята

do

c++;

M = occupied_space (a, c, ell);

if (((c > z1) && (c < z2)) && ((M >= g1 && M <= g2) while ((M == -1) && ((c > z1) && (c < z2)) && M ≠ g3);

}

//конь

void kNight (stack **B, int a, int c, int f, work ell)

{

const int a1 = a, b1 = c;

int W1 = 16, B1 = 0, g1, g2, g3, M;

//цвет

if (f == 1){

g1 = B1;

g2 = B1 + 15;

g3 = 3;

}

else{

g1 = W1;

g2 = W1 + 15;

g3 = 20;

}

//просмотр всех вариантов хода конём

M = occupied_space (a1+2,b1−1,ell);

//если координата в границах доски фигура в клетке цвета противника и не король

if (((a1+2 >= 0 && a1+2 <= 7)&&(b1−1 >= 0 && b1−1 <= 7)) && ((M >= g1 && M <= g2)|| M == -1) && M ≠ g3)

in_stack (&(*B), a1+2, b1−1);

M = occupied_space (a1+2,b1+1,ell);

//если координата в границах доски фигура в клетке цвета противника и не король

if (((a1+2 >= 0 && a1+2 <= 7)&&(b1+1 >= 0 && b1+1 <= 7)) && ((M >= g1 && M <= g2)|| M == -1) && M ≠ g3)

in_stack (&(*B), a1+2, b1+1);

M = occupied_space (a1−2,b1+1,ell);

//если координата в границах доски фигура в клетке цвета противника и не король

if (((a1−2 >= 0 && a1−2 <= 7)&&(b1+1 >= 0 && b1+1 <= 7)) && ((M >= g1 && M <= g2)|| M == -1) && M ≠ g3)

in_stack (&(*B), a1−2, b1+1);

M = occupied_space (a1−2,b1−1,ell);

//если координата в границах доски фигура в клетке цвета противника и не король

if (((a1−2 >= 0 && a1−2 <= 7)&&(b1−1 >= 0 && b1−1 <= 7)) && ((M >= g1 && M <= g2)|| M == -1) && M ≠ g3)

in_stack (&(*B), a1−2, b1−1);

M = occupied_space (a1−1,b1−2,ell);

//если координата в границах доски фигура в клетке цвета противника и не король

if (((a1−1 >= 0 && a1−1 <= 7)&&(b1−2 >= 0 && b1−2 <= 7)) && ((M >= g1 && M <= g2)|| M == -1) && M ≠ g3)

in_stack (&(*B), a1−1, b1−2);

M = occupied_space (a1+1,b1−2,ell);

//если координата в границах доски фигура в клетке цвета противника и не король

if (((a1+1 >= 0 && a1+1 <= 7)&&(b1−2 >= 0 && b1−2 <= 7)) && ((M >= g1 && M <= g2)|| M == -1) && M ≠ g3)

in_stack (&(*B), a1+1, b1−2);

M = occupied_space (a1−1,b1+2,ell);

//если координата в границах доски фигура в клетке цвета противника и не король

if (((a1−1 >= 0 && a1−1 <= 7)&&(b1+2 >= 0 && b1+2 <= 7)) && ((M >= g1 && M <= g2)|| M == -1) && M ≠ g3)

in_stack (&(*B), a1−1, b1+2);

M = occupied_space (a1+1,b1+2,ell);

//если координата в границах доски фикура в клетке цвета противника и не король

if (((a1+1 >= 0 && a1+1 <= 7)&&(b1+2 >= 0 && b1+2 <= 7)) && ((M >= g1 && M <= g2)|| M == -1) && M ≠ g3)

in_stack (&(*B), a1+1, b1+2);

}

//пешка

void pawn (stack **B, int a, int c, int f, work ell)

{

const int a1 = a, b1 = c;

int W1 = 16, B1 = 0, g1, g2, g3, M;

//цвет

if (f == 1){

g1 = B1;

g2 = B1 + 15;

g3 = 3;

if (c == 6){

//одна вперёд

M = occupied_space (a1,b1−1,ell);

if ((b1−1 >= 0 && b1−1 <= 7) && (M == -1)){

in_stack (&(*B), a1, b1−1);

//две вперёд

M = occupied_space (a1,b1−2,ell);

if ((b1−2 >= 0 && b1−2 <= 7) && (M == -1))

in_stack (&(*B), a1, b1−2);

}

//одна влево

M = occupied_space (a1−1,b1−1,ell);

if ((a1−1 >= 0 && a1−1 <= 7) && (b1−1 >= 0 && b1−1 <= 7) && (M >= g1 && M <= g2) && M ≠ g3)

in_stack (&(*B), a1−1, b1−1);

//одна вправо

M = occupied_space (a1+1,b1−1,ell);

if ((a1+1 >= 0 && a1+1 <= 7) && (b1−1 >= 0 && b1−1 <= 7) && (M >= g1 && M <= g2) && M ≠ g3)

in_stack (&(*B), a1+1, b1−1);

}

else{

//одна вперёд

M = occupied_space (a1,b1−1,ell);

if ((b1−1 >= 0 && b1−1 <= 7) && (M == -1))

in_stack (&(*B), a1, b1−1);

//одна влево

M = occupied_space (a1−1,b1−1,ell);

if ((a1−1 >= 0 && a1−1 <= 7) && (b1−1 >= 0 && b1−1 <= 7) && (M >= g1 && M <= g2) && M ≠ g3)

in_stack (&(*B), a1−1, b1−1);

//одна вправо

M = occupied_space (a1+1,b1−1,ell);

if ((a1+1 >= 0 && a1+1 <= 7) && (b1−1 >= 0 && b1−1 <= 7) && (M >= g1 && M <= g2) && M ≠ g3)

in_stack (&(*B), a1+1, b1−1);

}

}

else{

g1 = W1;

g2 = W1 + 15;

g3 = 20;

if (c == 1){

//одна вперёд

M = occupied_space (a1,b1+1,ell);

if ((b1+1 >= 0 && b1+1 <= 7) && (M == -1)){

in_stack (&(*B), a1, b1+1);

//две вперёд

M = occupied_space (a1,b1+2,ell);

if ((b1+2 >= 0 && b1+2 <= 7) && (M == -1))

in_stack (&(*B), a1, b1+2);

}

//одна влево

M = occupied_space (a1−1,b1+1,ell);

if ((a1−1 >= 0 && a1−1 <= 7) && (b1+1 >= 0 && b1+1 <= 7) && (M >= g1 && M <= g2) && M ≠ g3)

in_stack (&(*B), a1−1, b1+1);

//одна вправо

M = occupied_space (a1+1,b1+1,ell);

if ((a1+1 >= 0 && a1+1 <= 7) && (b1+1 >= 0 && b1+1 <= 7) && (M >= g1 && M <= g2) && M ≠ g3)

in_stack (&(*B), a1+1, b1+1);

}

else{

//одна вперёд

M = occupied_space (a1,b1+1,ell);

if ((b1+1 >= 0 && b1+1 <= 7) && (M == -1))

in_stack (&(*B), a1, b1+1);

//одна влево

M = occupied_space (a1−1,b1+1,ell);

if ((a1−1 >= 0 && a1−1 <= 7) && (b1+1 >= 0 && b1+1 <= 7) && (M >= g1 && M <= g2) && M ≠ g3)

in_stack (&(*B), a1−1, b1+1);

//одна вправо

M = occupied_space (a1+1,b1+1,ell);

if ((a1+1 >= 0 && a1+1 <= 7) && (b1+1 >= 0 && b1+1 <= 7) && (M >= g1 && M <= g2) && M ≠ g3)

in_stack (&(*B), a1+1, b1+1);

}

}

}

//копирование стека

void copying (stack *Q1, stack **Q2)

{

while (Q1 ≠ NULL) {

if (*Q2 == NULL){

*Q2 = new stack;

(*Q2)->X = Q1->X;

(*Q2)->Y = Q1->Y;

(*Q2)->next = NULL;

}

else{

stack *R = new stack;

R->X = Q1->X;

R->Y = Q1->Y;

R->next = (*Q2);

(*Q2) = R;

}

Q1 = Q1->next;

}

}

//в стек

void in_stack (stack **Q, int x1, int y1)

{

if (*Q == NULL){

*Q = new stack;

(*Q)->X = x1;

(*Q)->Y = y1;

(*Q)->next = NULL;

}

else{

stack *R = new stack;

R->X = x1;

R->Y = y1;

R->next = *Q;

*Q = R;

}

}

//из стека

int out_stack (stack**Q, int *x1, int *y1)

{

if (*Q == NULL)

return 0;

*x1 = (*Q)->X;

*y1 = (*Q)->Y;

stack *N = *Q;

*Q = (*Q)->next;

delete N;

return 1;

}

//поиск в стеке

int search_stack (stack*Q, int n, int m)

{

while (Q ≠ NULL){

if (Q->X == n && Q->Y == m)

return 1;

Q = Q->next;

}

return 0;

}

/*Form1.h*/

#pragma once

#include

#include

#include «chessman.h»

extern FILE *fl, *fll, *fll2, *input;

int C, old_X, old_Y;// фигура для пп clik

namespace chess {

using namespace System;

using namespace System: ComponentModel;

using namespace System: Collections;

using namespace System: Windows:Forms;

using namespace System: Data;

using namespace System: Drawing;

/// Сводка для Form1

int fig[63];

public ref class Form1: public System: Windows:Forms:Form

{

public:

//необходимая информация о фигурх

void input_fl (color1 *B, color2 *W)

{

int k = 0, q = 0;

char ch[4];

if ((fl = fopen («fl.txt», «r»)) == NULL)

perror («error»);

else{

fscanf (fl," %s" ,&B->chessBlack);

fscanf (fl," %s" ,&W->chessWhite);

while ((k < 16) && fscanf (fl," %s" ,&ch))

{

strcpy (B->Bcolor[k]. chessman, ch);

B->Bcolor[k]. No = k;

k++;

}

while (fscanf (fl," %s" ,&ch) ≠ EOF)

{

strcpy (W->Wcolor[q]. chessman, ch);

W->Wcolor[q]. No = k;

q++;

k++;

}

}

fclose (fl);

}

//инициализация фигур

void initchess ()

{

for (int i = 0; i < 32; i++)

fig[i]= -5;

initznak ();

}

void initznak ()

{

for (int i = 32; i < 63; i++)

fig[i]= -5;

}

//место фигуры iфигура, y, x — место (они с -1)

void figchess (int i, int y, int x)

{

fig[i] = y*8+x;

}

//считаные нажатием координаты

void clik (int a, int b, stack **course)

{

//инициализация символов хода

initznak ();

work ell;

stack *backup = NULL;

int flg = 0;

//вспомогательные элементы

closefile (&ell);

closefil_stakc (&backup);

//выбор фигуры

if (backup == NULL)

C == 21))

bishop (&(*course), a, b, flg, ell);

//лодья

if ((C == 0

//выбор места переноса фигуры

else

{

int U, d = 0, h = 0;

//необходимо чтобы выбранное место соответствовало правильному ходу

if (search_stack (backup, a, b)){

U = occupied_space (old_X, old_Y, ell);

while (ell.table[d]. chessmanNo ≠ U){

d++;

}

U = occupied_space (a, b, ell);

//место пусто переместить

if (U == -1){

ell.table[d]. x = a;

ell.table[d]. y = b;

}

//место занято срубить

else{

while (ell.table[h]. chessmanNo ≠ U)

h++;

ell.table[h]. x = -5;

ell.table[h]. y = -5;

ell.table[d]. x = a;

ell.table[d]. y = b;

}

//смена изображения

initznak ();

for (int j = 0; j < ell. n; j++)

figchess (ell.table[j]. chessmanNo, ell. table[j].y, ell. table[j].x);

}

//вспомогательные элементы

while (out_stack (&backup, &old_X, &old_Y))

old_X = 0, old_Y = 0;

openfile_stakc (&backup);

openfile (ell);

}

}

//основной алгоритм

void myalg ()

{

color1 Bl;

color2 Wh;

work elem;

input_fl (&Bl,&Wh);

myscanf (Bl, Wh, &elem);

openfile (elem);

for (int j = 0; j < elem. n; j++)

//выполнение вывода пользовательской расстановки фигур

figchess (elem.table[j]. chessmanNo, elem. table[j]. y, elem. table[j]. x);

}

Form1(void)

{

initchess ();

InitializeComponent ();

myalg ();

}

protected:

~Form1()

{

if (components)

{

delete components;

}

}

private: System: Windows:Forms:PictureBox^ pictureBox1;

protected:

private:

System:ComponentModel:Container ^components;

#pragma region Windows Form Designer generated code

void InitializeComponent (void)

{

this->pictureBox1 = (gcnew System: Windows:Forms:PictureBox ());

(cli:safe_cast (this->pictureBox1))->BeginInit ();

this->SuspendLayout ();

// pictureBox1

this->pictureBox1->BackColor = System: Drawing:Color:White;

this->pictureBox1->Location = System: Drawing:Point (12, 12);

this->pictureBox1->Name = L" pictureBox1″ ;

this->pictureBox1->Size = System: Drawing:Size (400, 400);

this->pictureBox1->TabIndex = 0;

this->pictureBox1->TabStop = false;

this->pictureBox1->Paint += gcnew System: Windows:Forms:PaintEventHandler (this, &Form1:pictureBox1_Paint);

this->pictureBox1->MouseClick += gcnew System: Windows:Forms:MouseEventHandler (this,&Form1:pictureBox1_MouseClick);

// Form1

this->AutoScaleDimensions = System: Drawing:SizeF (6, 13);

this->AutoScaleMode = System: Windows:Forms:AutoScaleMode:Font;

this->ClientSize = System: Drawing:Size (424, 420);

this->Controls->Add (this->pictureBox1);

this->FormBorderStyle = System: Windows:Forms:FormBorderStyle:FixedSingle;

this->MaximizeBox = false;

this->Name = L" Form1″ ;

this->Text = L" Form1″ ;

(cli:safe_cast (this->pictureBox1))->EndInit ();

this->ResumeLayout (false);

}

#pragma endregion

private: System: Void pictureBox1_Paint (System:Object^ sender, System: Windows:Forms:PaintEventArgs^ e) {

Graphics^ g = e->Graphics;

int n = 0;

for (int i = 0; i < 8; i++)

{

for (int j = 0; j < 8; j++)

{

if (n % 2 == 1)

g->FillRectangle (Brushes:Brown, j * 50, i * 50, 50, 50);

else

g->FillRectangle (Brushes:Wheat, j * 50, i * 50, 50, 50);

n++;

}

n++;

}

System:Drawing:Font^ drawFont = gcnew System: Drawing:Font («Arial», 29);

g->DrawString (L" ?", drawFont, Brushes: Black, fig[0] % 8 * 50, fig[0] / 8 * 50);

g->DrawString (L" ?", drawFont, Brushes: Black, fig[1] % 8 * 50, fig[1] / 8 * 50);

g->DrawString (L" ?", drawFont, Brushes: Black, fig[2] % 8 * 50, fig[2] / 8 * 50);

g->DrawString (L" ?", drawFont, Brushes: Black, fig[3] % 8 * 50, fig[3] / 8 * 50);

g->DrawString (L" ?", drawFont, Brushes: Black, fig[4] % 8 * 50, fig[4] / 8 * 50);

g->DrawString (L" ?", drawFont, Brushes: Black, fig[5] % 8 * 50, fig[5] / 8 * 50);

g->DrawString (L" ?", drawFont, Brushes: Black, fig[6] % 8 * 50, fig[6] / 8 * 50);

g->DrawString (L" ?", drawFont, Brushes: Black, fig[7] % 8 * 50, fig[7] / 8 * 50);

for (int i = 0; i < 8; i++)

g->DrawString (L" ?", drawFont, Brushes: Black, fig[8 + i] % 8 * 50, fig[8 + i] / 8 * 50);

g->DrawString (L" ?", drawFont, Brushes: Black, fig[16] % 8 * 50, fig[16] / 8 * 50);

g->DrawString (L" ?", drawFont, Brushes: Black, fig[17] % 8 * 50, fig[17] / 8 * 50);

g->DrawString (L" ?", drawFont, Brushes: Black, fig[18] % 8 * 50, fig[18] / 8 * 50);

g->DrawString (L" ?", drawFont, Brushes: Black, fig[19] % 8 * 50, fig[19] / 8 * 50);

g->DrawString (L" ?", drawFont, Brushes: Black, fig[20] % 8 * 50, fig[20] / 8 * 50);

g->DrawString (L" ?", drawFont, Brushes: Black, fig[21] % 8 * 50, fig[21] / 8 * 50);

g->DrawString (L" ?", drawFont, Brushes: Black, fig[22] % 8 * 50, fig[22] / 8 * 50);

g->DrawString (L" ?", drawFont, Brushes: Black, fig[23] % 8 * 50, fig[23] / 8 * 50);

for (int i = 24; i < 32; i++)

g->DrawString (L" ?", drawFont, Brushes: Black, fig[i] % 8 * 50, fig[ i] / 8 * 50);

for (int i = 32; i < 63; i++)

g->DrawString (L" ?", drawFont, Brushes: Blue, fig[i] % 8 * 50, fig[i] / 8 * 50);

}

private: System: Void pictureBox1_MouseClick (System:Object^ sender, System: Windows:Forms:MouseEventArgs^ e) {

stack *poss_course = NULL;

int x1 = e->X / 50, y1 = e->Y / 50;

clik (x1, y1, &poss_course);

if (poss_course ≠ NULL){

for (int s = 0, k = 0, z = 32; out_stack (&poss_course, &s, &k); z++)

figchess (z, k, s);

}

pictureBox1->Refresh ();

}

};

}

/*main.cpp*/

// chess. cpp: главный файл проекта.

#include «stdafx.h»

#include «Form1.h»

#include «chessman.h»

using namespace chess;

[STAThreadAttribute]

int main (array ^args)

{

// Включение визуальных эффектов Windows XP до создания каких-либо элементов управления

Application:EnableVisualStyles ();

Application:SetCompatibleTextRenderingDefault (false);

// Создание главного окна и его запуск

Application:Run (gcnew Form1());

return 0;

}

/*chessman.cpp*/

#ifndef CHESSMAN_H

#define CHESSMAN_H

//Таблица с чёрными фигурами

struct Black {

char chessman [4];

int No;

};

struct color1 {

Black Bcolor [16];

char chessBlack [8];

};

//Таблица с белыми фигурами

struct White {

char chessman [4];

int No;

};

struct color2 {

White Wcolor [16];

char chessWhite [7];

};

//Рабочая таблица

struct elem {

int chessmanNo;

int x;

int y;

};

struct work {

elem table [33];

int n;

};

struct stack {

stack *next;

int X;

int Y;

};

void myscanf (color1 B, color2 W, work *el);

//королль

void king (stack **B, int a, int c, int f, work ell);

//ферзь

void queen (stack **B, int a, int c, int f, work ell);

//слон

void bishop (stack **B, int a, int c, int f, work ell);

//лодья

void rook (stack **B, int a, int c, int f, work ell);

//конь

void kNight (stack **B, int a, int c, int f, work ell);

//пешка

void pawn (stack **B, int a, int c, int f, work ell);

//копирование стека

void copying (stack *Q1, stack **Q2);

//в стек

void in_stack (stack **Q, int x, int y);

//из стека

int out_stack (stack**Q, int *x, int *y);

//что в данной клетке

int occupied_space (int K1, int K2, work ell);

void openfile (work ell);

void closefile (work *ell);

void openfile_stakc (stack **B);

void closefil_stakc (stack **B);

int search_stack (stack*Q, int n, int m);

#endif

7. Набор тестов

Входные данные

Назначение теста

1)

Отсутствие обозначения фигур

2) чёрные: Л a8, h8, К b8, g8, С c8, f8, Кр d8, Ф e8, пп a7, b7, c7, d7, e7, f7, g7, h7; белые: Л a1, h1, К b1, g1, С c1, f1, Кр d1, Ф e1, пп a2, b2, c2, d2, e2, f2, g2, h2 ;

Все возможные фигуры

3) п d2

Возможный ход пешки бело цвета

4) К g1

Возможный ход коня бело цвета

5) Ф e3

Возможный ход ферзя бело цвета

6) С e2

Возможный ход слона бело цвета

7) Л g8

Возможный ход ладья чёрного цвета

8) Ф g5

Возможный ход ферзя бело цвета

9) Кр d4

Возможный короля бело цвета

10) Кр d5

Возможный короля бело цвета

11) п g2

Возможный короля пешки бело цвета

12) Кр e4

Возможный короля бело цвета

13) Кр c6

Возможный короля чёрного цвета

14) Л g8

Возможный ход ладья чёрного цвета

15) Кр e7

Возможный короля бело цвета

16) Л h1

Возможный ход ладья белого цвета

17) Л e6

Возможный ход ладья белого цвета

18) Кр d3

Возможный короля чёрного цвета

19) Кр c4

Возможный короля чёрного цвета

8. Результаты работы программы

Входные данные

Выходные данные

1)

2)

3)

4)

5)

6)

7)

8)

9)

10)

11)

12)

13)

14)

15)

16)

17)

18)

19)

1. Хиценко В. П., Шапошникова Т. А. Структуры данных и алгоритмы: методические указания. Новосибирск: НГТУ, 2008.

Показать весь текст
Заполнить форму текущей работой