Игровая программа 'Wall on Wall'

  • Вид работы:
    Курсовая работа (т)
  • Предмет:
    Информационное обеспечение, программирование
  • Язык:
    Русский
    ,
    Формат файла:
    MS Word
    658,79 Кб
  • Опубликовано:
    2013-06-19
Вы можете узнать стоимость помощи в написании студенческой работы.
Помощь в написании работы, которую точно примут!

Игровая программа 'Wall on Wall'

Московский Государственный Горный Университет

Кафедра САПР











Отчет

по курсовой работе

по дисциплине «Технологии программирования»

Игровая программа «Wall on Wall»

Выполнил:

Студент группы АСП-Б-11

Иванов А.А.





Москва, 2013г.

Содержание

Введение

. Анализ требований и уточнение спецификаций

.1 Анализ задания, выбор технологии, языка и среды программирования

.2 Конструкции, реализованные в программе

.3 Анализ обрабатываемой информации и выбор структур данных для ее хранения

.4 Анализ структуры программы

. Проектирование программного продукта

.1 Разработка интерфейса пользователя

.1.1 Разработка меню

.1.2 Разработка форм вывода данных

3. Выбор стратегии тестирования и разработка тестов

3.1 Анализ программного продукта и выбор стратегии тестирования

.2 Непосредственное тестирование

4. Код программы

. Диаграмма классов

Заключение

 

Введение


Целью данной курсовой работы является разработка популярной развлекательной игры Wall on Wall. Программа предоставляет возможность играть против компьютера, который играет согласно созданному алгоритму. В процессе разработки должны быть усвоены некоторые новые возможности Visual Studio. В программе должны быть учтены моменты, позволяющие пользователю легко освоить программу, для этого необходимо создать удобный интерфейс, который является «визитной карточкой» приложения.

 

1. Анализ технических требований и уточнение спецификаций


.1 Анализ задания, выбор технологии, языка и среды

С# - это новый язык программирования, в котором, по замыслу создателей, должны сочетаться выразительность и простота. Его цель - позволить программисту создавать сложные высокопроизводительные программы # создавался параллельно с каркасом Framework .Net и в полной мере учитывает все его возможности - как FCL, так и CLR;# является полностью объектно-ориентированным языком, где даже типы, встроенные в язык, представлены классами;# является мощным объектным языком с возможностями наследования и универсализации;# является наследником языков C/C++, сохраняя лучшие черты этих популярных языков программирования. Общий с этими языками синтаксис, знакомые операторы языка облегчают переход программистов от С++ к C#; сохранив основные черты своего великого родителя, язык стал проще и надежнее.

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

.NET - это общий термин для многих важных служб, которые предоставляются и используются во время создания и исполнения программы на С#. Более того, С# полностью зависит от .NET. Неудивительно, что происхождение многих особенностей и концепций С# уходит своими корнями в .NET. Вот некоторые важные службы, предоставляемые инфраструктурой .NET-платформы.

1.    .NET предоставляет средства для исполнения инструкций, содержащихся в программе, написанной на С#. Эта часть .NET называется средой исполнения (execution engine).

2.      .NET помогает реализовать так называемую среду, безопасную к несоответствию типов данных (type safe environment). Образно говоря, .NET обеспечивает "треугольные дырки для треугольников, квадратные - для квадратов".

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

.        .NET предоставляет безопасную среду исполнения, пытаясь усложнить жизнь хакерам и им подобным.

.        В состав .NET-платформы входит библиотека, содержащая массу готовых программных компонентов, которые можно использовать в собственных программах. Она экономит немало времени, так как программист может воспользоваться готовыми фрагментами кода. Фактически, он повторно использует код, созданный и тщательно проверенный профессиональными программистами Microsoft.

.        В .NET упрощена подготовка программы к использованию (развертывание).

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

Все сказанное выше о .NET - не более чем простое перечисление некоторых свойств платформы, в которой были реализованы многие современные программные технологии.

Реализация, сочетающая построение надежного и эффективного кода, является немаловажным фактором, способствующим успеху C#.

Среда разработки Visual Studio 2010 была специально создана для нужд .NET, и располагает всеми необходимыми инструментами.

В частности, в Visual Studio 2010 имеются различные шаблоны графического интерфейса пользователя, среди которых наиболее интересными являются Windows Forms. Приложение Windows Forms представляет собой событийно-ориентированное приложение <#"651059.files/image001.gif">


2. Проектирование программного продукта

.1 Разработка интерфейса пользователя

Разрабатываемая программа предназначена для пользователей всех возрастных категорий, в том числе имеющих слабый навык работы с компьютером, и к интерфейсу предъявляются особенные требования. Так же программа является игрой, следовательно, интерфейс должен быть хорошо продуман. Именно поэтому, разработку целесообразно начать с разработки пользовательского интерфейса.

.1.1 Разработка меню

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

Исследовав интерфейс программ-аналогов, функции были разделены на 1 основную группу в этой игре:

Функции игры

.1.2 Разработка форм ввода вывода

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

игра алгоритм интерфейс данные

Рисунок 2 - Игровое поле

Рисунок 3 - Игровой процесс

Рисунок 4 - Монстр доходит до края поля

Рисунок 5 - Потеря 1 единицы Health`ов после прохода монстра за поле

3. Выбор стратегии тестирования и разработка тестов

Тестирование - процесс выполнения программы, целью которого является выявление ошибок. Никакое тестирование не может доказать отсутсвие ошибок в программе, однако проведение анализа правильности работы алгоритма является необходимым шагом в создании качественного программного продукта.

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

Согласно методологии тестирования программного продукта различают два подхода к формированию тестовых наборов:структурный и функциональный.

Структурный подход-тестирование, при котором известна структура программного обеспечения («белый ящик»).

Функциональный подход-тестирование, при котором не известна структура программного обеспечения («черный ящик»). Этот подход целесообразно применить для тестирования алгоритмов хода и проверки игровой ситуации.

Оценочное тестирование-тестирование программы на соответсвии соответсвующим требованиям. Необходимо для анализа работы системы в целом.

В результате тестирования, проведенного на этапе разработки программы, были исправлены найденные ошибки и улучшены алгоритмы игрового процесса, используемые методами классов.

Было проведено тестирование всех функций программы, в результате которого были обнаружены недостатки интерфейса, которые были устранены.

Было сделано заключение, что скорость выполнения программы практически не зависит от различных игровых ситуаций. Объем занимаемой оперативной памяти также остается практически неизменным - около 14, 5 МБ.

dows: о меню приведет к появлению стандартного окна вободное поле) от второго игрока, иначе ход перейдет к ИИ и после опять к

4. Код программы

Класс игрока

using System;

using System.Collections.Generic;System.Linq;System.Text;Microsoft.Xna.Framework;Microsoft.Xna.Framework.Input;Microsoft.Xna.Framework.Graphics;WoW2

{class Player

{

//Состояние игрокаint money = 100;int lives = 10;Texture2D[] creepTextures;//Текстура "Монстра" игрокаTexture2D bulletTexture;//Текстура снарядаList<Creep> creeps = new List<Creep>(); //Список "Монстров" игрокаMouseState mouseState;//состояние мыши для данного фреймаMouseState oldState;//состояние мыши для предыдущего фрейма

//Расположение "Монстров" игрокаint cellX;

private int cellY;int tileX;int tileY;string newCreepType;//тип "монстра" длядобавления

private int newCreepIndex;//показатель новой текстуры"монстра"

private Level level;//справка об уровнеint Money

{{ return money; }{ money = value; }

}int Lives

{{ return lives; }{ lives = value; }

}string NewCreepType

{{ newCreepType = value; }

}int NewCreepIndex

{{ newCreepIndex = value; }

}

/// <summary>

/// Создание новго игрока

/// </summary>Player(Level level, Texture2D[] creepTextures, Texture2D bulletTexture)

{.level = level;.creepTextures = creepTextures;.bulletTexture = bulletTexture;

}

/// <summary>

/// Returns wether the current cell is clear

/// </summary>bool IsCellClear()

{inBounds = cellX >= 0 && cellY >= 0 &&< level.Width && cellY < level.Height;spaceClear = true;

// Check that there is no creep in this spot(Creep creep in creeps)

{= (creep.Position != new Vector2(tileX, tileY));(!spaceClear)

{

break;

}

}onPath = (level.GetIndex(cellX, cellY) != 1);inBounds && spaceClear && onPath; // If both checks are true return true

}

/// <summary>

/// Adds a creep to the player's collection.

/// </summary>void AddCreep()

{creepToAdd = null;(newCreepType)

{"Car Creep":

{

creepToAdd = new CarCreep(creepTextures[0],

bulletTexture, new Vector2(tileX, tileY));

break;

}"Tank Creep":

{

creepToAdd = new TankCreep(creepTextures[1],

bulletTexture, new Vector2(tileX, tileY));

break;

}

}

// Only add the tower if there is a space and if the player can afford it.(IsCellClear() == true && creepToAdd.Cost <= money)

{.Add(creepToAdd);-= creepToAdd.Cost;

// Reset the newTowerType field.= string.Empty;

}

{= string.Empty;

}

}

/// <summary>

/// Updates the player.

/// </summary>void Update(GameTime gameTime, List<Enemy> enemies)

{= Mouse.GetState();= (int)(mouseState.X / 32); // Convert the position of the mouse= (int)(mouseState.Y / 32); // from array space to level space= cellX * 32; // Convert from array space to level space= cellY * 32; // Convert from array space to level space(mouseState.LeftButton == ButtonState.Released

&& oldState.LeftButton == ButtonState.Pressed)

{(string.IsNullOrEmpty(newCreepType) == false)

{

AddCreep();

}

{

// Make sure the creep has no targets.(creep.HasTarget == false)

{

creep.GetClosestEnemy(enemies);

}.Update(gameTime);

}= mouseState; // Set the oldState so it becomes the state of the previous frame.

}void Draw(SpriteBatch spriteBatch)

{(Creep creep in creeps)

{.Draw(spriteBatch);

}

}void DrawPreview(SpriteBatch spriteBatch)

{

// Draw the creep preview.(string.IsNullOrEmpty(newCreepType) == false)

{cellX = (int)(mouseState.X / 32); // Convert the position of the mousecellY = (int)(mouseState.Y / 32); // from array space to level spacetileX = cellX * 32; // Convert from array space to level spacetileY = cellY * 32; // Convert from array space to level spaceD previewTexture = creepTextures[newCreepIndex];.Draw(previewTexture, new Rectangle(tileX, tileY,

previewTexture.Width, previewTexture.Height), Color.White);

}

}

 Класс менюSystem;System.Collections.Generic;System.Linq;System.Text;Microsoft.Xna.Framework.Input;Microsoft.Xna.Framework;Microsoft.Xna.Framework.Graphics;WoW2

{enum ButtonStatus//Описываем состояние кнопки

{,,,

}class Button : Sprite //Хранит внешний вид и функциональность кнопки.

{MouseState previousState;//Сохраняет состояние мыши последнего фреймаTexture2D hoverTexture;Texture2D pressedTexture;//Состояния текстурRectangle bounds;//Прямоугольник,охватывающий кнопкуButtonStatus state = ButtonStatus.Normal;//Сохраняет текущее состояние кнопкиevent EventHandler Clicked;//Срабатывает при клике кнопкиevent EventHandler OnPress;//Срабатывает при зажатой кнопке

///<summary>

///Создаем новую кнопку

///</summary>

/// <param name="texture">Нормальная текстура кнопки</param>

/// <param name="hoverTexture">Текстура рисуемая,когда наведенна мышь на кнопку</param>

/// <param name="pressedTexture">Текстура рисуемая, когда кнопка нажата</param>

/// <param name="position">Расположение,где кнопка будет нарисованна</param>

public Button(Texture2D texture, Texture2D hoverTexture, Texture2D pressedTexture, Vector2 position)

: base(texture, position)

{.hoverTexture = hoverTexture;.pressedTexture = pressedTexture;.bounds = new Rectangle((int)position.X, (int)position.Y,.Width, texture.Height);

}

///<summary>

///Обновляем состояник кнопки

///</summary>

///<param name="gameTime">Текущее игровое время</param>override void Update(GameTime gameTime)

{mouseState = Mouse.GetState();//Определение,находится ли мышь над кнопкой

int mouseX = mouseState.X;mouseY = mouseState.Y;isMouseOver = bounds.Contains(mouseX, mouseY);(isMouseOver && state != ButtonStatus.Pressed)//Обновление состояния кнопки

{= ButtonStatus.MouseOver;

}if (isMouseOver == false && state != ButtonStatus.Pressed)

{= ButtonStatus.Normal;

}(mouseState.LeftButton == ButtonState.Pressed &&.LeftButton == ButtonState.Released)//Проверяем нажата ли кнопка игроком

{(isMouseOver == true)

{

state = ButtonStatus.Pressed;//обновляем состояние кнопки

if (OnPress != null)

{

OnPress(this, EventArgs.Empty);//Запускаем событие Нажата(OnPress)

}

}

}(mouseState.LeftButton == ButtonState.Released &&.LeftButton == ButtonState.Pressed)//Проверяем отпустил ли игрок кнопку

{(isMouseOver == true)

{

state = ButtonStatus.MouseOver;//Обновляем состояние кнопки

if (Clicked != null)

{

Clicked(this, EventArgs.Empty);//Запускаем событие Клика(Clicked)

}

}if (state == ButtonStatus.Pressed)

{

state = ButtonStatus.Normal;

}

}= mouseState;

}

/// <summary>

/// Рисуем кнопку

/// </summary>

/// <param name="spriteBatch">SpriteBatch,который начат</param>override void Draw(SpriteBatch spriteBatch)

{(state)

spriteBatch.Draw(texture, bounds, Color.White);

break;ButtonStatus.MouseOver:

spriteBatch.Draw(hoverTexture, bounds, Color.White);

break;ButtonStatus.Pressed:

spriteBatch.Draw(pressedTexture, bounds, Color.White);

break;:

spriteBatch.Draw(texture, bounds, Color.White);

break;

}

}

}

}System;System.Collections.Generic;System.Linq;System.Text;Microsoft.Xna.Framework;Microsoft.Xna.Framework.Graphics;WoW2

{class Toolbar

{Texture2D texture;SpriteFont font;//класс для доступа к шрифту,который создаемVector2 position;//место расположения тулбараVector2 textPosition;//место расположения текстаToolbar(Texture2D texture, SpriteFont font, Vector2 position)

{.texture = texture;.font = font;

this.position = position;//расположение текста в правом нижнем углу

textPosition = new Vector2(130, position.Y + 10);

}void Draw(SpriteBatch spriteBatch, Player player)

{.Draw(texture, position, Color.White);text = string.Format("Gold :{0} Lives : {1}", player.Money, player.Lives);.DrawString(font, text, textPosition, Color.White);

}

}

}

Класс передвижения и отрисовки противника

using System;

using System.Collections.Generic;System.Linq;System.Text;Microsoft.Xna.Framework;Microsoft.Xna.Framework.Graphics;WoW2

{class Enemy : Sprite

{Queue<Vector2> waypoints = new Queue<Vector2>();float speedModifier;float modifierDuration;float modiferCurrentTime;float startHealth;float currentHealth;bool alive = true;float speed = 0.5f;int bountyGiven;

/// <summary>

/// Изменяет скорость врага

/// </summary>

public float SpeedModifier

{{ return speedModifier; }

set { speedModifier = value; }

}

/// <summary>

/// Определяет,как долго модификация скорости продлится

/// </summary>float ModifierDuration

{{ return modifierDuration; }

{= value;= 0;

}

}float CurrentHealth

{{ return currentHealth; }{ currentHealth = value; }

}

/// <summary>

/// % оставшегося у врага здоровья

/// </summary>

public float HealthPercentage

{{ return currentHealth / startHealth; }

}bool IsDead

{{ return !alive; }

}int BountyGiven

{{ return bountyGiven; }

}float DistanceToDestination

{{ return Vector2.Distance(position, waypoints.Peek()); }

}Enemy(Texture2D texture, Vector2 position, float health, int bountyGiven, float speed)

: base(texture, position)

{.startHealth = health;.currentHealth = startHealth;.bountyGiven = bountyGiven;.speed = speed;

}void SetWaypoints(Queue<Vector2> waypoints)

{(Vector2 waypoint in waypoints).waypoints.Enqueue(waypoint);.position = this.waypoints.Dequeue();

}override void Update(GameTime gameTime)

{.Update(gameTime);(waypoints.Count > 0)

{(DistanceToDestination < 1f)

{

position = waypoints.Peek();

waypoints.Dequeue();

}

{

Vector2 direction = waypoints.Peek() - position;

direction.Normalize();

float temporarySpeed = speed;//СОдержит оригинальную скорость передвижения

{

//Сбрасывает модификацию

speedModifier = 0;

modiferCurrentTime = 0;

}

if (speedModifier != 0 && modiferCurrentTime <= modifierDuration)

{

temporarySpeed *= speedModifier;// Изменить скорость врага

modiferCurrentTime += (float)gameTime.ElapsedGameTime.TotalSeconds;// Обновить время модификации

}

velocity = Vector2.Multiply(direction, temporarySpeed);

position += velocity;

}

}= false;(currentHealth <= 0)= false;

}override void Draw(SpriteBatch spriteBatch)

{(alive)

{.Draw(spriteBatch, Color.Black);

}

}

}

}

 Класс игрыSystem;System.Collections.Generic;System.Linq;Microsoft.Xna.Framework;Microsoft.Xna.Framework.Audio;Microsoft.Xna.Framework.Content;Microsoft.Xna.Framework.GamerServices;Microsoft.Xna.Framework.Graphics;Microsoft.Xna.Framework.Input;Microsoft.Xna.Framework.Media;WoW2

{class Game1 : Microsoft.Xna.Framework.Game

{graphics;spriteBatch;level = new Level();waveManager;player;carButton;tankButton;toolBar;Game1()

{= new GraphicsDeviceManager(this);.RootDirectory = "Content";.PreferredBackBufferWidth = level.Width * 32;.PreferredBackBufferHeight = 32 + level.Height * 32;.ApplyChanges();= true;

}override void Initialize()

{.Initialize();

}override void LoadContent()

{= new SpriteBatch(GraphicsDevice);D topBar = Content.Load<Texture2D>("tool bar");font = Content.Load<SpriteFont>("Arial");= new Toolbar(topBar, font, new Vector2(0, level.Height * 32));D grass = Content.Load<Texture2D>("grass");D path = Content.Load<Texture2D>("path");.AddTexture(grass);.AddTexture(path);D bulletTexture = Content.Load<Texture2D>("bullet");D[] creepTexture = new Texture2D[]

{.Load<Texture2D>("Car"),.Load<Texture2D>("Tank"),

};= new Player(level, creepTexture, bulletTexture);D enemyTexture = Content.Load<Texture2D>("enemy");D healthTexture = Content.Load<Texture2D>("health bar");= new WaveManager(player, level, 24, enemyTexture,

  healthTexture);D carNormal = Content.Load<Texture2D>("GUI\\Car creep\\car button");D carHover = Content.Load<Texture2D>("GUI\\Car creep\\car hover");D carPressed = Content.Load<Texture2D>("GUI\\Car creep\\car pressed");D tankNormal = Content.Load<Texture2D>("GUI\\Tank creep\\tank button");D tankHover = Content.Load<Texture2D>("GUI\\Tank creep\\tank hover");D tankPressed = Content.Load<Texture2D>("GUI\\Tank creep\\tank pressed");= new Button(carNormal, carHover,, new Vector2(0, level.Height * 32));= new Button(tankNormal, tankHover,, new Vector2(32, level.Height * 32));.OnPress += new EventHandler(carButton_OnPress);.OnPress += new EventHandler(tankButton_OnPress);

}override void UnloadContent()

{

}void carButton_OnPress(object sender, EventArgs e)

{.NewCreepType = "Car creep";.NewCreepIndex = 0;

}void tankButton_OnPress(object sender, EventArgs e)

{.NewCreepType = "Tank creep";.NewCreepIndex = 1;

}override void Update(GameTime gameTime)

{.Update(gameTime);.Update(gameTime, waveManager.Enemies);.Update(gameTime);.Update(gameTime);.Update(gameTime);

}override void Draw(GameTime gameTime)

{.Clear(Color.CornflowerBlue);.Begin();.Draw(spriteBatch);.Draw(spriteBatch);.Draw(spriteBatch);.Draw(spriteBatch, player);.Draw(spriteBatch);.Draw(spriteBatch);.DrawPreview(spriteBatch);.End();.Draw(gameTime);

}

}

}

КлассSystem;System.Collections.Generic;System.Linq;System.Text;Microsoft.Xna.Framework;Microsoft.Xna.Framework.Graphics;WoW2

{class WaveManager

{int numberOfWaves;float timeSinceLastWave;Queue<Wave> waves = new Queue<Wave>();Texture2D enemyTexture;bool waveFinished = false;Level level;Wave CurrentWave

{{ return waves.Peek(); }

}List<Enemy> Enemies

{{ return CurrentWave.Enemies; }

}int Round

{{ return CurrentWave.RoundNumber + 1; }

}WaveManager(Player player, Level level, int numberOfWaves,D enemyTexture, Texture2D healthTexture)

{.numberOfWaves = numberOfWaves;.enemyTexture = enemyTexture;.level = level;(int i = 0; i < numberOfWaves; i++)

{initialNumberOfEnemies = 10;numberModifier = (i / 10) + 1;wave = new Wave(i, initialNumberOfEnemies * numberModifier,

player, level, enemyTexture, healthTexture);.Enqueue(wave);

}();

}void StartNextWave()

{(waves.Count > 0)

{.Peek().Start();= 0;= false;

}

}void Update(GameTime gameTime)

{.Update(gameTime);(CurrentWave.RoundOver)

{= true;

}(waveFinished)

{+= (float)gameTime.ElapsedGameTime.TotalSeconds;

}(timeSinceLastWave > 30.0f)

{.Dequeue();();

}

{.Draw(spriteBatch);

}

}

}

Класс отрисовки картыSystem;System.Collections.Generic;System.Text;Microsoft.Xna.Framework;Microsoft.Xna.Framework.Graphics;WoW

{class Level

{List<Texture2D> tileTextures = new List<Texture2D>();Queue<Vector2> waypoints = new Queue<Vector2>();[,] map = new int[,]

{

{1,0,0,0,0,0,0,0,},

{1,0,0,0,0,0,0,0,},

{1,0,0,0,0,0,0,0,},

{1,0,0,0,0,0,0,0,},

{1,0,0,0,0,0,0,0,},

{1,0,0,0,0,0,0,0,},

{1,0,0,0,0,0,0,0,},

{1,0,0,0,0,0,0,0,},

};Queue<Vector2> Waypoints

{{ return waypoints; }

}int Width

{{ return map.GetLength(1); }

}int Height

{{ return map.GetLength(0); }

}Level()

{.Enqueue(new Vector2(7, 0) * 32);.Enqueue(new Vector2(0, 0) * 32);

}int GetIndex(int cellX, int cellY)

{

// It needed to be Width - 1 and Height - 1.(cellX < 0 || cellX > Width - 1 || cellY < 0 || cellY > Height - 1)0;map[cellY, cellX];

}void AddTexture(Texture2D texture)

{.Add(texture);

}void Draw(SpriteBatch batch)

{(int x = 0; x < Width; x++)

{(int y = 0; y < Height; y++)

{

int textureIndex = map[y, x];

if (textureIndex == -1)

continue;

Texture2D texture = tileTextures[textureIndex];

batch.Draw(texture, new Rectangle(x * 32, y * 32, 32, 32), Color.White);

}

}

5. Диаграмма классов


Заключение

В результате курсовой работы была разработана игровая игра «Wall on Wall», реализующая базовый функционал данной игры, а так же простейшие алгоритмы искусственного интеллекта, позволяющие играть в одиночку.

Похожие работы на - Игровая программа 'Wall on Wall'

 

Не нашли материал для своей работы?
Поможем написать уникальную работу
Без плагиата!