Разработка программного обеспечения для компьютерной игры "Морской Бой"

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

Федеральное агентство по образованию

Государственное образовательное учреждение высшего  профессионального

образования

«Алтайский  государственный технический университет  им. И.И. Ползунова»

КАФЕДРА ПРИКЛАДНАЯ МАТЕМАТИКА

Курсовая  работа защищена с оценкой

УДК 681.3             _______________________

                             Руководитель

                      работы_________доцент Е.В. Егорова

                (подпись,  должность, и.о. фамилия) 

«РАЗРАБОТКА ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ ДЛЯ КОМПЬЮТЕРНОЙ ИГРЫ «МОРСКОЙ БОЙ»»

ТЕМА  РАБОТЫ

ПОЯСНИТЕЛЬНАЯ ЗАПИСКА

К КУРСОВОЙ РАБОТЕ 

ПО ДИСЦИПЛИНЕ «ПРОГРАММИРОВАНИЕ НА ЯЗЫКЕВЫСОКОГО  УРОВНЯ» 

КР_230105.20.000_ПЗ

обозначение документа 

Работу выполнил(и)

СТУДЕНТ(Ы) ГР. ПОВТ-91                       И.А.Капустин

                  ___________     _____________________

                                                      подпись, и.о. фамилия

НОРМОКОНТРОЛЕР    __________доцент Е.В. Егорова

                                          подпись,  должность, и.о. фамилия

БАРНАУЛ 2010

Задание на курсовую работу

Учебная дисциплина: Программирование на языке высокого уровня

ФИО студента:Капустин Иван Андреевич

Группа: ПОВТ-91

Тема  курсовой работы: Разработка программного обеспечения для компьютерной игры    морской бой

Этапы разработки курсовой работы и сроки  их выполнения:

  1. Постановка задачи. Изучение необходимой учебной и научно-технической литературы (1-4 недели семестра);
  2. Разработка структуры данных и алгоритма решения задачи (3-6 недели семестра);
  3. Написание текста программы (5-12 недели семестра);
  4. Тестирование и отладка программного продукта (9-12 недели семестра);
  5. Оформление отчета о проделанной работе (13-14 недели семестра);
  6. Сдача работы руководителю и защита работы (14-17 недели семестра);

  Дата выдачи задания: 11.02.2010

  Срок защиты: 30.05.2010

Руководитель:     _________________________    доцент Е. В. Егорова 
 

Содержание 

Введение 4

1 Постановка  задачи 5

2 Решение задачи 6

3 Описание программного  обеспечения 7

      3.1 Программная реализация 7

      3.2 Общие сведения 7

            3.2.1 Список файлов 7

            3.2.2 Технические требования 7

      3.3Алгоритм 7

      3.4 Состав программы 8

Заключение 10

Список используемых источников 11

Приложение А  Текст программы 12

Приложение Б  Тестирование 58

Приложение ВРуководство системного программиста 63

Приложение ГРуководство пользователя 64 

Введение 

      Данная  программа представляет собой полностью  оеализованную компьютерную игру «Морской бой» в режиме компьютер-игрок. Правила игры простые, интерфейс интуитивно понятен. Игра прекрасно подходит для хорошего время провождения, развивает различный умственные качества. Достоинтсва программы заключаются в том что имеется два режима расстоновки кораблей для пользователя – «ручной» и автоматический. Так же компьютер обладает собственным интеллектом, так что игра покажется пользователю интересной и увлекательной. 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

     1 Постановка задачи 

Программа должна иметь два поля – игрока и компьютера.

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

Пользователь  не должен видеть расстановку кораблей компьютера.

Корабли компьютера и корабли игрока (при автоматической расстановке) расстанавливаются случайным образом.

Программа предоставлет пользователю возможность выбора (кто  ходит первым).

В программе  предусмотрено два режима расстановки  кораблей: автоматический и «ручной». При «ручной» расстановке предусмотрены защиты от некорректной расстановки кораблей.

В любой игры ее можно приостановить или выйти  из нее

Компьютер обладает собственным интеллектом. 

     2 Решение задачи 

                                                 Алгоритм решения 

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

3 Описание программного  обеспечения 

     3.1 Программная реализация

Программа написана на языке Си. Этот язык выбран по причине  того, что он является наиболее гибким, удобным и к тому же наиболее понятным.Программа  имеет модульную структуру. Все функции находятся в пределах одного файла.Данный программный продукт предусматривает наличие файла: sea battle.exe. 

     3.2 Общие сведения

Наименование  программы:  игра «морской бой»

Разработчик:  Капустин И.А.., АлтГТУ, ФИТ, ПОВТ-91

Назначение  программы:Программа предназначена для времяпровождения и развития умственных качеств 

     3.2.1 Список файлов

sea battle.exe - Файл для запуска программы.

sea battle.cpp - Текст главной программы на языке Си. 

     3.2.2 Технические требования

Процессор:     PentiumII 266MHz и выше

RAM:      16Mb и выше

Видеокарта:     4Mb и выше

Свободное дисковое пространство: 800kb 

   3.3Алгоритм 

  • Главное меню
    • Новая игра
      • Расстановка кораблей
        • Атоматическая раастановка
        • Ручная расстановка
            • Чей ход?
              • Компьютер
              • Игрок
                  • Игровой процесс
    • Выход из программы
 

3.4 Состав программы

Установка курсора

void GotoXY(int X, int Y) X – координата по горизонтали, У – по вертикали

Подключение цветов

void SetColor(int text, int background) text-цвет текста, background – цвет фона

подключение русской  кодировки

char *Rus (char *s2)

автоматическая  расстановка кораблей

int sheeps(int pole[10][10]) pole[10][10] – массив для поля. Функция  возвращает массив в виде 1 и  0, где 1 – клетки кораблей, 0 –  пустые поля

функция ручной расстановки  кораблей

int ras(int mypole[10][10]) муpole[10][10] – массив для поля. Функция возвращает массив в виде 1 и 0, где 1 – клетки кораблей, 0 – пустые поля

функция ручной расстановки  кораблей

функция главного меню

int menu() козвращает  значение в главную функцию  для выхода или продолжения

функция хода компьютера

int comp(int mypole[10][10], int udar , int ud[2], int hod[1]) муpole[10][10] – массив  кораблей, udar – считает число  убитых, ud[2]-массив позиции раненого  корабля

функция хода игрока

int player(int pole[10][10],int udar) pole[10][10] – массив кораблей, udar – считает число убитых 
 

   
 
 
 
 
 
 
 
 
 
 
 
 

Заключение 

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

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

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

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

Список  используемых источников

  1. Егорова Е.В. Программирование на языке высокого уровня. Часть II: Учебное пособие  / Алт. госуд. технич. ун-т им. И.И. Ползунова. – Барнаул: 1998. – 176 с.
 
 
  1. Павловская  Т.А. С/С++ программирование на языке выского уровня. Уч-к для вузов. С-Пб,  Питер, 2009
  2. Р.Лафоре, Объектно-ориентированное программирование в С++, классика Computer Science. 4-е издание, Спб, Питер 2004
 
 

Приложение  А

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

#include <conio.h>

#include <stdio.h>

#include <time.h>

#include <stdlib.h>

#include <windows.h> 

HANDLE hConsole;

//HANDLE hStdout, hStdin;

HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE); 

void GotoXY(int X, int Y)

{

      COORD coord = { X, Y };

      SetConsoleCursorPosition(hStdOut, coord);

}  

enum ConsoleColor            //Iiaee??aiea oaaoia

{

    Black         = 0,

    Blue          = 1,

    Green         = 2,

    Cyan          = 3,

    Red           = 4,

    Magenta       = 5,

    Brown         = 6,

    LightGray     = 7,

    DarkGray      = 8,

    LightBlue     = 9,

    LightGreen    = 10,

    LightCyan     = 11,

    LightRed      = 12,

    LightMagenta  = 13,

    Yellow        = 14,

    White         = 15

};

void SetColor(int text, int background)       

{

   HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);

   SetConsoleTextAttribute(hStdOut, (WORD)((background << 4) | text));

}

char s1[256];                         //Iiaee??aiea ?onneie eiae?iaee

char *Rus (char *s2)

{ AnsiToOem(s2,s1); return s1; }  
 
 

int sheeps(int pole[10][10])

{

    int i,j,f,k,r;

    int rand_chislo, rand_chislo1, ts,s; //neo?aeiua ?enea

  

/*  char kr=219;

   char a=218,b=196,c=191,     //ia?aiaiiua aey ia?aoe eeaoie

        d=179,

        e=192, g=217;   */

      srand(time(NULL));      //ooieoey aey aaia?aoee neo?aeiuo ?enae 

     for (i=0;i<10;i++) 

      for (j=0;j<10;j++)

      pole [i][j]=0;

   

     do{ f=0;                                 //?annoaiiaea ?aoaa?iiai ei?aaey

        rand_chislo = 0 + rand() %10;

        rand_chislo1= 0 + rand() %10;

       

        ts = 1+rand()%4;

       

          if (ts==1) {for(i=0;i<3;i++) if(rand_chislo==i)f=1;}

         if (ts==2)  {for(i=7;i<10;i++) if(rand_chislo==i)f=1;}                         

          if (ts==3) {for(i=0;i<3;i++) if(rand_chislo1==i)f=1;}

         if (ts==4)  {for(i=7;i<10;i++) if(rand_chislo1==i)f=1;}      

        }

       while (f==1);

        switch (ts){

          case 1: pole[rand_chislo][rand_chislo1]=1; pole[rand_chislo-1][rand_chislo1]=1;

                  pole[rand_chislo-2][rand_chislo1]=1;pole[rand_chislo-3][rand_chislo1]=1; break;

           case 2: pole[rand_chislo][rand_chislo1]=1; pole[rand_chislo+1][rand_chislo1]=1;

                   pole[rand_chislo+2][rand_chislo1]=1;pole[rand_chislo+3][rand_chislo1]=1; break;

         case 3: pole[rand_chislo][rand_chislo1]=1; pole[rand_chislo][rand_chislo1-1]=1;

                 pole[rand_chislo][rand_chislo1-2]=1;pole[rand_chislo][rand_chislo1-3]=1;break;

          case 4: pole[rand_chislo][rand_chislo1]=1; pole[rand_chislo][rand_chislo1+1]=1;

                  pole[rand_chislo][rand_chislo1+2]=1;pole[rand_chislo][rand_chislo1+3]=1; break; }

    

   

   

   

   

  

    for (k=0;k<3;k++)                                       //?annoaiiaea aaieiuo ei?aaeae

     {

       do{ f=0;

        rand_chislo = 0 + rand() %10;

        rand_chislo1= 0 + rand() %10;

       

        ts = 1+rand()%4;

       

          if (ts==1)  {if(rand_chislo!=0){ for (i=rand_chislo-2;i<rand_chislo+2;i++)

                                      for (j=rand_chislo1-1;j<=rand_chislo1+1;j++)

                                        {if (pole[i][j]!=0){f=1;}}}else f=1; }

         if (ts==2)  {if (rand_chislo!=9)  {  for (i=rand_chislo-1;i<=rand_chislo+2;i++)

                                          for (j=rand_chislo1-1;j<=rand_chislo1+1;j++)

                                          { if (pole[i][j]!=0){ f=1;}}}else f=1;  }                           

          if (ts==3) { if (rand_chislo1!=0) {   for (i=rand_chislo-1;i<=rand_chislo+1;i++)

                                            for (j=rand_chislo1-2;j<=rand_chislo1+1;j++)

                                            { if (pole[i][j]!=0){ f=1;}}}else f=1;  }

         if (ts==4) { if (rand_chislo1!=9) {   for (i=rand_chislo-1;i<=rand_chislo+1;i++)

                                            for (j=rand_chislo1-1;j<=rand_chislo1+2;j++)

                                            { if (pole[i][j]!=0){ f=1;}}}

                                            else f=1;   }                                 

        }

       while (f==1);

        switch (ts){

          case 1: pole[rand_chislo][rand_chislo1]=1; pole[rand_chislo-1][rand_chislo1]=1; break;

          case 2: pole[rand_chislo][rand_chislo1]=1; pole[rand_chislo+1][rand_chislo1]=1; break;

          case 3: pole[rand_chislo][rand_chislo1]=1; pole[rand_chislo][rand_chislo1-1]=1;break;

          case 4: pole[rand_chislo][rand_chislo1]=1; pole[rand_chislo][rand_chislo1+1]=1; break; }

     

       

     }

   

     for (k=0;k<2;k++)                                       //?annoaiiaea o?ieiuo ei?aaeae

     {

       do{ f=0;

        rand_chislo = 0 + rand() %10;

        rand_chislo1= 0 + rand() %10;

       

        ts = 1+rand()%4;

       

          if (ts==1)  {if(rand_chislo!=0&&rand_chislo!=1){ for (i=rand_chislo-3;i<rand_chislo+2;i++)

                                      for (j=rand_chislo1-1;j<=rand_chislo1+1;j++)

                                        {if (pole[i][j]!=0){f=1;}}}else f=1; }

         if (ts==2)  {if (rand_chislo!=9&&rand_chislo!=8)  {  for (i=rand_chislo-1;i<=rand_chislo+3;i++)

                                          for (j=rand_chislo1-1;j<=rand_chislo1+1;j++)

                                          { if (pole[i][j]!=0){ f=1;}}}else f=1;  }                           

          if (ts==3) { if (rand_chislo1!=0&&rand_chislo1!=1) {   for (i=rand_chislo-1;i<=rand_chislo+1;i++)

                                            for (j=rand_chislo1-3;j<=rand_chislo1+1;j++)

                                            { if (pole[i][j]!=0){ f=1;}}}else f=1;  }

         if (ts==4) { if (rand_chislo1!=9&&rand_chislo1!=8) {   for (i=rand_chislo-1;i<=rand_chislo+1;i++)

                                            for (j=rand_chislo1-1;j<=rand_chislo1+3;j++)

                                            { if (pole[i][j]!=0){ f=1;}}}

                                            else f=1;   }                                 

        }

       while (f==1);

        switch (ts){

          case 1: pole[rand_chislo][rand_chislo1]=1; pole[rand_chislo-1][rand_chislo1]=1;pole[rand_chislo-2][rand_chislo1]=1; break;

           case 2: pole[rand_chislo][rand_chislo1]=1; pole[rand_chislo+1][rand_chislo1]=1; pole[rand_chislo+2][rand_chislo1]=1; break;

         case 3: pole[rand_chislo][rand_chislo1]=1; pole[rand_chislo][rand_chislo1-1]=1;pole[rand_chislo][rand_chislo1-2]=1;break;

          case 4: pole[rand_chislo][rand_chislo1]=1; pole[rand_chislo][rand_chislo1+1]=1;pole[rand_chislo][rand_chislo1+2]=1; break; }

    }

   

   

   

    for (i=0; i<4;i++ )                          //?annoaiiaea iae?iuo ei?aaeae

    {do{

      rand_chislo = 0 + rand() %10;

       rand_chislo1= 0 + rand() %10;}

       while (pole[rand_chislo][rand_chislo1]!=0||pole[rand_chislo+1][rand_chislo1]!=0||pole[rand_chislo-1][rand_chislo1]!=0||pole[rand_chislo][rand_chislo1+1]!=0||pole[rand_chislo][rand_chislo1-1]!=0||pole[rand_chislo+1][rand_chislo1+1]!=0||pole[rand_chislo-1][rand_chislo1-1]!=0||pole[rand_chislo+1][rand_chislo1-1]!=0||pole[rand_chislo-1][rand_chislo1+1]!=0);

      

       pole[rand_chislo][rand_chislo1]=1;}

  

   

    

     

     

    

                 

                 

                

                 

/*    for (i=0;i<10;i++)                     //einoueu aey i?iniio?a ei?aaeae

      {for (r=0;r<3;r++){for (j=0;j<10;j++)

       {if (pole[i][j]==0){ if(r==0) printf ("%c%c%c%c%c",a,b,b,b,c);

                           if(r==1) printf ("%c   %c",d,d);

                           if(r==2) printf ("%c%c%c%c%c",e,b,b,b,g);}

    

        else printf ("%c%c%c%c%c",kr,kr,kr,kr,kr);}

      printf ("\n");}}

     

    

     

    getch(); */

return pole[10][10];

} 

/*int vivod(int pole[10][10])

{

      int i,j,x,y;

      printf("\xc9\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xBB\n");

    printf("\xba"); printf("\t\t     ");printf("\xba\n");

    printf("\xba"); printf("\t\t     ");printf("\xba\n");

    printf("\xba"); printf("\t\t     ");printf("\xba\n");

    printf("\xba"); printf("\t\t     ");printf("\xba\n");

    printf("\xba"); printf("\t\t     ");printf("\xba\n");

    printf("\xba"); printf("\t\t     ");printf("\xba\n");

    printf("\xba"); printf("\t\t     ");printf("\xba\n");

    printf("\xba"); printf("\t\t     ");printf("\xba\n");

    printf("\xba"); printf("\t\t     ");printf("\xba\n");

    printf("\xba"); printf("\t\t     ");printf("\xba\n");

    printf("\xba"); printf("\t\t     ");printf("\xba\n");

    printf("\xba"); printf("\t\t     ");printf("\xba\n");

    printf("\xba"); printf("\t\t     ");printf("\xba\n");

    printf("\xba"); printf("\t\t     ");printf("\xba\n");

    printf("\xba"); printf("\t\t     ");printf("\xba\n");

    printf("\xba"); printf("\t\t     ");printf("\xba\n");

    printf("\xba"); printf("\t\t     ");printf("\xba\n");

    printf("\xba"); printf("\t\t     ");printf("\xba\n");

    printf("\xba"); printf("\t\t     ");printf("\xba\n");

    printf("\xba"); printf("\t\t     ");printf("\xba\n");

      printf("\xc8\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xBC\n"); 
 

    GotoXY(40,0);printf("\xc9\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xBB\n");

    GotoXY(40,1);printf("\xba"); printf("\t\t       ");printf("\xba\n");

    GotoXY(40,2);printf("\xba"); printf("\t\t       ");printf("\xba\n");

    GotoXY(40,3);printf("\xba"); printf("\t\t       ");printf("\xba\n");

    GotoXY(40,4);printf("\xba"); printf("\t\t       ");printf("\xba\n");

    GotoXY(40,5);printf("\xba"); printf("\t\t       ");printf("\xba\n");

    GotoXY(40,6);printf("\xba"); printf("\t\t       ");printf("\xba\n");

    GotoXY(40,7);printf("\xba"); printf("\t\t       ");printf("\xba\n");

    GotoXY(40,8);printf("\xba"); printf("\t\t       ");printf("\xba\n");

    GotoXY(40,9);printf("\xba"); printf("\t\t       ");printf("\xba\n");

    GotoXY(40,10);printf("\xba"); printf("\t\t       ");printf("\xba\n");

    GotoXY(40,11);printf("\xba"); printf("\t\t       ");printf("\xba\n");

    GotoXY(40,12);printf("\xba"); printf("\t\t       ");printf("\xba\n");

    GotoXY(40,13);printf("\xba"); printf("\t\t       ");printf("\xba\n");

    GotoXY(40,14);printf("\xba"); printf("\t\t       ");printf("\xba\n");

    GotoXY(40,15);printf("\xba"); printf("\t\t       ");printf("\xba\n");

    GotoXY(40,16);printf("\xba"); printf("\t\t       ");printf("\xba\n");

    GotoXY(40,17);printf("\xba"); printf("\t\t       ");printf("\xba\n");

    GotoXY(40,18);printf("\xba"); printf("\t\t       ");printf("\xba\n");

    GotoXY(40,19);printf("\xba"); printf("\t\t       ");printf("\xba\n");

    GotoXY(40,20);printf("\xba"); printf("\t\t       ");printf("\xba\n");

      GotoXY(40,21);printf("\xc8\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xBC\n"); 

    for (i=0,x=1;i<10,x<21;i++,x=x+2)

            for (j=0,y=1;j<10,y<21;j++,y=y+2) 

              {

                    GotoXY(x,y);if (pole[i][j]==0) {if((j+i)%2!=0) {SetColor(0,1);printf ("  ");} else{SetColor(0,9);printf ("  ");}}else  { SetColor(0,14);printf ("  ");}

                    GotoXY(x,y+1);if (pole[i][j]==0) { if((j+i)%2!=0) {SetColor(0,1);printf ("  ");} else{SetColor(0,9);printf ("  ");}}else {  SetColor(0,14);printf ("  ");}

              } 
 

      return 0;

}

*/

int ras(int mypole[10][10])

{

      system ("cls");

      int i,j,x,y,u,f,e,w,nap,ui;

      SetColor(15,0);

      printf("\xc9\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xBB\n");

    printf("\xba"); printf("\t\t     ");printf("\xba\n");

    printf("\xba"); printf("\t\t     ");printf("\xba\n");

    printf("\xba"); printf("\t\t     ");printf("\xba\n");

    printf("\xba"); printf("\t\t     ");printf("\xba\n");

    printf("\xba"); printf("\t\t     ");printf("\xba\n");

    printf("\xba"); printf("\t\t     ");printf("\xba\n");

    printf("\xba"); printf("\t\t     ");printf("\xba\n");

    printf("\xba"); printf("\t\t     ");printf("\xba\n");

    printf("\xba"); printf("\t\t     ");printf("\xba\n");

    printf("\xba"); printf("\t\t     ");printf("\xba\n");

Разработка программного обеспечения для компьютерной игры "Морской Бой"