Автор работы: Пользователь скрыл имя, 08 Июня 2014 в 14:18, курсовая работа
Цель этой курсовой работы – детально рассмотреть этапы написания игровой программы с использованием языка программирования C# и языка разметки XAML.
Поставленная цель подразумевает решение следующих задач:
Изучение Microsoft Visual Studio, WPF, XAML;
Написание программы, моделирующей игру «Морской бой»;
Научится пользоваться анимацией
Разработка приложения, с графическим редактором.
Все кнопки
поддерживают клавиши доступа, которые
работают подобно
Простейшим элементом управления содержимым является 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.
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.
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;
Листинг 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-приложения поставленные цели и задачи были выполнены.
Данная курсовая работа развивает и закрепляет навыки полученные по пройденному курсу и углубляет знания по разработке приложений на языке С#.
Эта игра может быть использована в качестве развлекательного приложения, имеющего анимацию.
СПИСОК ИСПОЛЬЗУЕМОЙ ЛИТЕРАТУРЫ
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.
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.
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)
{
}
else
{
}
}
else
{
if (i >= 7 && i < 9)
{
array_p[res_x + 1, res_y] = 3;
b = 3;
}
else
{
{
array_p[res_x, res_y] = 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;