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


 

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

49176. Расчёт структуры осесимметричных стационарных электромагнитных полей 291.5 KB
  Решение проводится в цилиндрических координатах связанных с центром цилиндра r радиусвектор точки наблюдения ось z направлена вдоль приложенного электрического поля рисунок 1. Если совместить ось z цилиндрической системы координат с осью цилиндра перпендикулярной E0 то потенциал поля не будет зависеть от координаты z и уравнение Лапласа запишется в виде ∆φ= 1.11 Величину служащую для описания...
49177. Комплексная система защиты информации на предприятии. Методические указания 204.5 KB
  Организация и технология защиты информации профиль подготовки: Специалист по защите информации. Организация и технология защиты информации; учебными планами по специальностям; общими указаниями по организации и методике проведения курсового проектирования в вузах; положением о курсовых работах НОО ВПО НП ТИЭИ. Данные методические указания предназначены для студентов 5го курса для выполнении...
49178. Я и физика 21.86 KB
  Слово энергия произносят все кому не лень но редко кто хотя бы немного разбирается в энергетике науке об энергии. Энергетика на самом деле не является наукой об энергии она скорее отрасль производства но все равно именно она увлекла меня настолько что я уверена в том что мое будущее будет связано именно с этой отраслью физики. Конечно традиционные энергетические ресурсы это хорошо и было бы кощунственно их не использовать но меня также привлекают и альтернативные источники энергии. В недалеком будущем когда в мире постепенно...
49179. Підприємство, яке спеціалізується на виробництві двох видів виробів 97.6 KB
  Суму витрат на виготовлення продукції кошторис та собівартість одиниці виробу калькуляцію. Оптимальна кількість факторів виробництва кількість обладнання та чисельність робітників визначається із системи рівнянь: де запланований обєм виробництва двох виробів; Звідки середня місячна заробітна плата 1 го робітника; витрати на утримання та експлуатацію обладнання грн міс; Ціна одиниці обладнання взята без ПДВ гранична норма технологічного заміщення виробництва Використавши цю рівність...
49181. Принципиальная схема управляемого блока питания для двигателя в механизме подъёма хирургического стола 633.32 KB
  Механический стол показанный на рисунок 1 уже устаревший но до сих пор успешно применяется в области медицинского приборостроения. Рисунок 1. Механический стол Гидроприводные столы рисунок 2 являются следующим этапом развития конструкции операционного стола. Рисунок 2.
49182. Разработка игры «Морской бой» с ИИ 4.29 MB
  Разработанный программный продукт реализует классическую версию игры «морской бой» с возможностью выбора уровня сложностей и визуализацией. Кроме того, в проекте реализована система ведения статистики игры. Среди рассмотренных аналогов ни один не обладал всеми этими возможностями сразу.
49183. Жизнедеятельность М. Вебера. Теория познания и методология 246.2 KB
  Вебере и его трудах несмотря на то что современная социология уже ушла далеко вперед актуальность этой теме не вызывает сомнений. Вопервых потому что как и всякий крупный ученый М. Вебера не только классическую социологическую теорию но и чтото новое современное и апеллирующее к непреложным и неизменным законам по которым живет социум.: Аграрная история древнего мира 1923 сразу поставившие его в ряд наиболее крупных ученых свидетельствуют о том что он усвоил требования исторической школы и умело пользовался...