Гра "п`ятнашки", написана мовою C#

 

Введення


Даний програмний продукт є розвиваючою грою пятнашки, написаною мовою C# за усіма правилами та стандартами нового Windows Metro інтерфейсу. Мета гри - переміщаючи пластинки по коробці добитися впорядковування їх по номерах, бажано зробивши якомога менше переміщень. Ця задача реалізується за допомогою зручного, інтуїтивно зрозумілого користувачеві інтерфейсу. Користування даним програмним продуктом не потребує якихось спеціальних знань у користуванні ПК і рекомендується усім користувачам, незалежно від їх рівня знання ПК.

1. Опис актуальності, цілей завдань розроблюваного ПЗ, його призначення й галузь застосування


Даний курсовий проект реалізує можливість складання головоломки пятнашки. Программа автоматично розповсюджує числа від 1 до 15 між шістнадцятьма квадратами. Якщо користувач бажає змінити розклад чисел, він завжди може це зробити, натиснувши кнопку «Нова гра».

Ця гра є актуальною вже 134 роки. Багато дітей шкільного віку збирають цю головоломку тисячі разів. Зважаючи на сучасні тенденції, коли майже кожний має дома компютер або ноутбук, розробка цієї головоломки повністю виправдовує себе.

Метою розробки цієї гри є бажання створити нескладну, необтяжену зайвими функціями програму для зручного складання головоломки. Призначена для користування на домашніх ПК користувачами з будь-яким рівнем знання компютера та будь-якого віку.

2. Огляд програмних продуктів, що мають аналогічні цілі й призначення


Аналогів даного програмного продукту у світі існує велика кількість. Адже вже видумано багато розвиваючих головоломок та ігор. Основні вимоги: простота у використанні та зручний дизайн. Можна роздивитися найбільш популярні з них.


2.1 Судоку


Судоку - заснована на логіці японська головоломка з числами. В перекладі з японської мови «су» позначає слово «число», «доку» має безліч різних перекладів, але в цілому означає щось одне, одиничне, цілісне. Мета головоломки - необхідно заповнити вільні клітинки цифрами від 1 до 9 так, щоб в кожному рядку, в кожному стовпці і в кожному малому квадраті 3Ч3, кожна цифра зустрічалася лише один раз. Правильна головоломка має лише одне рішення.


Малюнок 2.1 Судоку

Короткі відомості про функціонал програми:

-має декілька рівнів складності;

-має можливість самому розробити головоломку;

-має підказки;

-є ведення статистики.

Я вважаю, що недоліків у програми немає. Програма регулярно обновлюється, що свідчить про те, що ймовірних недоліків стає ще менше.


2.2 Кубик Рубіка


Кубик Рубіка - механічна головоломка, яку винайшов у 1974 році угорський скульптор та винахідник Ерньо Рубік. Метою головоломки є складення граней кубика відповідно до кольорів.


Малюнок 2.2 Кубик Рубіка


Основні можливості програми:

-можливість змінювати фоновий малюнок;

-можливість програвання на фоні своєї музики;

-можливість змінювати текстури кубика;

-можливість змінювати розмір кубика.

Не зважаючи на можливість зміни кольорової гамми програмного забезпечення, до недоліків я б віднесла замалий розмір деяких кнопок та рекламу.

3. Розробка інтерфейсу по й короткий опис основних елементів керування


На основі п.2 і п.3 було визначено, що розробка пятнашок буде перспективним явищем. На даному етапі програмний продукт доволі простий і не обтяжений зайвими функціями, а лише основними, які дають можливість зібрати головоломку. Але є можливість розвивати даний проект, розроблювати нові функції та поповнювати список можливостей. Це зумовить поповнення аудиторії, що буде користуватися даним програмним продуктом. Розглянемо функціональні можливості даної програми.


3.1 Опис призначення основних вікон додатка, елементів керування, розташованих на них елементів угрупування


При завантаженні програми відкривається головне вікно, у якому містяться всі важливі елементи керування, а саме:

кнопка «Нова гра»;

кнопка «Допомога»;

скрита кнопка «Поділитися», яка стає доступною після правильного складання головоломки.


Малюнок 3.1. Головне вікно програми.

3.2 Опис функціональності ПО й способів взаємодії користувача з ним


Даний програмний продукт є прикладом реалізації багатовіконного інтерфейсу, так як складається з головного вікна та двох дочірніх вікон - відправки результатів своєї гри по e-mail та інформації.


Малюнок 3.2. Вікно інформації.


Малюнок 3.3. Вікно відправки результатів.


Розглянемо детальніше елементи керування, представлені у головному вікні програми та функції, які вони виконують.

Для того, щоб до розпочати нову гру, треба натиснути кнопку «Нова гра».


Малюнок 3.4. Кнопка «Нова гра».


Коли головоломку буде успішно складено, зявиться кнопка «Поділитися», яка дозволить відправити результати вашої гри по e-mail.


Малюнок 3.5. Кнопка «Поділитися».


Для того, аби ознайомитись з інформацією про розробника та проглянути довідку необхідно натиснути на кнопку «Допомога»


Малюнок 3.6. Кнопка «Допомога».

Функціонально програму можна представити у вигляді блок-схеми.


Малюнок 3.7. Блок-схема.


.3 Опис принципів композиції та організації елементів керування та візуалізації


Вдалий вибір візуальних атрибутів, відображених на екрані, має важливіше значення, ніж просто гарний зовнішній вигляд програми. Якість візуального проектування в значній мірі впливає на психофізіологічний стан користувача та на ефективність його роботи в цілому. Як наслідок, навіть потужний по своїм можливостям програмний продукт може виявитися недостатньо функціональним, якщо візуальне відображення його інтерфейсу задовольняє необхідним вимогам. У грі пятнашки були прийняті до уваги особливості сприйняття кольорів людиною.

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

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

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

4. Розробка алгоритмів і блок-схем, що описують функціональність ПЗ


Розглянемо детальніше деякі функції ПЗ.

Блок-схема для функції Scrambles(), що виконується при натисненні кнопки «Нова гра».


Малюнок 4.1. Функція що розпочинає нову гру

При натисненні на будь-який квадрат відбуваються наступні операції:

п`ятнашки гра програмний інтерфейс

Малюнок 4.2. Переміщення числа

5. Розробка прикладного програмного забезпечення


Програма складається з одного класу - BlankPage. У даному класі реалізовані всі необхідні функції для роботи з головоломкою: почати нову гру, переміщати числа на полі та проглянути довідку.

Розглянемо детальніше структуру цього класу:

Методи:

public BlankPage() - Конструктор;

void _timer_Tick(object sender, object e)- функція таймеру

public void NewGame()- функція, що розпочинає нову гру

Border FindStackPanelByTagId(int tag)- пошук квадрата за позицією

int FindEmptyItemPosition() - пошук квадрата без числа

int FindItemValueByPosition(int position)- функція що повертає положення числа на полі

void Scrambles() - функція заповнення поля числами

void CheckBoard()- функція перевірки вірності збору головоломки

bool CheckIfSolvable()- функція, що перевіряє чи можливо розвязати головоломку

Border CanMove(UIElement itemToMove)- перевірка на можливість руху для числа

private void UserControl_Loaded(object sender, RoutedEventArgs e)- загрузка вікна.

private void UserControl_PointerPressed(object sender, Windows.UI.Xaml.Input.PointerEventArgs e)- переміщення чисел на полі

private void CreateFadeOutAnimation(UIElement btn) - створення анімації.

private void btnnewGame_Click(object sender, RoutedEventArgs e) - опис дій, після натискання користувачем кнопки «Нова гра»

void DisplayToastWithImage() - нотифікація о перемозі

void _dataTransferManager_DataRequested(DataTransferManager sender, DataRequestedEventArgs args) - функція, що дозволяє переслати результати своєї гри по e-mail.

private void btnHelp_Click_1(object sender, RoutedEventArgs e) - функція, що зображує вікно з інформацією

private void Page_Tapped_1(object sender, TappedRoutedEventArgs e) - функція, що скриває вікно з інформацією

Поля:

private readonly int[] _bordersNums = { 0, 4, 8, 12, 3, 7, 11, 15 };readonly Random _rnd;readonly DispatcherTimer _timer;int _moves; DateTime _startTime;

Висновки

п`ятнашки гра програмний інтерфейс

Дане програмне забезпечення було створено з метою надання користувачам програми, яка дозволяє зібрати пятнашки.

Для цього користувачеві надане просте у використанні програмне забезпечення. Це зумовлено тим, що його інтерфейс аналогічний до багатьох інших ігор, а тому інтуїтивно зрозумілий для багатьох користувачів.

Список літератури


.С. Байдачний, Windows 8 для С# розробників. - К., 2012. - 277с, ил.

2.М. Мак-Дональд, Windows Presentation Foundation у .NET 4 - СПб.: Вильямс, 2011. - 1019с.: ил.

3.Веб-ресурс: <http://www.google.com/webhp?hl=ru&tab=Tw&q=%D1%80%D1%83%D0%BA%D0%BE%D0%B2%D0%BE%D0%B4%D1%81%D1%82%D0%B2%D0%BE>

Додаток 1


Тексти (лістинги) розробленого програмного забезпечення


//файл BlankPage.xaml

<Page x:Class="PuzzleMetro.BlankPage" xmlns="#"justify"></Page>

//файл BlankPage.xaml.csSystem;System.Collections.Generic;System.ComponentModel;System.IO;System.Linq;Windows.ApplicationModel.DataTransfer;Windows.Data.Xml.Dom;Windows.Foundation;Windows.Foundation.Collections;Windows.UI;Windows.UI.Notifications;Windows.UI.Popups;Windows.UI.Xaml;Windows.UI.Xaml.Controls;Windows.UI.Xaml.Controls.Primitives;Windows.UI.Xaml.Data;Windows.UI.Xaml.Input;Windows.UI.Xaml.Media;Windows.UI.Xaml.Media.Animation;Windows.UI.Xaml.Navigation;PuzzleMetro

{ public sealed partial class BlankPage : Page { private readonly int[] _bordersNums = { 0, 4, 8, 12, 3, 7, 11, 15 }; private readonly Random _rnd; private readonly DispatcherTimer _timer; private int _moves; private DateTime _startTime; BlankPage rootPage = null; public BlankPage() { InitializeComponent(); _rnd = new Random(); _timer = new DispatcherTimer(); _timer.Tick +=_timer_Tick; _timer.Interval = new TimeSpan(0, 0, 0, 1); _dataTransferManager = DataTransferManager.GetForCurrentView(); _dataTransferManager.DataRequested += new TypedEventHandler<DataTransferManager, DataRequestedEventArgs>(_dataTransferManager_DataRequested); } void _timer_Tick(object sender, object e) { var time = DateTime.Now - _startTime; txtTime.Text = string.Format("{0:00}:{1:00}:{2:00}",time.Hours, time.Minutes, time.Seconds); } public void NewGame() { _moves = 0; txtMoves.Text = "0"; txtTime.Text = "00:00:00"; Scrambles(); while (!CheckIfSolvable()) { Scrambles(); } _startTime = DateTime.Now; _timer.Start(); } // поиск и возврат квадрата по позиции Border FindStackPanelByTagId(int tag) { if (tag == 16) { return (from stackPanel in ContentPanel.Children.OfType<Border>() where stackPanel.Child == null select stackPanel).First(); } else { foreach (Border b in ContentPanel.Children) { if (b.Child != null && Convert.ToInt32(((TextBlock)b.Child).Text) == tag) return b; } } return null; } // поиск элемента без числа int FindEmptyItemPosition() { int index = 15; for (int i = 0; i < 15; i++) { if (((Border)ContentPanel.Children[i]).Child != null) return index; index--; } return 0; } // возвращает число по позиции элемента, если числа нет - возвращает 16 int FindItemValueByPosition(int position) { return ((Border)ContentPanel.Children[position]).Child != null ? Convert.ToInt32(((TextBlock)((Border)ContentPanel.Children[position]).Child).Tag) : 16; } // алгоритм подбора элементов для хранения void Scrambles() { var count = 0; while (count < 25) { var a = _rnd.Next(1, 17); var b = _rnd.Next(1, 17); if (a == b) continue; var stack1 = FindStackPanelByTagId(a); var stack2 = FindStackPanelByTagId(b); if (a == 16) { var image2 = stack2.Child; stack2.Child = null; stack1.Child = image2; } else if (b == 16) { var image1 = stack1.Child; stack1.Child = null; stack2.Child = image1; } else { var image1 = stack1.Child; var image2 = stack2.Child; stack1.Child = null; stack2.Child = null; stack1.Child = image2; stack2.Child = image1; } count++; } } // проверка правильности void CheckBoard() { var index = 1; for (var i = 15; i > 0; i--) { if (FindItemValueByPosition(i) != index) return; index++; } _timer.Stop(); DisplayToastWithImage(); btnShare.Visibility = Windows.UI.Xaml.Visibility.Visible; } // проверка на возможность решения bool CheckIfSolvable() { var n = 0; for (var i = 15; i > 0; i--) { if (!(ContentPanel.Children[i] is StackPanel)) continue; var num1 = FindItemValueByPosition(i); var num2 = FindItemValueByPosition(i - 1); if (num1 > num2) { n++; } } var emptyPos = FindEmptyItemPosition(); return n % 2 == (emptyPos + emptyPos / 4) % 2 ? true : false; } /// <summary> /// Move Item From One SpackPanel to Another. /// </summary> /// <param name="item">Gets the Image item you want to move</param> /// <param name="targetPanel">Destination StackPanel</param> void MoveItem(TextBlock item, Border targetPanel) { foreach (var stackPanel in ContentPanel.Children.OfType<Border>().Where(stackPanel => stackPanel.Child != null && ((TextBlock)stackPanel.Child).Text == ((TextBlock)item).Text)) { stackPanel.Child = null; } targetPanel.Child = item; } // возвращает позиции элементов, если они находятся по краям bool IsBorderSwich(int a, int b) { return _bordersNums.Contains(a) && _bordersNums.Contains(b); } // проверка на возможность передвижения Border CanMove(UIElement itemToMove) { var val = ((TextBlock)itemToMove).Text; var count = ContentPanel.Children.Count; for (var i = 0; i < count; i++) { if (!(ContentPanel.Children[i] is Border)) continue; var stakePanel = (Border)ContentPanel.Children[i]; if (stakePanel.Child != null && ((TextBlock)stakePanel.Child).Text != val) continue; if (!IsBorderSwich(i, i + 1) && i + 1 <= 15 && ContentPanel.Children[i + 1] != null && ((Border)ContentPanel.Children[i + 1]).Child == null) return ((Border)ContentPanel.Children[i + 1]); if (!IsBorderSwich(i, i - 1) && i - 1 > -1 && ContentPanel.Children[i - 1] != null && ((Border)ContentPanel.Children[i - 1]).Child == null) return ((Border)ContentPanel.Children[i - 1]); if (i + 4 <= 15 && ContentPanel.Children[i + 4] != null && ((Border)ContentPanel.Children[i + 4]).Child == null) return ((Border)ContentPanel.Children[i + 4]); if (i - 4 > -1 && ContentPanel.Children[i - 4] != null && ((Border)ContentPanel.Children[i - 4]).Child == null) return ((Border)ContentPanel.Children[i - 4]); } return null; } // при загрузке приложения private void UserControl_Loaded(object sender, RoutedEventArgs e) { NewGame(); } private void UserControl_PointerPressed(object sender, Windows.UI.Xaml.Input.PointerEventArgs e) { var item = (UIElement)e.OriginalSource; TextBlock work = null; Border border = null; if (item is Border) { border = item as Border; if (border.Child != null) { work = border.Child as TextBlock; } else return; } else if (item is TextBlock) { work = item as TextBlock; border = work.Parent as Border; } else return; var to = CanMove(work); if (to != null) { _moves++; txtMoves.Text = _moves.ToString(); CreateFadeOutAnimation(work); MoveItem(work, to); CreateFadeInAnimation(work); CheckBoard(); } } private void CreateFadeOutAnimation(UIElement btn) { Duration dur = new Duration(TimeSpan.FromSeconds(2)); var da = new DoubleAnimation(); da.From = 1; da.To = 0; var sb = new Storyboard(); sb.Duration = dur; sb.Children.Add(da); Storyboard.SetTarget(da, btn); Storyboard.SetTargetProperty(da, "(Opacity)"); sb.Begin(); } private void CreateFadeInAnimation(UIElement btn) { Duration dur = new Duration(TimeSpan.FromSeconds(2)); var da = new DoubleAnimation(); da.From = 0; da.To = 1; var sb = new Storyboard(); sb.Duration = dur; sb.Children.Add(da); Storyboard.SetTarget(da, btn); Storyboard.SetTargetProperty(da, "(Opacity)"); sb.Begin(); } private void btnnewGame_Click(object sender, RoutedEventArgs e) { NewGame(); } void DisplayToastWithImage() { XmlDocument toastXml = ToastNotificationManager.GetTemplateContent(ToastTemplateType.ToastText01); XmlNodeList textElements = toastXml.GetElementsByTagName("text"); foreach (IXmlNode toastTextAttr in textElements) { toastTextAttr.InnerText = "Поздравляем, Вы выиграли!"; } ToastNotification toast = new ToastNotification(toastXml); ToastNotificationManager.CreateToastNotifier().Show(toast); } private DataTransferManager _dataTransferManager; void _dataTransferManager_DataRequested(DataTransferManager sender, DataRequestedEventArgs args) { args.Request.Data.Properties.Title = "Metro Puzzle"; args.Request.Data.Properties.Description = "Делюсь победой.."; args.Request.Data.SetText(string.Format("Только что прошел пятнашки за {0} ходов и {1}, думаешь сможешь лучше?", txtMoves.Text, txtTime.Text)); } private void btnGame_Click(object sender, RoutedEventArgs e) { NewGame(); btnShare.Visibility = Windows.UI.Xaml.Visibility.Collapsed; } private void btnShare_Click(object sender, RoutedEventArgs e) { DataTransferManager.ShowShareUI(); btnShare.Visibility = Windows.UI.Xaml.Visibility.Collapsed; } private void btnHelp_Click_1(object sender, RoutedEventArgs e) { Duration dur = new Duration(TimeSpan.FromSeconds(2)); var da = new DoubleAnimation(); da.From = 0; da.To = 1; var sb = new Storyboard(); sb.Duration = dur; sb.Children.Add(da); Storyboard.SetTarget(da, Info); Storyboard.SetTargetProperty(da, "(Opacity)"); if (Info.Opacity == 0) { sb.Begin(); } } private void Page_Tapped_1(object sender, TappedRoutedEventArgs e) { Duration dur = new Duration(TimeSpan.FromSeconds(2)); var da = new DoubleAnimation(); da.From = 1; da.To = 0; var sb = new Storyboard(); sb.Duration = dur; sb.Children.Add(da); Storyboard.SetTarget(da, Info); Storyboard.SetTargetProperty(da, "(Opacity)"); if (Info.Opacity == 1) { sb.Begin(); } } }

}


Введення Даний програмний продукт є розвиваючою грою пятнашки, написаною мовою C# за усіма правилами та стандартами нового Windows Metro інтерфейсу. Мета

Больше работ по теме:

КОНТАКТНЫЙ EMAIL: [email protected]

Скачать реферат © 2017 | Пользовательское соглашение

Скачать      Реферат

ПРОФЕССИОНАЛЬНАЯ ПОМОЩЬ СТУДЕНТАМ