49907

Игра “Восемь ферзей”

Курсовая

Информатика, кибернетика и программирование

В результате выполнения указанной процедуры получим следующий словарь предметной области: Поле для игры в шахматы TField €œАтрибуты Координата Х Координата Y Цвет клетки Ферзи Действия нарисоваться Pint€...

Русский

2014-01-12

86 KB

4 чел.

Министерство образования Российской Федерации

Владимирский государственный университет

Кафедра Информатики и Вычислительной Техники

 Пояснительная записка к курсовой  

работе

Игра “Восемь ферзей”

                        Выполнила: студентка группы ИВТ-398

     Левина И.Н.

           Принял:  доцент Дубов И.Р.

 Владимир 2000

АННОТАЦИЯ

Курсовая работа по дисциплине Технология Программирования включает в себя данный отчет (описание, рисунки и исходные тексты программ (приведены в приложении)),  игры “Восемь ферзей”.

Краткое описание задачи: требуется разработать электронное поле для расстановки восьми ферзей, которые будут стоять так, чтобы  ни один ферзь не был под ударом другого ферзя. Передвижение фигур осуществляется с клавиатуры посредством курсора.

Атака ферзей реализована в соответствии с правилами игры в шахматы. Чтобы ферзи не были подвержены атаке, они не должны стоять в одной горизонтали, вертикали и диагонали. Ферзи, находящиеся под ударом других ферзей отмечены красным цветом, те которые не подвержены атаке – зеленым.  Игра заканчивается  после того, как пользователь расставит всех ферзей на места, где они будут в безопасности. В программе  предусмотрена возможность возврата ходов на произвольную глубину, с помощью клавиши – Х, а также их повторное выполнение, с помощью клавиши – Z.  

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

                                  ЛИСТ ЗАДАНИЯ

                                     Вариант 15

                                “Восемь ферзей”

Имеется шахматная доска. Пользователь выставляет на нее восемь ферзей. Пользователю выдаются сообщения о двух ситуациях: хотя бы один из ферзей оказывается под ударом других ферзей, ни один ферзь не находиться под ударом других ферзей. Ферзи, находящиеся под ударом, и ферзи не находящиеся под ударом, должны быть показаны различными цветами. При помощи курсора пользователь перемещает ферзей по полю. Два ферзя не могут быть расположены на одном поле. Должна быть предусмотрена возможность возврата ходов на произвольную глубину и их повторного выполнения.


             Разработка программной системы: игра “Восемь ферзей”

1. Системный анализ_______________________________________

1.1. Составление словаря предметной области______________

1.2. Техническое задание________________________________

1.2.1. Функции системы____________________________

1.2.2. Эксплуатационные требования_________________

1.2.3. Ограничения на процесс разработки____________

2. Проектирование________________________________________

2.1. Идентефикация классов и объектов___________________

2.2. Идентефикация содержания классов и

       связей между классами  и  объектами__________________

2.3. Реализация классов и объектов_______________________

3. Программирование______________________________________

4. Тестирование___________________________________________

4.1. Спецификация тестируемого метода___________________

4.2. Тесты_______________________________________________

  1.  Заключение._____________________________________________

Приложение 1. Диаграммы классов  и объектов________________

Приложение 2. Тексты программы «Восемь ферзей»_________

Приложение 3. Текст программы-драйвера__________________

Список используемой литературы___________________________


1.СИСТЕМНЫЙ АНАЛИЗ

1.1.Составление словаря предметной области

Составим словарь предметной области и идентифицируем классы и объекты, разделив факты для каждого объекта на три группы: “атрибуты”, “поведение” и “сообщения другим объектам”. Под группой “атрибуты” будем понимать перечень абстракций сущностей данного объекта. В группу “поведение” добавим действия, которые можно сформулировать как “сделать что-то” с данным объектом, при этом будем оговаривать, какие атрибуты изменяются. В группу “сообщения другим объектам” включим те действия, которые описывают взаимодействие данного объекта с другими объектами.

В результате выполнения указанной процедуры, получим следующий     словарь предметной области:

Поле для игры в шахматы (TField)

                      “Атрибуты

                       Координата Х

                       Координата Y

                       Цвет клетки

                       Ферзи

                       “Действия

                        нарисоваться (Paint)”     

Ферзи (TQueen)

                      “Атрибуты

                       Координата Х

                       Координата Y

                       Координата NewX

                       Координата NewY

                       Цвет

 Количество поражений

  Указатель на массив всех ферзей

 Указатель на поле

Графические координаты ферзя

Количество фигур на поле

                      “Действия

 Нарисоваться (Paint)

 Установить координаты (SetCoords)

 Переместить (MoveTo)

 Проверка на атаки

Проверка на атаки для всех фигур на поле”

Ходы, сделанные пользователем (TMoves)

                      “Атрибуты

                       Координата откуда переместили fx

 Координата откуда переместили fy

 Координата куда переместили fx

 Координата куда переместили fy

 Указатель на следующий ход

 Указатель на предыдущий ход

К полученному словарю предметной области следует сделать                    следующие замечания.

Курсор может передвигаться по доске влево ,вправо ,вверх или вниз, в зависимости от управления. Посредством нескольких проверок программа  не допускает выход курсора за пределы доски. Выбор ферзя осуществляется подведением в его клетку курсора и  последующим нажатием  ввода.         

Выбранную  ферзя будем выделять инвертированием,  для отмены выбора ферзя необходимо нажать  клавишу  ENTER на клетке, на которой находится выделение.

    Игровое поле  является замкнутой системой.

Для решаемой задачи важным является отображение объектов на  экране.  За координаты поля примем координаты его левого нижнего угла, а координаты фигуры индексируются относительно клеток поля.  Цвета моделируемых объектов будут определяться  посредством следующих  стандартных констант:

LIGHTGRAY – светло-серый

 BLUE – синий

 YELLOW – желтый

 LIGHTRED - светло-красный

 LIGHTGREEN – светло-зеленый

BLACK -  черный

 BROWN - коричневый

     Т.к. при появлении на экране доска занимает определенное положение, то при  определении переменной класса Tfield  в конструктор передаются координаты поля.

     

                            1.2. Техническое задание

Результатом системного анализа является техническое задание на проектирование, составленное с использованием словаря предметной области и сопровождаемое диаграммой классов (рис. 1.), диаграммой объектов (рис.2.),обобщенными алгоритмами абстракций поведения. Техническое задание содержит следующие требования.

                                               1.2.1. Функции системы

  •  управление игрой осуществляется при помощи команд, подаваемых с клавиатуры: движение курсора по доске осуществляется клавишами курсора; выбор ферзя и выбор клетки в которую перемешается этот ферзь осуществляется с помощью клавиши Enter. Атаки ферзей  осуществляются в соответствии с правилами игры в шахматы. Контроль правильности сделанного  хода возложим на  основную программу.

                                          1.2.2 Эксплуатационные требования

технические требования – ПЭВМ IBM PC;

операционная система – MSDOS;

игра управляется одним пользователем.

                                  1.2.3 Ограничения на процесс разработки

срок выполнения игры – до 29.05.00.

   

                               2.ПРОЕКТИРОВАНИЕ

2.1.Идентефикация классов и объектов

Т.к. классы и объекты, полученные на этапе системного анализа, не являются классами и объектами программной системы, сконструируем на их основе соответствующие классы и объекты, которые составят логическую модель именно программной системы. Оставив прежние названия модельных классов, дополним их абстракции сущностей и поведений, ориентируя их на программные механизмы.

В начальный момент на экране отображается первоначальная расстановка ферзей на игральном поле и ожидается выбор фигуры пользователем.

Основная программа расставляет ферзи на главной диагонали.

Проектируемая система должна обеспечивать отображение моделируемых объектов в виде графических фигур на экране дисплея. В связи с этим возникает необходимость  осуществления передвижения  объектов игры по экрану (по игральному полю). Для чего введем  класс Tmoves, который представляет собой двунаправленный динамический список ходов, сделанных пользователем. Цвет клетки, на которой стоит фигура сохраняется в объекте класса  TField, в   массиве F. Массив F заполняется в момент создания объекта класса Tfield. Отрисовка и стирание фигуры с экрана осуществляется одним методом – Paint(action), где action  принимает значения констант, определенных в файле mtypes.cpp: faSet, faClear, которые определяют отрисовку и стирание фигуры соответственно.   

Проверка на правильность хода ферзя и осуществление ввода с клавиатуры расширенного  и обычного кода клавиши осуществляется главной программой.

2.2. Идентификация содержания классов и связей между классами и объектами

Класс TQueen. Графические объекты в целом характеризуются своим положением на экране и основным цветом, поэтому атрибутами класса TQueen являются точки Х  и Y местоположения фигуры. Графический объект при создании не может сразу располагаться в каком-то месте, поэтому для каждой фигуры в главной программе вызывается метод SetCoords. При моделировании передвижения фигур требуется  их стирать и перерисовывать, поэтому введем соответствующий метод Paint. Этот класс содержит описание методов необходимых для реализации передвижения ферзя по доске.

 Класс  TField. Атрибутами этого класса являются содержащиеся в нем объекты – фигуры. Для класса TField  необходим  соответствующий конструктор , осуществляющий  начальное позиционирование поля.

Класс Tmoves. Ходы, введенные пользователем, сохраняются в двунаправленном списке, каждый элемент которого является объектом класса Tmoves.  Ходы пользователя сохраняются в переменных fx, fy (откуда была перемещена фигура) и переменных tx, ty ( куда была перемещена фигура). А также атрибуты Next и Prev, которые необходимы для создания самого двунаправленного списка.

2.3.Реализация классов и объектов

Все разработанные классы и выявленные объекты должны быть включены в проект.

Каждый класс описан в своем модуле, и все эти модули должны быть подключены к главной программе. Кроме того, для графического изображения простейших фигур необходимо использовать стандартный модуль графики Graphics.

3.ПРОГРАММИРОВАНИЕ

Программирование выполнено на языке C++, что соответствует общим требованиям к курсовой работе. Основу для программирования составляют диаграммы и спецификации этапа проектирования .Необходимые детали разъясняются комментариями в тексте программы

4.ТЕСТИРОВАНИЕ

Все необходимые проверки на правильность ходов и  на корректность ввода пользователя, выполнены либо в классах, либо в главной программе. Поэтому в качестве тестируемого метода я выбрала метод TQueens:: Recheck.

4.1. Спецификация тестируемого метода

Имя:Recheck;

Назначение: Подсчет количества атак данной фигуры другими фигурами;

Аргументы: int blows  (количества атак данной фигуры другими фигурами)

Действия: функция производит пересчет количества атак данной фигуры другими фигурами.

                       5. Заключение

В заключении хотелось бы отметить, что данная программа не является совершенной.   Несомненно ей не хватает более удобного и гибкого интерфейса с пользователем и более красочного оформления.

 Приложение 2

 Приложение 2.

Файл mtypes.cpp.

const kbEnter    = 13;  // коды нажатых клавиш: "Ввод"

const kbUpKey    = 72;  // стрелка вверх

const kbDownKey    = 80;  // стрелка вниз

const kbLeftKey    = 75;  // стрелка влево

const kbRightKey   = 77;  // стрелка вправо

const kbEscape    = 27;  // "Escape" - выход

// множество констант действий для TQueen::Paint()

enum TQueenAction {faSet, faClear};

// классы, см. отдельно каждый файл:

class TQueen; // Queen.cpp      

class TField;  // field.cpp      

class TMoves;  // moves.cpp                              

Файл Queen.cpp.

//#include <conio.h>       

//#include <alloc.h>       

class TQueen {                      

private:       

 TQueen *allQueens;               

                                    

 TField  *paintField;               

                                    

 int     queen[2];                

public:       

 int blows;                          

 int color;                        

 int x,y;                           

 int newx, newy;             

 int Fcount;                 

 TFigure(TQueen *iQueens, TField *iField, int iFc) : x(-1), y(-1), blows(0),

             allQueens(iQueens), paintField(iField), Fcount(iFc)

   { color=LIGHTGREEN; }             

 ~TFigure() { }                      

 void Paint( TQueenAction action );

 void SetCoords(int ix, int iy);     

 void MoveTo(int ix, int iy);        

 void CheckFields();                 

 int  Recheck();                    

};

void TQueen::Paint( TQueenAction action )

{        

setlinestyle(SOLID_LINE, 0, 1);

if (action==faClear && paintField->queens[x][y]) {  

  if (paintField->f[x][y]==1)setcolor(LIGHTGRAY);

  if (paintField->f[x][y]!=1)setcolor(BLUE);

  if (paintField->f[x][y]==1)setfillstyle(SOLID_FILL,LIGHTGRAY);

  if (paintField->f[x][y]!=1)setfillstyle(SOLID_FILL,BLUE);

  fillellipse(paintField->x[x][y]+25,paintField->y[x][y]+25,22,22);             

  paintField->Queens[x][y]=0;      

  return;

}

if (newx>-1 && newy>-1) { x=newx; y=newy; newx=-1; newy=-1; }

for (int i=0; i<2; i++) {

    queen[0]=10+paintField->x[x][y];

    queen[1]=-10+paintField->y[x][y];

}

setcolor(0);

setfillstyle(SOLID_FILL, color);

fillellipse(queen[0],queen[1],22,22);

setcolor(15);

paintField->queens[x][y]=this;        

TQueen *z=allQueens;                 

for (i=0; i<Fcount; i++, z++)              

  if (z->Recheck()) z->Paint(faSet);   

};

int TQueen::Recheck() {

 int t=blows;            

 blows=0;

 CheckFields();

if (blows) color=LIGHTRED; else color=LIGHTGREEN;

 if (blows!=t) return 1; else return 0;  

}

void TQueen::SetCoords(int ix, int iy) {    

if (x<0 || y<0) { x=newx=ix; y=newy=iy; } else MoveTo(ix, iy);

}

void TQueen::MoveTo(int ix, int iy) {

if (!allQueens) return;

if (ix<-1 || iy<-1 || ix>7 || iy>7) return;

Paint(faClear);

newx=ix; newy=iy;

Paint(faSet);

};

void TQueen::CheckFields() {  

int i, d1, d2;

TQueen *z={allQueens};

for (i=0; i<Fcount; i++) {        

  if (!z) return;

d1=y-x; d2=y+x;

if (z!=this && z->x>-1 && z->y>-1)  

    if (x==z->x || y==z->y || z->y==d1+z->x || z->y==d2-z->x)

      blows++;

       z++;  }

}

Файл moves.cpp.

class TMoves {

public:

 int fx, fy, tx, ty;

 TMoves *next, *prev;

 TMoves(int ifx, int ify, int itx, int ity, TMoves *Head) :

           fx(ifx), fy(ify), tx(itx), ty(ity), next(0), prev(0) {

           if (!Head) return;

next=Head;

Head->prev=this;

};

 ~TMoves() { };       

};

Файл field.cpp.

//#include <conio.h>   

//#include <iostream.h>   

#include <graphics.h>   

#include "mtypes.cpp"   

class TField {

private:   

public:   

int x[9][9];

int y[9][9];

int f[8][8];

TQueen *queens[8][8];

TField(int ix, int iy);

void Paint();

};   

 

TField::TField(int ix, int iy)   

{   

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

for (int j=0; j<9; j++) {   

 x[i][j]=i*50+ix;

 y[i][j]=480-(50*j+iy);

if (i<8 && j<8) queens[i][ j]=0;

}   

}   

void TField::Paint()   

{   

int t=1;   

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

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

if (t==1)setfillstyle(SOLID_FILL,LIGHTGRAY);

if (t!=1)setfillstyle(SOLID_FILL,BLUE); 

bar(x[i][j], y[i][j], x[i+1][j+1], y[i+1][j+1]);

f[i][j]=t;   

t=1-t;  

}   

t=1-t;  

}   

setlinestyle(SOLID_LINE, 0, 1);

setcolor(BROWN);   

rectangle(x[0][0]-1, y[0][0]+1,x[8][8]+1, y[8][8]-1);

};   

Файл  main.cpp.    

#include "moves.cpp"  

#include "field.cpp"  

#include "queens.cpp"  

#include <conio.h>   

#include <stdio.h>

#include <graphics.h>  

void ClearSelection(TField *field, int x, int y) {

 if (field->f[x][y]==1)setcolor(LIGHTGRAY);  

 if (field->f[x][y]!=1)setcolor(BLUE);    

 setlinestyle(SOLID_LINE, 0, 3);

rectangle(field->x[x][y]+1, field->y[x][y]-1,

    field->x[x+1][y+1]-2, field->y[x+1][y+1]+2);

}   

void SetSelection(TField *field, int x, int y) {

 setlinestyle(SOLID_LINE, 0, 3);   

setcolor(YELLOW);   

rectangle(field->x[x][y]+1, field->y[x][y]-1,   

   field->x[x+1][y+1]-2, field->y[x+1][y+1]+2);  

}   

void main()   

{   

TField       field(119, 39);

TQueen      queens[8] = {TQueen(&queens[0], &field, 8),

                                          TQueen(&queens[0], &field, 8),

                                          TQueen(&queens[0], &field, 8),

                                          TQueen(&queens[0], &field, 8),

                                          TQueen(&queens[0], &field, 8),

                                          TQueen(&queens[0], &field, 8),

                                          TQueen(&queens[0], &field, 8),

                                          TQueen(&queens[0], &field, 8)};

int          i;

 TQueen      *z, *t;

 char       ch;

 int       x=3, y=3, dx=0, dy=0;

 int       selX=-1, selY=-1;

 TMoves       *moves=new TMoves(0, 0, 0, 0, 0);

{

 int        gm, err, gd = DETECT;

initgraph(&gd, &gm, "");

 err=graphresult();

 if (err!=grOk) {

  printf("%s\n", grapherrormsg(err));

  return;

 }

}

 

setcolor(LIGHTRED);

outtextxy(120, 450, "RED Queen - under attack");

setcolor(LIGHTGREEN);

outtextxy(375, 450, "GREEN Queen - free");

field.Paint();

 for (i=0; i<8; i++) Queens[i].SetCoords(i, i);

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

 queens[i].Recheck();

 queens[i].Paint(faSet);

}

SetSelection(&field, x, y);

do {

  ch=getch();

  if (!ch) {              

    ch=getch();

switch (ch) {       

      case kbUpKey    : if (y<7) dy= 1; break;

      case kbDownKey  : if (y>0) dy=-1; break;

      case kbLeftKey  : if (x>0) dx=-1; break;

      case kbRightKey : if (x<7) dx= 1; break;

}

    if (!dx || !dy) {

    if (selX!=x || selY!=y) ClearSelection(&field, x, y);

      x+=dx; y+=dy;

      dx=0; dy=0;

   if (selX==x && selY==y)

     continue;

   SetSelection(&field, x, y);

}

    continue;

}

  if (ch==kbEnter) {

         if (selX==-1 && selY==-1) {

              if (field.queens[x][y]) { selX=x; selY=y; }

      continue;

}

    if (selX==x && selY==y) {

    selX=selY=-1;

continue;

}

    if (field.queens[x][y]) continue;

    r=field.figures[selX][selY];

if (moves)

   if (moves->prev) {

 TMoves *r,*p;

 r=p=moves->prev;

 while (p->prev) {

  p=p->prev;

  delete r;

r=p;

}

        delete p;

}  

      moves=new TMoves(r->x, r->y, x, y, moves);

      r->MoveTo(x, y);

      for (i=0; i<8; i++) queens[i].Recheck();

     ClearSelection(&field, selX, selY);

     selX=selY=-1;

     continue;

}  

  switch (ch) {

    case 'z' : if (!moves->prev) break;

 moves=moves->prev;

 r=field.queens[moves->fx][moves->fy];

 if (!r) break;

 r->MoveTo(moves->tx, moves->ty);

                             if (selX>-1 && selY>-1) {

   ClearSelection(&field, selX, selY);

   selX=selY=-1;

 }

 break;

    case 'x' : if (!moves->next) break;

 r=field.queens[moves->tx][moves->ty];

               if (!r) break;  

 r->MoveTo(moves->fx, moves->fy);

 if (selX>-1 && selY>-1) {

   ClearSelection(&field, selX, selY);

   selX=selY=-1;

 }

 moves=moves->next;

 break;

  }

} while (ch!=kbEscape);

{

  TMoves *r;

  while (moves->prev) moves=moves->prev;

  r=moves;

  while (moves->next) {

 moves=moves->next;

 delete r;

 r=moves;

  }

  delete moves;

}

closegraph(); // завершаем графику

}

 

Текст программы-драйвера.

#include "moves.cpp"       

#include "field.cpp"       

#include "queens.cpp"       

#include <conio.h>   

#include <stdio.h>   

#include <graphics.h>  

void main()       

{       

TField       field(119, 39);

 

TQueen     queens[3] = {TQueen(&queens[0], &field, 3),    

                                         TQueen(&queens[0], &field, 3),

             TQueen(&queens[0], &field, 3)};

{

 int        gm, err, gd = DETECT;

 initgraph(&gd, &gm, "");

 err=graphresult();

 if (err!=grOk) {

  printf("%s\n", grapherrormsg(err));

  return;

 }

}

field.Paint();

figures[0].SetCoords(2, 3);

figures[1].SetCoords(6, 7);

figures[2].SetCoords(4, 3);

for (int i=0; i<3; i++) {       

  figures[i].Recheck();

figures[i].Paint(faSet);

}

getch();

// вывод результатов

printf("Ожидаемые результаты:\n");

printf("  - для фигуры 1 : 2 атаки\n");

printf("  - для фигуры 2 : 1 атаки\n");

printf("  - для фигуры 3 : 1 атаки\n\n");

printf("Результаты работы программы:\n");

printf("  - для фигуры 1 : %d атаки\n", queens[0].blows);

printf("  - для фигуры 2 : %d атаки\n", queens[1].blows);

printf("  - для фигуры 3 : %d атаки\n", queens[2].blows);

getch(); // пауза

closegraph(); // завершим графику

}

                                        Список литературы

  1.  Методические указания к курсовой работе по дисциплине технология программирования. Составители: И.Р. Дубов, В.А. Барков, А.Г. Долинин.  Владимир:1999г
  2.  Липаев В.В. Проектирование программных средств. М.:Высш.шк.,1990.-303с.


 

А также другие работы, которые могут Вас заинтересовать

46837. Independent elements of the sentence 32.5 KB
  Independent elements of the sentence s the term implies generlly re not grmmticlly dependent on ny prticulr prt of the sentence but s rule refer to the sentence s whole. Only occsionlly they my refer to seprte prt of the sentence. Its position is more free thn tht of ny other prts of the sentence nd ccordingly it my occur in different positions in the sentence.
46840. Специфика обучения в дошкольном возрасте 32.5 KB
  Обучение и развитие в дошкольном возрасте С развитием ребенка меняется и характер обучения ребенка. Кро говорит о ребенке 3 лет: уже становится возможным какаято программа обучения и воспитания не школьная программа а программа самого ребенка. Раньше определенного возраста ребенка бесполезно обучать например держать ложку а позже определенного возраста это делать просто бесполезно. В педологии пользуются только нижней границей ниже известного уровня нельзя ребенка обучать тому или ному предмету.
46842. Grammar. Grammatical meaning 32.5 KB
  When we name very general statements about grammar, we are idealizing about the language system, identifying broad patterns. grammar has evolved to fossilitate the expression of basic meanings. Meanings which are so inexpensible and so commonly occuring, that we require an economical means of expressing them. It would be absurd if we had to elaborate entirely new strings of words whenever we wanted to observe things around us. grammatical meaning is closely
46843. Основные принципы построения закладываемые при создании вычислительных систем 32.83 KB
  Вычислительная система ВС совокупность взаимосвязанных и взаимодействующих процессоров или ЭВМ периферийного оборудования и программного обеспечения предназначенную для сбора хранения обработки и распределения информации. Телекоммуникационная вычислительная сеть ТВС – это сеть о6мена и распределенной обработки информации образуемая множеством взаимосвязанных абонентских систем и средствами связи; средства передачи и обработки информации ориентированы в ней на коллективное использование общесетевых ресурсов аппаратных...
46844. Творчество Н.М.Карамзина, повести 33 KB
  Карамзин представитель сентиментализма в России всязи с этим новизной его прозы являются: 1. Карамзин ввел в русскую литературу целый ряд важных тем. Идеологические аспекты дружбы важные для Радищева отходят у Карамзина на второй план. Карамзин сумел показать атмосферу детства навсегда ушедшую из души взрослого человека но в чемто и оставшуюся притягательную и желанную.