Реализация игры "Морской бой"

Автор работы: Пользователь скрыл имя, 08 Июня 2014 в 14:18, курсовая работа

Краткое описание

Цель этой курсовой работы – детально рассмотреть этапы написания игровой программы с использованием языка программирования C# и языка разметки XAML.
Поставленная цель подразумевает решение следующих задач:
Изучение Microsoft Visual Studio, WPF, XAML;
Написание программы, моделирующей игру «Морской бой»;
Научится пользоваться анимацией
Разработка приложения, с графическим редактором.

Прикрепленные файлы: 1 файл

Курсовая работа.doc

— 3.48 Мб (Скачать документ)

       Все кнопки  поддерживают клавиши доступа, которые  работают подобно мнемоническим  командам в элементе управления Label. Для обозначения клавиши доступа служит символ подчеркивания. Когда пользователь нажмет клавишу <Alt> и клавишу доступа, возникнет событие Click данной кнопки.

Простейшим элементом управления содержимым является Label — метка. Как и любой другой элемент управления содержимым, она принимает одиночную порцию содержимого, которая размещается внутри нее. Отличительной чертой элемента Label является его поддержка мнемонических команд — нажатий клавиш, которые передают фокус соответствующему элементу управления.Для поддержки этой функции в элементе Label добавлено свойство Target[2].

2.2. Разработка программной части приложения

При написании приложение «Морской бой» необходимо было использовать анимацию, ниже представлена листинг 1, на котором показана прорисовка одновременно двух диагоналей, при попадание в корабль противника.

DoubleAnimation animation = new DoubleAnimation();

animation.From = 0;

animation.To = 3;

animation.Duration = TimeSpan.FromSeconds(2);

Line k1 = new Line();

k1.X1 = (x*40) ;

k1.X2 = (x*40) +40;

k1.Y1 = (y*40) ;

k1.Y2 = (y*40) + 40;

k1.Stroke = Brushes.Red;

k1.StrokeThickness = 2;

k1.BeginAnimation(Line.StrokeThicknessProperty, animation);

pole_c.Children.Add(k1);

 

Line k2 = new Line();

k2.X1 = x*40;

k2.X2 = (x*40)+40;

k2.Y1 = (y*40) + 40;

k2.Y2 = y*40 ;

k2.Stroke = Brushes.Red;

k2.StrokeThickness = 2;

k2.BeginAnimation(Line.StrokeThicknessProperty, animation);

pole_c.Children.Add(k2);

Листинг 1. Прорисовка крестика при попадание в корабль противника

Анимация DoubleAnimation используется для создания анимации любых свойств типа double. Основными  свойствами данного типа анимации  являются From и To, которые задают начальное и конечное значение анимируемого свойства. Если начальное значение свойства неизвестно, то можно воспользоваться еще одним свойством — By, которое позволяет задать относительное значение для анимируемого свойства[4].

Все события кнопок мыши предоставляют объект MouseButtonEventArgs. Класс MouseButtonEventArgs порожден от класса MouseEventArgs (а это означает, что он содержит ту же информацию о координатах и состоянии кнопки) и добавляет несколько новых членов. Менее важными свойствами являются MouseButton (сообщает о том, какая кнопка сгенерировала событие) и ButtonState (сообщает, была ли кнопка в момент возникновения события нажата или отпущена).  Ниже в листинге, данный класс используется для определения выбранной ячейки, по нажатию клавиши[3].

private void pole_c_MouseUp(object sender, MouseButtonEventArgs e)

{

         

int b = 0;

           

Point pt = e.GetPosition(this);

int x=Convert.ToInt32(pt.X), y=Convert.ToInt32(pt.Y);

int x_k = 0, y_k = 0;

          

x = (x - 560) / 40;

y = (y - 40) / 40;

 

x_k = -360 +x*80;

                                                         y_k = -360+ y*80;

Листинг 2. Класс MouseButtonEventArgs

В данной игре «Морской бой»,  противником является – компьютер. Его стрельба описывается при помощи класса Random. Random представляет генератор псевдослучайных чисел - устройство, которое выдает последовательность чисел, отвечающую определенным статистическим критериям случайности. Ниже представлен листинг использования данного класса[1].

start:

Random rnd = new Random();

 

int res_x = rnd.Next(0, 9);

int res_y = rnd.Next(0, 9);

 

 

if (array[res_x, res_y] != 0)

{

if (array[res_x, res_y] == 5) MessageBox.Show("Компьютер попал в открытое поле\n Ваш ход!");

 else

{

array[res_x, res_y] = 5;

krest(res_x, res_y);

hod_c++;

goto start;

                              }

 

Листинг 3. Класс Random

 

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

 

 

В данной главе будет  поэтапно рассмотрена работа программы.

Рис.3.1. Начальное окно программы.

При запуске программы появляется форма (рис.3.1), на которой предлагается расставить корабли, начиная с «подлодок» («однопалубные») и заканчивая «линкором» («четырехпалубный»). По умолчанию стоит горизонтальная расстановка, при необходимости игрок может выбрать положение «вертикально», расположенное с лева от поля игрока,  рис.3.2.

Рис.3.2. Выбор вертикального положения корабля.

Рис.3.3. Выход за пределы поля

В случаи размещения корабля вне поля, на экране появляется сообщение: «Выход за пределы поля».

После растравления кораблей и при нажатии кнопки «Начать игру»,  справа появляется поле компьютера.

Рис.3.4. Открытие при помощи анимации окна компьютера

Рис.3.5. Победа игрока

При 20 попаданий в корабли, появляется сообщение: «Поздравляем! Победил игрок!»

 

ЗАКЛЮЧЕНИЕ

 

 

В ходе выполнения курсовой работы были изучены языки программирования С# и XAML, технология  WPF, а так же среда разработки MS Visual Studio. Развиты навыки работы с WPF технологией, была изучена теория о работе с анимацией. В качестве среды разработки использовал Microsoft Visual Studio 2012.

Результатом выполнения поставленной цели и задач являлось реализация WPF программы, моделирующая игру «Морской бой». При выполнении WPF-приложения поставленные цели и задачи были выполнены.

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

Эта игра может быть использована в качестве развлекательного приложения, имеющего анимацию. 

 

СПИСОК ИСПОЛЬЗУЕМОЙ ЛИТЕРАТУРЫ

  1. http://msdn.microsoft.com
  2. http://do.gendocs.ru
  3. http://src-code.net
  4. http://ru.wikipedia.org

5.Метью Мак-Дональд  WPF в .NET 4 с примерами на c# / Метью Мак-Дональд.- 2-е изд., перераб. и доп.- М.: “Вильямс”, 2011.- 1024 с.

 

 

 

 

 

 

 

ПРИЛОЖЕНИЕ

MainWindow.xaml.cs

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

using System.Windows;

using System.Windows.Controls;

using System.Windows.Data;

using System.Windows.Documents;

using System.Windows.Input;

using System.Windows.Media;

using System.Windows.Media.Imaging;

using System.Windows.Media.Animation;

using System.Windows.Navigation;

using System.Windows.Shapes;

using System.Drawing;

using System.Threading;

 

 

namespace WpfApplication1

{

    /// <summary>

    /// Логика взаимодействия для MainWindow.xaml

    /// </summary>

 

    public partial class MainWindow : Window

    {

        int[,] array = new int[10, 10];//создание массив для кораблей игрока

       // int[,] array_p = new int[10, 10] { { 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 2, 0, 0, 0, 0, 0 }, { 0, 0, 1, 0, 2, 0, 3, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 3, 0, 0, 0 }, { 1, 0, 0, 0, 0, 0, 3, 0, 4, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 4, 0 }, { 0, 0, 1, 0, 0, 0, 0, 0, 4, 0 }, { 0, 0, 0, 0, 2, 2, 0, 0, 4, 0 }, { 2, 2, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0,0,0,3,3,3,0,0,0,0 } };//массив кораблей проивника

        int[,] array_p = new int[10, 10];//массив кораблей компьютера

       

        int hod = 0;//для счета кораблей

        int hod_c = 0;//для счета кораблей компьютера

        //построение полей

        int win_i = 0;

        int win_c = 0;

        int a = 1;//для постройки кораблей

 

         //обнуление массива

        public void obnul()

        {

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

            {

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

                {

                    array[i, j] = 0;

                }

            }

        }

 

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

        public void setka()

        {

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

            {

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

                Line y = new Line();

                y.X1 = i * 40;

                y.X2 = i * 40;

                y.Y1 = 0;

                y.Y2 = 400;

                y.Stroke = Brushes.Gray;

                pole_i.Children.Add(y);

 

                Line x = new Line();

                x.X1 = 0;

                x.X2 = 400;

                x.Y1 = i * 40;

                x.Y2 = i * 40;

                x.Stroke = Brushes.Gray;

                pole_i.Children.Add(x);

               

                //строит горизонтальные линии на поле компьютера

                Line y_с = new Line();

                y_с.X1 = i * 40;

                y_с.X2 = i * 40;

                y_с.Y1 = 0;

                y_с.Y2 = 400;

                y_с.Stroke = Brushes.Black;

                pole_c.Children.Add(y_с);

 

 

                Line x_с = new Line();

                x_с.X1 = 0;

                x_с.X2 = 400;

                x_с.Y1 = i * 40;

                x_с.Y2 = i * 40;

                x_с.Stroke = Brushes.Black;

                pole_c.Children.Add(x_с);

            }

        }

 

        //игровой массив, где указанны координаты точки и значение точки(0,1,2,3,4 - в зависимости от наличия и типа корабля)

        public int game_zone(int x, int y, int a)

        {

           

            array[x, y] = a;

           

            return a;

        }

 

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

        public void array_prot()

        {

            //int k = 0;

            int b = 1;

            int res_x = 0;

            int res_y = 0;

            int res_vert = 0;

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

            {

            povt:

                //MessageBox.Show(Convert.ToString(k++) + Convert.ToString(res_vert) + "\n" + Convert.ToString(res_x) + Convert.ToString(res_y));

                Random rnd = new Random();

                //povt: что бы корабли не выходили за массив

                if (i < 4)

                {

                    res_x = rnd.Next(0, 9);

                    res_y = rnd.Next(0, 9);

                }

                if (i >= 4 && i < 7)

                {

                    res_x = rnd.Next(0, 8);

                    res_y = rnd.Next(0, 8);

                }

                if (i >= 7 && i < 9)

                {

                    res_x = rnd.Next(0, 7);

                    res_y = rnd.Next(0, 7);

                }

                if (i ==9)

                {

                    res_x = rnd.Next(0, 6);

                    res_y = rnd.Next(0, 6);

                }

               

                res_vert = rnd.Next(0, 9);

 

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

                if (prov_p(res_x, res_y, b, res_vert%2) == 0)

                {

                    if (i < 4)

                    {

                        b = 1;

                        array_p[res_x, res_y] = 1;

                    }

                    else

                    {

                        if (i >= 4 && i < 7)

                        {

                            if (res_vert % 2 == 0)

                            {

                                b = 2;

                                array_p[res_x, res_y] = 2;

                                array_p[res_x + 1, res_y] = 2;

                            }

                            else

                            {

                                b = 2;

                                array_p[res_x, res_y] = 2;

                                array_p[res_x, res_y + 1] = 2;

                            }

                        }

                        else

                        {

                            if (i >= 7 && i < 9)

                            {

                                if (res_vert % 2 == 0)

                                {

                                    b = 3;

                                    array_p[res_x, res_y] = 3;

                                    array_p[res_x + 1, res_y] = 3;

                                    array_p[res_x + 2, res_y] = 3;

                                }

                                else

                                {

                                    b = 3;

                                    array_p[res_x, res_y] = 3;

                                    array_p[res_x, res_y + 1] = 3;

                                    array_p[res_x, res_y + 2] = 3;

                                }

                            }

                            else

                            {

                                if (i == 9)

                                {

                                    if (res_vert % 2 == 0)

                                    {

                                        b = 4;

                                        array_p[res_x, res_y] = 4;

                                        array_p[res_x + 1, res_y] = 4;

                                        array_p[res_x + 2, res_y] = 4;

                                        array_p[res_x + 3, res_y] = 4;

                                    }

                                    else

                                    {

                                        b = 4;

                                        array_p[res_x, res_y] = 4;

                                        array_p[res_x, res_y + 1] = 4;

                                        array_p[res_x, res_y + 2] = 4;

                                        array_p[res_x, res_y + 3] = 4;

 

                                    }

                                }

                            }

                        }

                    }

                }

                else { goto povt;}

            }

        }

       

        //для рисования крестика

        public void krest(int x, int y)

        {

            //анимация

            DoubleAnimation animation = new DoubleAnimation();

            animation.From = 0;

            animation.To = 3;

            animation.Duration = TimeSpan.FromSeconds(2);

 

            Line k1 = new Line();

            k1.X1 = (x*40) ;

            k1.X2 = (x*40) +40;

            k1.Y1 = (y*40) ;

            k1.Y2 = (y*40) + 40;

            k1.Stroke = Brushes.Red;

Информация о работе Реализация игры "Морской бой"