Розробка програмного додатку "Гра Пінг-Понг"
Розробка ігрового додатку за технологією IDE Visual Studio та WPF. Опис вхідної та вихідної інформації. Назва та призначення модулів програми. Основні поля класу, необхідні для ігрової логіки. Блок-схема алгоритму гри. Інструкція з експлуатації системи.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | курсовая работа |
Язык | украинский |
Дата добавления | 02.06.2015 |
Размер файла | 1,3 M |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Размещено на http://www.allbest.ru/
Размещено на http://www.allbest.ru/
ЗМІСТ
ВСТУП
РОЗДІЛ 1. АНАЛІТИЧНА ЧАСТИНА
1.1 Постановка задачі
1.2 Аналіз задачі
1.3 Вибір методів та засобів розв'язання задачі
РОЗДІЛ 2. ПРОЕКТНА ЧАСТИНА
2.1 Опис вхідної та вихідної інформації або повідомлень
2.2 Опис алгоритму розв'язування задачі
2.3 Програма розв'язання задачі та її опис
2.4 Інструкція з експлуатації системи
ВИСНОВКИ
СПИСОК ВИКОРИСТАНОЇ ЛІТЕРАТУРИ
ДОДАТОК А
ВСТУП
Розвиток цивілізації у нашому столітті неодмінно йде у парі з розвитком різноманітних технологій, зокрема комп'ютерних. Комп'ютерний ринок постійно наповнюється новими, досконалішими програмами, збільшується швидкість процесорів, об'єм носіїв збереження пам'яті. У цій технологічній боротьбі не останнє місце займає явище, яке виникло разом з комп'ютерами, а саме, комп'ютерні ігри.
У наш час, хоч люди і стали більш заклопотанними, але час на розваги вони завжди знаходять. Хтось обирає активний відпочинок (подорожування, спортивні ігри, квести), а хтось віддає перевагу більш пасивному відпочинку, до ряду яких можна зарахувати не лише перегляд фільмів, але і комп'ютерні ігри.
В Україні щороку зростає кількість людей, що купують такі ігри. Якщо для гравців це просто забавка, та можливість відпочинку, то для розробників, виробників та розповсюджувачів -- ціла сфера роботи.
Зараз широкої популярності набувать казуальні та браузерні ігри - комп'ютерні ігри, призначені для широкого кола користувачів. В такі ігри грають від випадку до випадку, мимохідь. Вони не потребують потужних комп'ютерів та, як правило, не мають складних правил. Багато подібних ігор мають також яскраву привабливу графіку і мінімум тексту, що робить їх популярними серед користувачів ПК.
РОЗДІЛ 1. АНАЛІТИЧНА ЧАСТИНА
1.1 Постановка задачі
Використовуючи довільну мову та середовище програмування розробити програмний додаток-гру «Пінг-понг».
Суть гри полягає в перекидуванні м'ячика між двома ігроками, які відбивають його за допомогою ракеток. Програма повинна перевіряти, чи відбив гравець м'яч та повідомляти користувача про результати гри.
Предмет розробки - програмний додаток-гра «Пінг-понг».
Структура проекту:
· Модуль, що відображає головне меню гри;
· Модуль, що відображає введення імен ігреків;
· Модуль, що відображає ігрове поле;
· Модуль, що відображає результати гри;
· Модуль, що відображає налаштування гри;
· Модуль, що відображає справку користувача;
· Модуль, що відображає турнірну таблицю;
Вхідні дані:
· імена ігроків;
· результати попередніх ігор;
· налаштування швидкості ракеток та м'яча, обмеження очок гри;
Вихідні данні:
· кількість «забитих» м'ячів кожним ігроком (ігрові очки);
· імена ігроків;
· кінцевий результат гри;
Інтерфейс програми повинен містити наступні елементи: головне меню, форма з інформацією про розробника, турнірна таблиця (таблиця результатів).
Програма повинна дозволяти змінювати налаштування гри - швидкість польоту м'ячика та швидкіть пересування ракеток, а також обмеження в кінцевому рахунку гри.
Під час гри програма повинна дозволяти:
· вводити ім'я ігроків;
· зберігати результати гри у файлі;
· зчитувати результати гри із файлу;
· сортувати результати гри по найліпшим результатам;
1.2 Аналіз задачі
Аналіз предметної області гри «Пінг-понг» показав, що основною проблемою є реалізація польоту м'ячика та його реалістичне відбивання від ігрового поля та ракеток ігроків, а також розробка такого інтерфейсу, який зміг би успішно конкурувати зі схожими іграми.
Для рішення проблеми була обрана робота з таймером та зміна напряму польоту м'яча за допомогою векторів.
Серед аналогів були проаналізовані такі ігри: 2D Ping Pong, Легенды Пинг Понга, Table Tennis Angry Birds, Настольный теннис 2D.
1.3 Вибір методів та засобів розв'язання задачі
Для написання ігрового додатку «Пінг-понг» була обрана IDE Visual Studio 2012 (технологія Windows Presentation Foundation), яка орієнтована на розробку привабливого та зручного графічного інтерфейсу.
Visual Studio - це повний набір інструментів і служб для створення різних додатків як для платформи Microsoft, так і для інших платформ. Можна працювати більш гнучко, практично, де завгодно, незалежно від використовуваного засобу розробки. Visual Studio 2012 - це передове рішення для розробки, що дозволяє командам будь-якого розміру проектувати і створювати привабливі програми, які задовольнять найвимогливіші вимоги замовників.
Windows Presentation Foundation (WPF) - система для побудови клієнтських додатків Windows з візуально привабливими можливостями взаємодії з користувачем, графічна (презентаційна) підсистема в складі .NET Framework (починаючи з версії 3.0), що використовує мову XAML.
.NET Framework - програмна платформа, випущена компанією Microsoft в 2002 році. Основою платформи є загальномовне середовище виконання Common Language Runtime (CLR), яка підходить для різних мов програмування. Функціональні можливості CLR доступні у будь-яких мовах програмування, що використовують це середовище. Програма для .NET Framework, написана на будь-якій підтримуваній мові програмування, спочатку переводиться компілятором в єдиний для .NET проміжний байт-код Common Intermediate Language (CIL) (раніше називався Microsoft Intermediate Language, MSIL). У термінах .NET виходить складання, англ. assembly. Потім код або виконується віртуальною машиною Common Language Runtime (CLR), або транслюється утилітою NGen.exe у виконуваний код для конкретного цільового процесора. Використання віртуальної машини переважне, оскільки позбавляє розробників від необхідності піклуватися про особливості апаратної частини.
РОЗДІЛ 2. ПРОЕКТНА ЧАСТИНА
2.1 Опис вхідної та вихідної інформації або повідомлень
Вхідні дані програми наведено в таблиці 2.1
Таблиця 2.1
Вхідні дані
Дані |
Тип |
Опис |
|
1 |
2 |
3 |
|
Ім'я ігрока |
Текстовий |
Вводиться у спеціальному вікні перед початком гри |
|
Результати попередніх ігор |
Текстовий, Числовий |
Зчитується з xml файлу |
|
Швидкість ракеток |
Числовий |
Задається в модулі «Настройки» |
|
Швидкість м'яча |
Числовий |
Задається в модулі «Настройки» |
|
Обмеження очок |
Числовий |
Задається в модулі «Настройки» |
Вихідні дані наведено в таблиці 2.2
Таблиця 2.2
Вихідні дані
Дані |
Тип |
Опис |
|
1 |
2 |
3 |
|
Очки |
Числовий |
Виводиться після завершення гри для кожного ігрока |
|
Імена ігроків |
Числовий |
Виводяться в кінці гри, записуються у файл |
|
Результат гри |
Логічний |
Виводиться в кінці гри |
2.2 Опис алгоритму розв'язування задачі
Алгоритм програми був розроблений у вигляді блок-схеми та наведений у додатку А.
2.3 Програма розв'язання задачі та її опис
Програма складається з 12 модулів, назва та призначення яких наведено у таблиці 2.3
Таблиця 2.3
Модулі програми
Назва модуля |
Призначення |
|
1 |
2 |
|
Ball.cs |
Класс, який містить основні поля для роботи з пересуваням м'яча |
|
Pad.cs |
Класс, який містить основні поля для роботи з пересуваням ракеток |
|
GameResult.cs |
Класс, який використовується для створення результата гри. |
|
mySerializer.cs |
Класс, який використовується для запису та зчитування данних з файлу |
|
SetttingsStaticClass.cs |
Класс, який використовується для роботи з налаштуваннями гри (швидкість ракетки тощо) |
|
MainMenu.xaml |
Головне меню гри |
|
About.xaml |
Справка користувача |
|
MainWindow.xaml |
Головне вікно гри, яке містить ігрове поле, меню паузи, імена та рахунок ігроків |
|
Names.xaml |
Вікно введення імен ігроків |
|
Results.xaml |
Вікно результатів гри. Містить рахунок, імена ігроків, турнірну таблицю |
|
Settings.xaml |
Вікно налаштувань |
|
TheTable.xaml |
Вікно турнірної таблиці. Містить результати попередніх ігор |
Розробка за технологією WPF дозволяє розробити привабливий та зручний UI. Для цього необхідно додати елементи керування за допомогою конструктора форм, чи відредагувати ХAML файл.
На вікні головного меню (Рис. 2.1) розташовані елементи Button, які дозволяють користувачу розпочати гру, переглянути таблицю результатів, змінити налаштування тощо.
Рисунок 2.1 Вікно MainMenu
Код XAML:
<Window x:Class="PongGame.MainMenu"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Пинг-понг" Height="503" Width="824" ResizeMode="NoResize" MouseEnter="Window_MouseEnter_1" WindowStartupLocation="CenterScreen" Cursor="Hand" Icon="D:\Флешка 12.11\1Курсовая работа C# WPF\wpf\Pong 2\PongGame\Textures\ball3.png">
<Grid>
<Grid.Background>
<LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
<GradientStop Color="#FF872EA8" Offset="0"/>
<GradientStop Color="#FF698BFF" Offset="1"/>
</LinearGradientBrush>
</Grid.Background>
<Grid.ColumnDefinitions>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<Button x:Name="btnNewGame" Content="НОВАЯ ИГРА" HorizontalAlignment="Left" Margin="180,126,0,0" VerticalAlignment="Top" Width="460" Height="43" FontSize="18" FontWeight="Normal" FontStyle="Italic" IsCancel="True" Click="Button_Click_1">
<Button.Background>
<LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
<GradientStop Color="#FFFBFCFF" Offset="0"/>
<GradientStop Color="#FF8AAFFF" Offset="1"/>
</LinearGradientBrush>
</Button.Background>
</Button>
<Button x:Name="btnTable" Content="ТУРНИРНАЯ ТАБЛИЦА" HorizontalAlignment="Left" Margin="180,201,0,0" VerticalAlignment="Top" Width="460" Height="40" Click="btnTable_Click" FontWeight="Normal" FontStyle="Italic" FontSize="18">
<Button.Background>
<LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
<GradientStop Color="#FFFBFCFF" Offset="0"/>
<GradientStop Color="#FF8AAFFF" Offset="1"/>
</LinearGradientBrush>
</Button.Background>
</Button>
<Button Content="НАСТРОЙКИ" HorizontalAlignment="Left" Margin="180,268,0,0" VerticalAlignment="Top" Width="460" Height="40" FontStyle="Italic" FontWeight="Normal" FontSize="18" Click="Button_Click_2">
<Button.Background>
<LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
<GradientStop Color="#FFFBFCFF" Offset="0"/>
<GradientStop Color="#FF8AAFFF" Offset="1"/>
</LinearGradientBrush>
</Button.Background>
</Button>
<Button Content="СПРАВКА" HorizontalAlignment="Left" Margin="180,337,0,0" VerticalAlignment="Top" Width="460" Height="37" FontStyle="Italic" FontWeight="Normal" FontSize="18" Click="Button_Click_3">
<Button.Background>
<LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
<GradientStop Color="#FFFBFCFF" Offset="0"/>
<GradientStop Color="#FF8AAFFF" Offset="1"/>
</LinearGradientBrush>
</Button.Background>
</Button>
<Button Content="ВЫХОД" HorizontalAlignment="Left" Margin="180,402,0,0" VerticalAlignment="Top" Width="460" Height="41" FontStyle="Italic" FontWeight="Normal" FontSize="18" Click="Button_Click_4">
<Button.Background>
<LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
<GradientStop Color="#FFFBFCFF" Offset="0"/>
<GradientStop Color="#FF8AAFFF" Offset="1"/>
</LinearGradientBrush>
</Button.Background>
</Button>
<Rectangle HorizontalAlignment="Left" Height="81" Margin="149,24,0,0" VerticalAlignment="Top" Width="507">
<Rectangle.Fill>
<ImageBrush ImageSource="/PongGame;component/Textures/menu.png"/>
</Rectangle.Fill>
</Rectangle>
</Grid>
</Window>
Лістинг коду, який виконує основні операції у вікні головного меню наведений нижче:
Обробник кнопки «Новая игра», який розпочинає нову гру:
private void Button_Click_1(object sender, RoutedEventArgs e)
{
new Names().Show();
this.Close();
}
Обробник кнопки «Турнирная таблица», який відкриває результати:
private void btnTable_Click(object sender, RoutedEventArgs e)
{
new TheTable().Show();
}
Обробник кнопки «Настройки», який відкриває меню налаштувань:
private void Button_Click_2(object sender, RoutedEventArgs e)
{ new Settings().Show();}
Обробник кнопки «Справка»:
private void Button_Click_3(object sender, RoutedEventArgs e)
{
new About().Show();
}
Обробник кнопки «Выход»:
private void Button_Click_4(object sender, RoutedEventArgs e)
{ this.Close();}
Вікно «Никнеймы» (Рис. 2.2) передбачено для введення імен ігроків.
Рисунок 2.2 Вікно Names
Код XAML:
<Window x:Class="PongGame.Names"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Никнеймы" Height="237.5" Width="440.625" Topmost="True" ResizeMode="NoResize" WindowStartupLocation="CenterScreen">
<Window.Background>
<LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
<GradientStop Color="#FFBCEDFF" Offset="0"/>
<GradientStop Color="White" Offset="1"/>
</LinearGradientBrush>
</Window.Background>
<Grid Height="212" VerticalAlignment="Top" Margin="0,0,0,-2">
<Grid.Background>
<LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
<GradientStop Color="#FF698BFF" Offset="0"/>
<GradientStop Color="#FFE0F4FF" Offset="1"/>
</LinearGradientBrush>
</Grid.Background>
<Label Content="Введите никнеймы игроков:" HorizontalAlignment="Left" VerticalAlignment="Top" Margin="75,10,0,0" FontSize="22" FontStyle="Italic"/>
<TextBox x:Name="txtPlayer1" HorizontalAlignment="Left" Height="23" Margin="37,73,0,0" TextWrapping="Wrap" Text=""Имя игрока №1"" VerticalAlignment="Top" Width="160" FontStyle="Italic" TextDecorations="{x:Null}" AcceptsTab="True" TouchDown="txtPlayer1_TouchDown" MouseDown="txtPlayer1_MouseDown" GotFocus="txtPlayer1_GotFocus"/>
<TextBox x:Name="txtPlayer2" HorizontalAlignment="Left" Height="23" Margin="234,73,0,0" TextWrapping="Wrap" Text=""Имя игрока №2"" VerticalAlignment="Top" Width="160" FontStyle="Italic" TextDecorations="{x:Null}" AcceptsTab="True" GotFocus="txtPlayer2_GotFocus"/>
<Button Content="Играть!" HorizontalAlignment="Left" Margin="136,120,0,0" VerticalAlignment="Top" Width="157" Height="34" Click="Button_Click_1"/>
<Button Content="Назад" HorizontalAlignment="Left" Height="24" Margin="165,169,0,0" VerticalAlignment="Top" Width="105" Click="Button_Click_2"/>
</Grid>
</Window>
Обробник кнопки, який запускає гру:
private void Button_Click_1(object sender, RoutedEventArgs e)
{
if ((txtPlayer1.Text.Equals(string.Empty)) || (txtPlayer2.Text.Equals(string.Empty)) || (txtPlayer1.Text.Equals("Имя игрока №1")) || (txtPlayer2.Text.Equals("Имя игрока №2")))
MessageBox.Show("Ошибка при заполнении ников игроков!");
else{new MainWindow(txtPlayer1.Text, txtPlayer2.Text).Show();
this.Close();
} }
Вікно «Игровое поле» (Рис. 2.3) передбачено для процесу гри.
Рисунок 2.3 Вікно «Игровое поле»
Код XAML:
<Window x:Name="Window1" x:Class="PongGame.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:system="clr-namespace:System;assembly=System"
KeyDown="MainWindow_OnKeyDown"
Title="Игровое поле" Height="559.667" Width="817.333" ResizeMode="NoResize" Loaded="Window_Loaded_1" WindowStartupLocation="CenterScreen">
<!--Игровое поле -->
<Grid>
<Canvas Name="MainCanvas" Margin="-3,49,0,0" HorizontalAlignment="Left" Width="804" Panel.ZIndex="1">
<Canvas.Background>
<ImageBrush ImageSource="/PongGame;component/Textures/main_img.png"/>
</Canvas.Background>
<!--Левая ракетка -->
<!-- Canvas.Top - Возвращает или задает значение, представляющее расстояние между верхней частью элемента и верхней частью родительского элемента Canvas. -->
<Rectangle Height="80" Width="20"
Canvas.Top="{Binding YPosition}"
Name="LeftPad">
<Rectangle.Fill>
<RadialGradientBrush>
<GradientStop Color="#FF2D35FF" Offset="0"/>
<GradientStop Color="#FF0007AC" Offset="1"/>
</RadialGradientBrush>
</Rectangle.Fill>
</Rectangle>
<!--Правая ракетка -->
<Rectangle
Height="80" Width="20"
Canvas.Top="{Binding YPosition}"
Canvas.Left="780"
Name="RightPad">
<Rectangle.Fill>
<RadialGradientBrush>
<GradientStop Color="#FFFF3232" Offset="0"/>
<GradientStop Color="#FFB90000" Offset="1"/>
</RadialGradientBrush>
</Rectangle.Fill>
</Rectangle>
<!--Линия-разделитель по средине -->
<Line X1="400" X2="400" Y2="500" Y1="0" StrokeThickness="2" Stroke="#FFDBB062"></Line>
<!--Шарик -->
<!--Canvas.Left расстояние между левой стороной канвы по X
DataContext Возвращает или задает контекст данных для элемента, если он будет участвовать в привязке данных.
-->
<Ellipse Width="20" Height="20"
Canvas.Left="{Binding X}"
Canvas.Top="{Binding Y}"
Name="Ball"
DataContext="{Binding Path=ball}"
StrokeThickness="0.1"
Fill="#FFF84949">
</Ellipse>
<!--
<Label Canvas.Left="630" Canvas.Top="34" Content="{Binding Y}" Height="28" Name="label1" />
<Label Canvas.Left="565" Canvas.Top="34" Content="Y of ball" Height="28" Name="label2" />
<Label Canvas.Left="535" Canvas.Top="68" Content="Y of right pad" Height="28" Name="label3" />
<Label Canvas.Left="630" Canvas.Top="68" Content="{Binding YPosition}" Height="28" Name="label4" />
<Label Canvas.Left="184" Canvas.Top="34" Content="{Binding X}" Height="28" Name="label6" />
<Label Canvas.Left="119" Canvas.Top="34" Content="X of ball" Height="28" Name="label7" />
<Label Canvas.Left="89" Canvas.Top="68" Content="X of right pad" Height="28" Name="label8" />
<Label Canvas.Left="184" Canvas.Top="68" Content="{Binding YPosition}" Height="28" Name="label9" />-->
<!--значение true\false для MovingRight -->
<!-- <Label Canvas.Left="638" Canvas.Top="128" Content="{Binding MovingRight}" Height="28" Name="label5" /> -->
<!--Левый счётчик-->
<Label Content="{Binding LeftResult}" HorizontalContentAlignment="Center" Height="41" Name="label10"
FontSize="20" Foreground="Blue" Background="#FFCDDDFF" Width="42" Canvas.Left="345" Canvas.Top="-48" Panel.ZIndex="10"/>
<!-- Правый счётчик-->
<Label Content="{Binding RightResult}" HorizontalContentAlignment="Center" Height="42" Name="label11"
FontSize="20" Foreground="Brown" Background="#FFFF8484" Width="42" Canvas.Left="416" Canvas.Top="-48" Panel.ZIndex="10"/>
<TextBox Name="score1" Height="41" TextWrapping="Wrap" Text="" Canvas.Top="-48" Width="auto" Canvas.Left="10" Panel.ZIndex="10"/>
<TextBox Name="score2" Height="41" Canvas.Right="10" TextWrapping="Wrap" Text="" Canvas.Top="-48" Width="auto" Panel.ZIndex="10"/>
<StackPanel x:Name="PauseMenuPanel" Height="242" Canvas.Left="180" Canvas.Top="49" Width="442" Background="#FFD6D6D6" Opacity="0.8">
<Button x:Name="btnContinue" Content="Продолжить" Margin="100,50,100,0" Opacity="1.5" Panel.ZIndex="10" Click="btnContinue_Click" Height="25"/>
<Button Content="Настройки" HorizontalAlignment="Left" Height="25" Margin="100,20,0,0" Width="242" Click="Button_Click_1"/>
<Button Content="Правила игры" HorizontalAlignment="Left" Height="25" Margin="100,20,0,0" Width="242" Click="Button_Click_3"/>
<Button Content="Выход в главное меню" HorizontalAlignment="Left" Height="25" Margin="100,23,0,0" Width="242" Click="Button_Click_2"/>
<Label Content="Пауза" HorizontalAlignment="Left" Height="28" Margin="189,-373,0,0" Width="74" FontSize="20" FontStyle="Italic" Foreground="#FF000AE6"/>
</StackPanel>
</Canvas>
<Label x:Name="lblEndScore" Content="Label" HorizontalAlignment="Left" Height="24" Margin="525,10,0,0" VerticalAlignment="Top" Width="99" Visibility="Hidden"/>
<Rectangle HorizontalAlignment="Left" Height="44" VerticalAlignment="Top" Width="811">
<Rectangle.Fill>
<LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
<GradientStop Color="#FFA5BAFF" Offset="0"/>
<GradientStop Color="White" Offset="1"/>
</LinearGradientBrush>
</Rectangle.Fill>
</Rectangle>
</Grid>
</Window>
Це вікно є головним вікном гри, яке містить всю основну логіку. Основні поля класу, необхідні для ігрової логіки:
public DispatcherTimer timer = new DispatcherTimer(); //таймер
private double _angle = 155; //угол отбиения шара
private double SpeedOfBall = 5; //скорость шарика
private int SpeedOfPad = 5; //скорость ракеток
private const int RightBorder = 790; // правая граница
private const int LeftBorder = 5; //левая граница
//начальная позиция для шарика по иксу (слева)
private const int BeginPosForBall_X1 = 20;
// начальная позиция для шарика по иксу (справа)
private const int BeginPosForBall_X2 = 760;
// начальная позиция для шарика по Y
private const int BeginPosForBall_Y = 105;
// переменная для отслеживания запущен ли мячик (в полёте), чтобы не было сдвига при управлении ракетками
private bool _IsEnabled = false;
//какой противник подаёт (поочереди)
private bool Podacha = false;
//переменная для отслеживания на какой ракетке находится шарик (чтобы при сдвиге только одной ракетки двигался шарик)
private bool leftActive = true;
//число, при котором игра заканчивается
private int gameEndScore = 12;
public string leftPlayerName = string.Empty;
public string rightPlayerName = string.Empty;
string img_ball_path = @"..\..\Textures\ball3.png";
//Если объявление поля содержит модификатор readonly,
//присвоение значений таким полям может происходить только как часть объявления или в конструкторе в том же классе.
readonly Ball _ball = new Ball //создание обьекта шарика
{
X = BeginPosForBall_X1, //начальные координаты по X
Y = BeginPosForBall_Y, //нач. коорд. по Y
MovingRight = true //движение вправо
};
readonly Pad _leftPad = new Pad //левая ракетка
{
YPosition = 70 //стартовая позиция по Y
};
readonly Pad _rightPad = new Pad //правая ракетка
{
YPosition = 70
};
Гра починається при натисканні кнопки «Пробіл». Обробник старту гри:
private void MainWindow_OnKeyDown(object sender, KeyboardEventArgs e)
{
if (PauseMenuPanel.Visibility == System.Windows.Visibility.Hidden) //Если заткрыто меню паузы тогда проверяем всё по логике работы
{
if (_IsEnabled == false) //запущен ли мячик (в полёте), чтобы не было сдвига при управлении ракетками
{
if (leftActive) // если сейчас управляем левой ракеткой и шарик слева
{
CheckBordersForRockets(true, true); //метод, который создаёт ограничение для ракеток на выход из игрового поля. Значение true указывает на сдвиг мячика
if (Keyboard.IsKeyDown(Key.LeftShift)) //если нажата клавиша W
{
_leftPad.YPosition -= SpeedOfPad; //меняем позицию левой ракетки (координаты) на скорость ракетки
_ball.Y -= SpeedOfPad; //и шарик на скорость ракетки
}
if (Keyboard.IsKeyDown(Key.LeftCtrl))
{
_leftPad.YPosition += SpeedOfPad;
_ball.Y += SpeedOfPad;}}
else // правая сторона активная
{
CheckBordersForRockets(true, false);
if (Keyboard.IsKeyDown(Key.Up))
{
_rightPad.YPosition -= SpeedOfPad;
_ball.Y -= SpeedOfPad;
}
if (Keyboard.IsKeyDown(Key.Down))
{
_rightPad.YPosition += SpeedOfPad;
_ball.Y += SpeedOfPad;
}
}
if (Keyboard.IsKeyDown(Key.Space)) //если пробел
{
_IsEnabled = true; //следующий раз глянет другую ветку ифа, без проверки на сдвиг шарика
timer.Start(); //запускаем таймер
}}
else{
CheckBordersForRockets(false, true); //метод, который создаёт ограничение для ракеток на выход из игрового поля.false - шарик в полёте
CheckBordersForRockets(false, false);
if (Keyboard.IsKeyDown(Key.LeftShift))
_leftPad.YPosition -= SpeedOfPad;
if (Keyboard.IsKeyDown(Key.LeftCtrl))
_leftPad.YPosition += SpeedOfPad;
if (Keyboard.IsKeyDown(Key.Up))
_rightPad.YPosition -= SpeedOfPad;
if (Keyboard.IsKeyDown(Key.Down))
_rightPad.YPosition += SpeedOfPad;
}
if (Keyboard.IsKeyDown(Key.Escape))
{
PauseMenuPanel.Visibility = System.Windows.Visibility.Visible;
timer.Stop();}}
else //если окно паузы открыто, проверяем только клавишу Esc
{if (Keyboard.IsKeyDown(Key.Escape))
{ToClosePauseMenu();}}}
Метод польоту м'ячика, який відбувається за таймером:
void _timer_Tick(object sender, EventArgs e) //при тике таймера
{
if (_ball.Y <= 0) //если положение мячика по Y <=0 то меняем угол (столкновение с нижней гранью)
_angle = _angle + (180 - 2 * _angle);
if (_ball.Y >= MainCanvas.ActualHeight - 20) //если положение по Y мяча >= значению высоты главной канвы - высота мячика (верхняя грань)
_angle = _angle + (180 - 2 * _angle);
if (CheckCollision()) //Если столкновение с одной из ракеток
{
ChangeAngle(); //меняем угол
ChangeDirection(); //меняем направление
}
ChangeBallPoint(); //Изменить координаты шарика
if (_ball.X >= RightBorder) //если мяч коснулся правого края
{
_ball.LeftResult += 1; //Левому игроку +1 очко
GameReset(); //Перезапуск игры
}
if (_ball.X <= LeftBorder) //Коснулся левого края
{
_ball.RightResult += 1; //Правому игроку +1
GameReset();
}
if ((_ball.RightResult == gameEndScore) || (_ball.LeftResult == gameEndScore))
{GameEnd();}}
Метод для перемалювання м'яча:
private void ChangeBallPoint() //перерисовка шарика
{
double radians = (Math.PI / 180) * _angle; //радианы
//Vector - структура. Представляет смещение в двухмерном пространстве.
Vector vector = new Vector
{
X = Math.Sin(radians),
Y = -Math.Cos(radians)
};
//Перерисовка
_ball.X += vector.X * SpeedOfBall;
_ball.Y += vector.Y * SpeedOfBall; }
Метод запуску наступного раунду:
private void GameReset() //Мячик в начальное положение
{
if (!Podacha) //если подача не тру то шарик ставим к правой ракетке
{
leftActive = false; //левая не тру
_ball.Y = _rightPad.YPosition + 25; //ставим координаты шарика
_ball.X = 760;
Podacha = true; // меняем подачу
timer.Stop(); //останавливаем таймер, чтобы можно было двигать ракетку с шариком
_IsEnabled = false; // и тут в не тру, чтобы о
}
else //иначе левая ракетка
{
leftActive = true;
_ball.Y = _leftPad.YPosition+25;
_ball.X = 20;
Podacha =false;
timer.Stop();
_IsEnabled = false;
}}
Методи, необхідні для перевірки зіткнень, зміни вугла та напрямку польоту м'ячика:
private void ChangeAngle() //изменение угла шара
{
if (_ball.MovingRight == true) //если двиг. вправо истина
_angle = 270 - ((_ball.Y + 10) - (_rightPad.YPosition + 40));
else //если влево
_angle = 90 + ((_ball.Y + 10) - (_leftPad.YPosition + 40));}
private void ChangeDirection() //изменение направления
{
if (_ball.MovingRight) // если истина
_ball.MovingRight = false; //устанавливаем false
else //если false
_ball.MovingRight = true; //ставим в true
}
private bool CheckCollision() //проверка коллизий
{bool collisionResult = false; //результат проверки
if (_ball.MovingRight) //если мяч двигается вправо
collisionResult = _ball.X >= 760 && (_ball.Y > _rightPad.YPosition - 20 && _ball.Y < _rightPad.YPosition + 80); //проверка с правой ракеткой
else
collisionResult = _ball.X <= 20 && (_ball.Y > _leftPad.YPosition - 20 && _ball.Y < _leftPad.YPosition + 80); //проверка с левой ракеткой
return collisionResult;}
Вікно «Результати» містить інформацію про результати гри і викликається, якщо один із гравців набере зазначену кількість очків (Рис. 2.4)
Рисунок 2.4 Вікно «Результати», вкладника «Результати»
Код XAML:
<Window x:Class="PongGame.Results"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Результаты!" Height="411.508" Width="643.761" ResizeMode="NoResize" Loaded="Window_Loaded_1" WindowStartupLocation="CenterScreen"> <Grid Margin="0,0,4,7" >
<TabControl>
<TabItem Header="Результаты" Foreground="#FF56009E">
<Grid Height="385" Background="#FF9BC0FF" >
<Label x:Name="lbl2" Content="Победитель:" HorizontalAlignment="Left" Margin="86,235,0,0" VerticalAlignment="Top" FontSize="24" FontFamily="Times New Roman" FontStyle="Italic" Foreground="#FF001ABD" Panel.ZIndex="5"/>
<Label x:Name="lblWinner" Content=""Ник победителя"" HorizontalAlignment="Left" Margin="242,235,0,0" VerticalAlignment="Top" FontSize="28" Height="32" Width="342" Background="{x:Null}" Foreground="#FFDA0063" Panel.ZIndex="5"/>
<Label Content="vs" HorizontalAlignment="Left" Margin="303,115,0,0" VerticalAlignment="Top" FontSize="25" Background="#FF3E5DAE" Foreground="#FF002C9E" FontStyle="Italic"/>
<Menu HorizontalAlignment="Left" Height="36" VerticalAlignment="Top" Width="624">
<Menu.Background>
<LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
<GradientStop Color="White" Offset="0.003"/>
<GradientStop Color="#FF91C8FF" Offset="1"/>
</LinearGradientBrush>
</Menu.Background>
<Button Content="Играть заного" Click="Button_Click_1" Width="117"/>
<Button Content="Изменить игроков" Click="Button_Click_2" Width="138"/>
<Button Content="Настройки" Click="Button_Click_4" Width="101"/>
<Button Content="Выход" Click="Button_Click_3" Width="100"/>
</Menu>
<TextBox x:Name="score1" HorizontalAlignment="Left" Height="32" Margin="219,157,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="34" Background="#FFC2D2FF" BorderThickness="0,0,1,1"/>
<TextBox x:Name="score2" HorizontalAlignment="Left" Height="32" Margin="357,157,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="34" Background="#FFC2D2FF" BorderThickness="0,0,1,1"/>
<Rectangle HorizontalAlignment="Left" Height="43" Margin="10,51,0,0" VerticalAlignment="Top" Width="614">
<Rectangle.Fill>
<RadialGradientBrush Opacity="0.8">
<GradientStop Color="White" Offset="0"/>
<GradientStop Color="#FF9BC0FF" Offset="1"/>
</RadialGradientBrush>
</Rectangle.Fill>
</Rectangle>
<TextBox x:Name="txtWinner" HorizontalAlignment="Left" Height="36" Margin="44,116,0,0" TextWrapping="Wrap" Text="Winner" VerticalAlignment="Top" Width="217" Background="#FFC2D2FF" BorderThickness="0,0,1,1" Focusable="False" FontSize="22" TextAlignment="Center" Foreground="#FFBB0000" RenderTransformOrigin="0.5,0.5">
<TextBox.RenderTransform>
<TransformGroup>
<ScaleTransform/>
<SkewTransform AngleX="-20"/>
<RotateTransform/>
<TranslateTransform/>
</TransformGroup>
</TextBox.RenderTransform>
</TextBox>
<TextBox x:Name="txtLoser" HorizontalAlignment="Left" Height="36" Margin="362,116,0,0" TextWrapping="Wrap" Text="Loser" VerticalAlignment="Top" Width="217" Background="#FFC2D2FF" BorderThickness="0,0,1,1" Focusable="False" FontSize="22" TextAlignment="Center" Foreground="#FFBB0000" RenderTransformOrigin="0.5,0.5">
<TextBox.RenderTransform>
<TransformGroup>
<ScaleTransform/>
<SkewTransform AngleX="-20"/>
<RotateTransform/>
<TranslateTransform/>
</TransformGroup>
</TextBox.RenderTransform>
</TextBox>
<Label Content="Результаты матча!" HorizontalAlignment="Left" Margin="211,57,0,0" VerticalAlignment="Top" FontSize="22" FontStyle="Italic" Background="#FF5279FF" Foreground="#FF2000E8"/>
<Rectangle HorizontalAlignment="Left" Height="43" Margin="0,230,0,0" VerticalAlignment="Top" Width="614">
<Rectangle.Fill>
<RadialGradientBrush Opacity="0.8">
<GradientStop Color="White" Offset="0"/>
<GradientStop Color="#FF9BC0FF" Offset="1"/>
</RadialGradientBrush>
</Rectangle.Fill>
</Rectangle>
</Grid>
</TabItem>
<TabItem Header="Турнирная таблица" Foreground="#FF6F0099" >
<Grid Height="326" Width="597" >
<DataGrid x:Name="ResultDataGrid" AutoGenerateColumns="False" HorizontalAlignment="Stretch" Margin="6,0" Width="456">
<DataGrid.Columns>
<DataGridTextColumn Header="Результат игрока №1" Binding="{Binding FirstPlayerScore}"/>
<DataGridTextColumn Header="Результат игрока №2" Binding="{Binding SecondPlayerScore}"/>
<DataGridTextColumn Header="Игрок №1" Binding="{Binding winnerName}" />
<DataGridTextColumn Header="Игрок №2" Binding="{Binding loserName}"/>
</DataGrid.Columns>
</DataGrid>
</Grid>
<TabItem.Background>
<LinearGradientBrush EndPoint="0,1" StartPoint="0,0">
<GradientStop Color="#FFF3F3F3" Offset="0"/>
<GradientStop Color="#FFEBEBEB" Offset="0.5"/>
<GradientStop Color="#FFDDDDDD" Offset="0.5"/>
<GradientStop Color="#FFA00000" Offset="1"/>
</LinearGradientBrush>
</TabItem.Background>
</TabItem>
</TabControl>
</Grid>
</Window>
При виклику цього вікна відбуваються наступні дії:
public Results(string winnerName, string loserName, int leftPlayerScore, int rightPlayerScore)
{InitializeComponent();//инициализация компоненов полученными в конструкторе значениями (очки)
txtWinner.Text = winnerName;txtLoser.Text = loserName;
score1.Text = leftPlayerScore.ToString();score2.Text = rightPlayerScore.ToString();
lblWinner.Content = winnerName;
try
{
results = mySerializer.Deserialize<ObservableCollection<GameResult>>("RESULTS_DATA.XML"); //десериализуем из файла Данные и запихиваем в коллекцию
results.Add(new GameResult(leftPlayerScore, rightPlayerScore, winnerName, loserName)); //добавляем нужные результаты
mySerializer.Serialize("RESULTS_DATA.XML",results ); //пишем обратно в файл
ResultDataGrid.ItemsSource = results; //привязка данных для грида (подробно в биндинге в разметке)
}
catch (Exception ex)
{MessageBox.Show(ex.Message);
}}
Обробник кнопки «Играть заного»:
private void Button_Click_2(object sender, RoutedEventArgs e)
{new Names().Show();
this.Close();}
Вікно «Настройки» (Рис. 2.5) викликається для зміни налаштувань гри.
Рисунок 2.5 Вікно «Настройки»
Код XAML:
<Window x:Class="PongGame.Settings"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Настройки" Height="400" Width="524" ResizeMode="NoResize" WindowStartupLocation="CenterScreen" WindowStyle="None">
<Window.Background>
<LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
<GradientStop Color="#FFBED2FF" Offset="0"/>
<GradientStop Color="White" Offset="1"/>
</LinearGradientBrush>
</Window.Background>
<Grid Background="#FFCBDEFF">
<DockPanel HorizontalAlignment="Left" Height="40" LastChildFill="False" Margin="10,19,0,0" VerticalAlignment="Top" Width="498">
<DockPanel.Background>
<RadialGradientBrush>
<GradientStop Color="#FFCBDEFF" Offset="1"/>
<GradientStop Color="White"/>
</RadialGradientBrush>
</DockPanel.Background>
<Label x:Name="lbl1" Content="НАСТРОЙКИ" DockPanel.Dock="Top" Height="45" HorizontalAlignment="Left" Width="137" Margin="190,2,0,0" FontFamily="Segoe UI, Lucida Sans Unicode, Verdana" FontSize="20" FontStyle="Italic"/>
</DockPanel>
<Slider Name="slider" HorizontalAlignment="Left" Margin="186,84,0,0" Maximum="25" IsSnapToTickEnabled="True" VerticalAlignment="Top" Height="28" Width="180" Background="Transparent" BorderBrush="#FFFF4040" Foreground="#FFE06666" Value="5" Panel.ZIndex="1" Minimum="1"/>
<TextBox x:Name="txtSpeed" Text="{Binding Value, ElementName=slider}" Margin="381,77,86,0" Panel.ZIndex="1" Height="35" VerticalAlignment="Top"/>
<Button x:Name="btnAccept" Content="Принять" HorizontalAlignment="Left" Margin="96,320,0,0" VerticalAlignment="Top" Width="154" Click="btnAccept_Click" Height="27"/>
<Button x:Name="btnBack" Content="Назад" HorizontalAlignment="Left" Margin="284,320,0,0" VerticalAlignment="Top" Width="154" Click="btnBack_Click" Height="27"/>
<Rectangle Height="40" Margin="49,77,47,0" Stroke="#FFCBDEFF" VerticalAlignment="Top">
<Rectangle.Fill>
<RadialGradientBrush>
<GradientStop Color="White" Offset="0"/>
<GradientStop Color="#FFCBDEFF" Offset="1"/>
</RadialGradientBrush>
</Rectangle.Fill>
</Rectangle>
<Label Content="Скорость шарика" HorizontalAlignment="Left" Margin="27,77,0,0" VerticalAlignment="Top" FontSize="16" FontStyle="Italic"/>
<Slider x:Name="slider_Copy" HorizontalAlignment="Left" Margin="186,167,0,0" Maximum="15" IsSnapToTickEnabled="True" VerticalAlignment="Top" Height="28" Width="180" Background="Transparent" BorderBrush="#FFFF4040" Foreground="#FFE06666" Value="5" Panel.ZIndex="1" Minimum="1"/>
<TextBox x:Name="txtSpeed_Copy" Text="{Binding Value, ElementName=slider_Copy}" Margin="381,160,86,0" Panel.ZIndex="1" Height="35" VerticalAlignment="Top"/>
<Rectangle Height="40" Margin="49,160,47,0" Stroke="#FFCBDEFF" VerticalAlignment="Top">
<Rectangle.Fill>
<RadialGradientBrush>
<GradientStop Color="White" Offset="0"/>
<GradientStop Color="#FFCBDEFF" Offset="1"/>
</RadialGradientBrush>
</Rectangle.Fill>
</Rectangle>
<Label Content="Скорость ракетки" HorizontalAlignment="Left" Margin="27,160,0,0" VerticalAlignment="Top" FontSize="16" FontStyle="Italic"/>
<Slider x:Name="slider_Copy1" HorizontalAlignment="Left" Margin="186,259,0,0" Maximum="11" IsSnapToTickEnabled="True" VerticalAlignment="Top" Height="28" Width="180" Background="Transparent" BorderBrush="#FFFF4040" Foreground="#FFE06666" Value="11" Panel.ZIndex="1" Minimum="1"/>
<TextBox x:Name="txtEnd" Text="{Binding Value, ElementName=slider_Copy1}" Margin="381,252,86,0" Panel.ZIndex="1" Height="35" VerticalAlignment="Top"/>
<Rectangle Height="40" Margin="49,252,47,0" Stroke="#FFCBDEFF" VerticalAlignment="Top">
<Rectangle.Fill>
<RadialGradientBrush>
<GradientStop Color="White" Offset="0"/>
<GradientStop Color="#FFCBDEFF" Offset="1"/>
</RadialGradientBrush>
</Rectangle.Fill>
</Rectangle>
<Label Content="Ограничение очков " HorizontalAlignment="Left" Margin="27,252,0,0" VerticalAlignment="Top" FontSize="16" FontStyle="Italic"/>
</Grid>
</Window>
При виклику цього вікна відбуваються наступні дії:
public Settings(Ball _ball)
{
InitializeComponent();
if (_ball.LeftResult>_ball.RightResult)
slider_Copy1.Minimum = _ball.LeftResult+1;
else
slider_Copy1.Minimum = _ball.RightResult + 1;
slider.Value = SetttingsStaticClass.ballSpeed;
slider_Copy.Value = SetttingsStaticClass.padSpeed;
slider_Copy1.Value = SetttingsStaticClass.EndScore;
}
Обробник кнопки «Принять»:
private void btnAccept_Click(object sender, RoutedEventArgs e)
{SetttingsStaticClass.ballSpeed = Convert.ToInt32(txtSpeed.Text);
SetttingsStaticClass.padSpeed = Convert.ToInt32(txtSpeed_Copy.Text);
SetttingsStaticClass.EndScore = Convert.ToInt32(txtEnd.Text); }
Вікно «Таблиця результатів» (Рис. 2.6) містить інформацію про всі попередні ігри та їх результати.
Рисунок 2.6 «Таблиця результатів»
Код XAML:
<Window x:Class="PongGame.TheTable"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="TheTable" Height="351" Width="556" Loaded="Window_Loaded_1" WindowStartupLocation="CenterScreen" ResizeMode="NoResize">
<Grid>
<Grid.Background>
<LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
<GradientStop Color="#FF872EA8" Offset="0"/>
<GradientStop Color="#FF698BFF" Offset="1"/>
</LinearGradientBrush>
</Grid.Background>
<DataGrid x:Name="ResultDataGrid" AutoGenerateColumns="False" HorizontalAlignment="Stretch" Margin="10,10,10,57" RenderTransformOrigin="0.5,0.5" HorizontalGridLinesBrush="Black">
<DataGrid.RenderTransform>
<TransformGroup>
<ScaleTransform ScaleY="1" ScaleX="1"/>
<SkewTransform AngleY="0" AngleX="0"/>
<RotateTransform Angle="0"/>
<TranslateTransform/>
</TransformGroup>
</DataGrid.RenderTransform> <DataGrid.Columns>
<DataGridTextColumn Header="Результат игрока №1" Binding="{Binding FirstPlayerScore}"></DataGridTextColumn>
<DataGridTextColumn Header="Результат игрока №2" Binding="{Binding SecondPlayerScore}"></DataGridTextColumn>
<DataGridTextColumn Header="Игрок №1" Binding="{Binding winnerName}" ></DataGridTextColumn>
<DataGridTextColumn Header="Игрок №2" Binding="{Binding loserName}"></DataGridTextColumn>
</DataGrid.Columns>
</DataGrid>
<Button Content="Очистить файл результатов" HorizontalAlignment="Left" Height="32" Margin="185,281,0,0" VerticalAlignment="Top" Width="188" Click="Button_Click_1"/> </Grid>
</Window>
При виклику цього вікна відбуваються наступні дії:
private void Window_Loaded_1(object sender, RoutedEventArgs e)
{
NullResults.Add(new GameResult()); // записали пустой объект
results = mySerializer.Deserialize<ObservableCollection<GameResult>>("RESULTS_DATA.XML"); //deserialize
ResultDataGrid.ItemsSource = results;}
Обробник кнопки «Очистить таблицу»:
private void Button_Click_1(object sender, RoutedEventArgs e) //обновление формы при нажатии Обновить
{
mySerializer.Serialize("RESULTS_DATA.XML", NullResults);
new TheTable().Show();
this.Close();
}
Вікно «Справка» (Рис. 2.7) містить інформацію про розробника ПС та короткі правила гри.
Рисунок 2.7 - Вікно «Справка»
Код XAML:
<Window x:Class="PongGame.About"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Справка" Height="317.708" Width="595.833" WindowStartupLocation="CenterScreen" Loaded="Window_Loaded_1" WindowStyle="None">
<Grid>
<Grid.Background>
<LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
<GradientStop Color="#FFD2D6FF" Offset="0.987"/>
<GradientStop Color="#FFE9F8FF"/>
</LinearGradientBrush>
</Grid.Background>
<Menu HorizontalAlignment="Left" Height="31" VerticalAlignment="Top" Width="588" Margin="0,10,0,0"/>
<Button Content="Помощь игроку" HorizontalAlignment="Left" Height="31" VerticalAlignment="Top" Width="138" Margin="10,10,0,0" Click="Button_Click_1"/>
<Button Content="Правила игры" HorizontalAlignment="Left" Margin="158,10,0,0" VerticalAlignment="Top" Width="112" Height="31" Click="Button_Click_2"/>
<Button Content="Информация о разработчике" HorizontalAlignment="Left" Margin="283,10,0,0" VerticalAlignment="Top" Width="180" Height="31" Click="Button_Click_3"/>
<Button Content="Выход" HorizontalAlignment="Left" Height="31" Margin="479,10,0,0" VerticalAlignment="Top" Width="99" Click="Button_Click_4"/>
<RichTextBox x:Name="richTextBox1" HorizontalAlignment="Left" Height="218" Margin="10,57,0,0" VerticalAlignment="Top" Width="578">
<FlowDocument/>
</RichTextBox>
</Grid>
</Window>
Обробники кнопок «Правила игры», «Информация о разработчике»:
private void Button_Click_2(object sender, RoutedEventArgs e)
{
try
{WriteTxtFileToRichTxt(@"..\..\myTxt\GameRules.txt");
}catch (Exception ex)
{MessageBox.Show("Ошибка! Текст ошибки: " + ex.Message);}}
private void Button_Click_3(object sender, RoutedEventArgs e)
{
try{WriteTxtFileToRichTxt(@"..\..\myTxt\DeveloperInfo.txt");}
catch (Exception ex)
{MessageBox.Show("Ошибка! Текст ошибки: " + ex.Message);
}}
При розробці гри також було використано декілька окремих класів. Для розробки логіки взаємодії м'яча з іншими компонентами був розроблений клас Bal.cs:
namespace PongGame
{
//класс Мячика
public class Ball : INotifyPropertyChanged //наследование от интерфейса
{
//INotifyPropertyChanged - это интерфейс, используемый в классах объектов данных, для предоставления
// уведомления PropertyChanged клиентам, когда значение любого свойства изменяется. Это позволяет вызывать событие
// PropertyChanged всякий раз, когда состояние объекта меняется
// (добавлен, удален или изменен) в точке, где вы хотите сообщить нижележащей коллекции или контейнеру, что состояние изменилось.
//переменные, которые используются при свойстве set полей
private double _x;
private double _y;
private bool _movingRight;
private int _leftResult;
private int _rightResult;
public double X //положение мячика по X
{
get { return _x; }
set
{
_x = value;
OnPropertyChanged("X");
}
}
public double Y //положение по Y
{
get { return _y; }
set
{
_y = value;
OnPropertyChanged("Y");
}
}
public bool MovingRight //двигается ли мячик вправо
{
get { return _movingRight; }
set
{
_movingRight = value;
OnPropertyChanged("MovingRight");
}
}
public int LeftResult //???
{
get { return _leftResult; }
set
{
_leftResult = value;
OnPropertyChanged("LeftResult");
}
}
public int RightResult //???
{
get { return _rightResult; }
set
{
_rightResult = value;
OnPropertyChanged("RightResult");
}
}
public event PropertyChangedEventHandler PropertyChanged; //обьявление события
protected virtual void OnPropertyChanged(string propertyName)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null)
handler(this, new PropertyChangedEventArgs(propertyName));
} }}
Для розробки логіки взаємодії ракеток з м`ячем був розроблений клас Pad.cs:
namespace PongGame
{
//Класс ракетки
class Pad : INotifyPropertyChanged // наследование от интерфейса
{
/*
* INotifyPropertyChanged - используется для уведомления представления об изменениях свойств объекта.
* Реализация классом интерфейса предполагает генерацию события PropertyChanged каждый раз, когда значение свойства объекта изменяется.
* Такое поведение позволяет привязкам данных отслеживать состояние объекта и
* обновлять данные пользовательского интерфейса при изменении значения связанного свойства.
*/
private int _yPosition; //????
public int YPosition //Свойство YPosition испольуется для биндинга ракеток по Y
{
get { return _yPosition; } //при получении (get) получаем значение из _yPosition
set
{ //при установке значение в _yPosition пишем значение, вызываем функцию OnPropertyChanged с параметром имени свойства
_yPosition = value;
OnPropertyChanged("YPosition");
}
}
public event PropertyChangedEventHandler PropertyChanged;// обьявление события
protected void OnPropertyChanged(string propertyName)
{PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null)
handler(this, new PropertyChangedEventArgs(propertyName));
}
}
}
2.4 Інструкція з експлуатації системи
Запуск прогрими виконується по подвійному щиголі на ярлику або на файлі з розширенням PongGame.ехе (Рис.2.8)
Рисунок 2.8 Файл PongGame.exe
Після запуску програми на екрані з'являється головне меню гри «Пінг-Понг» (Рис.2.9).
Рисунок 2.9 Головне меню програми
При натискненні на кнопці «Новая игра» відкривається вікно «Никнеймы» (Рис. 2.10) , де гравці повинні ввести їх імена:
Рисунок 2.10 Вікно «Никнеймы»
При щиглі по кнопці «Играть!» буде запущена гра - відкриється ігрове поле з ракетками та м'ячиком (Рис.2.11).
Рисунок 2.11 Вікно «Игровое поле»
Запуск гри починається при натисненні кнопки «Пробіл». Пересування ракеток відбувається за допомогою клавіш L.Shift & L.Ctrl для першого гравця, та стрілок вверх та вниз для другого гравця. В будь-який момент гравець може поставити гру на паузу, викликавши меню паузи (Рис. 2.12), де він може змінити налаштування (швидкість польоту м'яча та ракеток, кількість очків для завершення гри).
Рисунок 2.12 Меню паузы
Коли один з ігроків набирає ту кількість очків, яка зазначена у налаштуваннях, гра закінчується і з'являється вікно «Результати!» (Рис. 2.13). У цьому вікні користувач може розпочати гру заного (кнопка «Играть заного»), розпочати гру заного, змінивши імена ігроків (кнопка «Изменить игроков»), змінити налаштування (кнопка «Настройки»), переглянути результати попередніх ігор (вкладинка «Турнирная таблица») та вийти з гри (кнопка «Выход»).
Рисунок 2.13 Вікно «Результати»
У головному меню при натисненні кнопки «Турнирная таблица» відкривається вікно з результатами попередніх ігор (Рис. 2.14). Користувач може очистити таблицю при натисненній кнопки «Очистить файл результатов».
Рисунок 2.14 Вікно «Таблиця результатів»
При натисненні кнопки «Настройки» відкривається вікно налаштувань (Рис. 2.15). Користувач може підтвердити свої дії (кнопка «Принять») або повернутись назад (кнопка «Назад»).
Рисунок 2.15 Вікно «Настройки»
При натисненні кнопки «Справка» відкриється вікно «Справка» (Рис. 2.16). Користувач може переглянути розділи «Помощь игроку», «Правила игры», «Информация о разработчике» за допомогою відповідних кнопок у вікні.
Рисунок 2.16 Вікно «Справка»
При натисненні кнопки «Выход» гра закриється.
visual інформація гра алгоритм
ВИСНОВКИ
Під час виконання курсової роботи був спроектований ігровий додаток "Пінг-Понг". Ця програма відповідає всім потребам, які поставлені у ТЗ і виконує всі необхідні функції. Були реалізовані всі поставлені задачі та досягнені основні цілі курсової роботи.
У процесі виконання курсової роботи були вивчені та засвоєні нові можливості мови C# та технології WPF. У тому числі були вивчені нові принципи та методи, які забезпечують можливість роботи з графікою та розробкою UI.
Програма дозволяє:
1. Вводити імена користувачів.
2. Переглядати результати гри.
3. Здійснювати запис та зчитування результатів.
4. Здійснювати процес гри.
5. Переглядати вікно з інформацією про розробника.
6. Налагоджувати гру.
У процесі створення програми був реалізований алгоритм, який надалі можливо вдосконалити. Усі поставлені завдання були виконані і розробка популярної гри «Пінг-Понг» пройшла успішно.
СПИСОК ВИКОРИСТАНОЇ ЛІТЕРАТУРИ
1. Кузьменко В.Г. Базы данных в Visual Basic и VBA. - М.:Бином, 2008. -
412 с.
2. Албахари Дж., Албахари Б. С# 5.0. Карманный справочник. - П.:БХВ-Петербург, 2013. - 234 с.
3. Уотсон К., Нейгел К. Visual C# 2010. Полный курс. - П.:БХВ-Петербург, 2011. - 500 с.
4. Культин О. C# в задачах и примерах. - П.:Бином-Пресс, 2012. - 250 с.
5. Лабор В. Visual C#. Создание приложений для Windows. - П.:Русская Редакция, 2013. - 280 с.
6. Мартин Р. Принципы, паттерны и методики гибкой разработки на языке C#.- П.:Питер, 2011. - 300 с.
7. Абрамян М.Э. Visual С# на примерах. - М.:Питер, 2010. - 345 с.
ДОДАТОК А
Блок-схема алгоритму гри
Размещено на Allbest.ru
Подобные документы
Призначення менеджеру пристроїв. Обґрунтування вибору мови програмування. Розробка структурної схеми і опис діалогового інтерфейсу програми. Блок-схема програмного додатку, основні функції і алгоритм його роботи. Методики і інструкція його тестування.
курсовая работа [3,4 M], добавлен 17.11.2014Розробка та схема алгоритму проектованої гри. Особливості мови програмування та середовища "Microsoft Visual Studio C++ 2008 Express Edition". Лістинг програми та загальний опис її роботи, аналіз отриманих результатів та оцінка практичної ефективності.
курсовая работа [762,8 K], добавлен 03.05.2015Розробка програми "Тетрис", яка виконує створення та переміщення фігур, видалення повних рядів та нарахування балів. Вимоги до умов експлуатації ігрової програми, вхідні та вихідні дані. Проектування діаграми класів та діаграми станів ігрового додатку.
курсовая работа [515,8 K], добавлен 27.05.2019Головні особливості середовища Turbo Pascal. Властивості та вигляд системи лінійних алгебраїчних рівнянь. Опис схеми єдиного ділення (метод Гауса). Структура вхідної та вихідної інформації, текст програми, блок-схеми всіх процедур і головної програми.
курсовая работа [276,1 K], добавлен 07.02.2011Розробка прикладного додатку для побудови графіків тригонометричних функцій з використанням програмного середовища Delphi. Схема алгоритму, методи створення, структура та особливості програмної реалізації прикладного додатку. Умови виконання програми.
курсовая работа [643,1 K], добавлен 19.11.2013Загальний опис гри "Тетріс", огляд основних об’єктів та клавіш управління грою. Розробка інтерфейсу користувача та основних модулів. Алгоритм ігрового поля, блок-схема алгоритму перевірки можливості зміни розташування фігури та переміщення фігури вниз.
курсовая работа [1,9 M], добавлен 18.02.2013Призначення драйверів та порядок роботи з драйверами в MS-DOS. Розробка драйверів консолі. Структура драйвера та призначення компонентів. Розробка структури алгоритму, програми налагодження драйвера. Опис змінних програми та роботи модулів програми.
курсовая работа [1,0 M], добавлен 22.06.2012Опис методів і алгоритмів вирішення задачі в середовищі розробки Myeclipse. Основні функції програмного продукту, його структура. Розробка алгоритму та програми, інструкція користувачу. Результати тестування, лістинг основних блоків. Вікно головного меню.
курсовая работа [1,8 M], добавлен 24.02.2014Головні принципи візуального програмування, опис компонентів Delphi, використаних при розробці проекту. Опис програми-додатку "Психологічний тест" та список дій користувача. Алгоритм роботи програми, її форма та ієрархія. Опис графічного інтерфейсу.
курсовая работа [1,2 M], добавлен 08.06.2010Вибір методів та засобів створення інформаційної системи для обліку і перегляду продукції на складі. Розробка моделі даних для реляційної бази даних, прикладного програмного забезпечення. Тестування програмного додатку, виявлення можливих проблем.
курсовая работа [1,1 M], добавлен 22.09.2015