КУРСОВА РОБОТА НА ТЕМУ: «Java аплети»

Зміст

Вступ………………………………………………………………………………………….3

1. HTML……………………………………………………………….5

1.1 Основи HTML………………………………………………….6

1.2 Імена HTML-файлів……………………………………………6

1.3 Вставка гіперпосилання……………………………………….7

1.4 URL……………………………………………………………..8

2. Аплети………………………………………………………………9

2.1Основи створення|створіння| аплетів…………………………………………9

2.2 Виконання аплета………………………………………………..11|

2.3 Аплети в HTML-документах…………………………………….12

3.
Розробка аплета для реалізації гри “Хрестики-нулики”. Підсистема вибору стратегії.…………………………………………………………………..13

3.1 Аналіз вимог………………………………………………………………………..13

3.2Проектування………………………………………………………………………..15

3.3 Кодування……………………………………………………………………………17

3.4 Тестування……………………………………………………………………………20

Висновок…………………………………………………………………………………..21

Список використаних джерел…………………………………………………….22

Додаток А. Схема алгоритму………………………………………………………23

Додаток Б. Текст програми…………………………………………………………24

Додаток В. Результати тестування………………………………………………32

Вступ

Одна з цілей розробки Java – це створення аплетів, які є маленькими програмами, що запускаються усередині Web браузера. Оскільки вони повинні бути безпечні, аплети обмежені в своїх можливостях. Проте аплети є могутнім інструментом для підтримки програмування на стороні клієнта – головної здатності для Web.

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

тобто, система безпеки Java часу виконання — що спостерігає за вами.

Зазвичай можна відповісти на питання, що дозволено робити аплету, поглянувши на те, для чого він призначений: розширити функціональність Web сторінки в браузері. Оскільки той, хто бродить по Internet, ніколи реально не знає, чи розташована Web сторінка дружня до нього чи ні, йому потрібний код, запуск якого безпечний. Отже він, ймовірно, відмітить величезні обмеження:

  1. Аплет не може стосуватися локального диска. Це означає запис або читання, оскільки користувач не захоче, щоб аплет прочитав і передав приватну інформацію через Internet без його дозволу. Запис, звичайно, запобігає, оскільки це відкриває доступ вірусам. Java пропонує цифровий підпис для аплетів. Багато обмежень аплетів знімаються, коли користувач погодиться довірити аплету (який підписаний джерелом, якому він довіряєте) доступ до вашої машини.
  2. Аплети займають багато часу при відображенні, оскільки користувач повиннен завантажити всі речі кожного разу, включаючи різні звернення до серверів для різних класів. Браузер може кешувати аплети, але це не гарантується. Тому, завжди потрібно пакувати свої аплети в JAR (Java Archive) файл, який комбінує всі компоненти аплета (включаючи інші .class файли разом з картинками і звуками) разом в єдиний стислий файл, який може бути завантажений в одному обігу сервера. “Цифровий підпис” можливий для кожного індивідуального входження в JAR файл.

Якщо користувач може жити усередині обмежень, аплети мають певні переваги, особливо при побудові клієнт/серверних або мережевих застосувань:

  1. Не вимагається установки. Аплет має дійсну незалежність від платформи, включаючи можливість легкого програвання звукових файлів. Фактично, інсталяція відбувається всякий раз, коли користувач завантажує Web сторінку, що містить аплет, так що оновлення відбуваються легко і автоматично. У традиційних системах за технологією клієнт/сервер будівництво і установка нових версій клієнтського програмного забезпечення часто стає жахом.
  2. Користувачу не потрібно турбуватися про поганий код, що є причиною краху чиєїсь системи, тому що система безпеки вбудована в ядро мови Java і в структуру аплета. Разом з попереднім пунктом, це робить Java популярним для, так званих, Intranet додатків клієнт/сервер, які живуть тільки в межах компанії або на обмеженій області операцій, де середовище користувача (Web броузер і доповнення) може визначати і/або управляє додатком.

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

Темою курсового проекту є розробка аплета для реалізації гри «Хрестики – нулики».

1.HTML

 

HTML-документи, призначені для публікації в Web або для читання за допомогою Web-браузера (незалежно від того, розміщені вони вже в Web-просторі або ще немає), зазвичай пишуться на мові HTML.

HTML — це скорочення від Hypertext Markup Language (мова гіпертекстової розмітки). Гіпертекст (hypertext) — це просто текст, що містить елементи, клацання мишею на яких дозволяє перейти до іншого документу. Зв’язки, які служать для переходу від одного документа до іншого, називаються посиланнями (links), або гіперпосиланнями (hyperlinks). Самі ж документи часто називають сторінками (pages), от чому основне місцеположення в Web інформаційного пакету документів, що належить окремій людині або цілій компанії, називається початковою сторінкою, або головною сторінкою, або інформаційною home-сторінкою (home page). Терміни HTML-документ (HTML document) і HTML-сторінка (HTML page) означають одне і те ж: гіпертекстовий документ, створений за допомогою мови HTML.

HTML не така розвинена мова програмування, як Java. HTML є лише колекцією простих команд, які можна вставити в сторінку тексту для подальшого перетворення в те, що можна потім проглянути за допомогою Web-браузера. Ці команди дозволяють вставляти в сторінки малюнки і гіперпосилання. Вони також дозволяють писати команди редагування, які визначають основний заголовок, підзаголовок, початок абзацу і тому подібне. Іншими словами, HTML — це, в основному, мова, призначена для редагування тексту так, щоб його можна було проглянути в Web-просторі.

  1. Основи HTML

Більшість HTML-команд мають наступну форму.

<Команда>

Деякий текст </Команда>

Наприклад, наступний HTML-код робить фразу “Моя початкова сторінка” заголовком першого рівня, тобто найбільшого із стандартних заголовків.

<Н1>

Моя початкова сторінка

</Н1>

Звернете увагу, що запис </Команда> (у даному прикладі </H1>) використовується для позначення кінця тексту, до якого застосовується дана команда.

Можна встановити дрібніші заголовки, наприклад заголовок другого рівня, заголовок третього рівня (команда НЗ) і так далі.

  1. Імена HTML-файлів

HTML-файл — це звичайний текстовий файл, який можна створити і редагувати за допомогою
будь-якого текстового редактора подібно до того, як ви пишете Java-програму. HTML-файли повинні мати розширення .html, але у всьому іншому правила привласнення імен такі ж, як для решти всіх файлів у вашій системі.

  1. Вставка гіперпосилання

Команда вставки гіперпосилання, яке може знаходитися усередині

будь-якого тексту, має наступний синтаксис.

Синтаксис

<A HREF= “Шлях до документа”>

Відображає текст на який потрібно клацнути

</А>

Приклад

<А HREF=”http://java.sun.com”>

Sun Microsystems Java website

</A>

Як елемент Шлях до документа можна використовувати повне (або відносне) ім’я шляху для файлу HTML-документа або посилання на будь-яке місце Web-простору. Якщо користувач, що проглядає HTML-документ, клацне на тексті     позначеному елементом Відображає текст на який потрібно клацнути, браузер відобразить документ, що міститься у файлі, на який вказує елемент Шлях до документа
.

  1. URL

Ім’я HTML-документа в Web-просторі пов’язують з абревіатурою URL (Uniform Resource Locator— уніфікований покажчик інформаційного ресурсу в мережі Internet). Цим ім’ям (стандартизований рядок символів) є ім’я шляху, вказуюче місцезнаходження документа в системі World Wide Web, яка охоплює всю земну кулю. Всі гіперпосилання, які використовуються в цьому розділі, є URL-вказівниками, подібними наступному.

http://java.sun.com

URL-вказівники — це абсолютні імена шляхів для документів, які територіально можуть знаходитися в будь-якому місці земної кулі. Для посилання на HTML-документи, що знаходяться на вашому власному комп’ютері, можна також використовувати відносні імена шляхів.

URL-вказівники часто починаються з букв http, які є ім’ям протоколу, використовуваного для передачі і інтерпретації HTML-документа. Більшість браузерів дозволяють опустити початкову частину URL-вказівника http: //и заповнюють її за вас.

  1. Аплети

Слово аплет (applet) означає невелике застосування (application), тобто аплети — це просто маленькі Java-програми. Але сенс, який вкладається в слово маленькі, більше пов’язаний не з розміром цих програм, а з тим, як і де вони працюють.

Аплети — це Java-програми, які можна вбудувати в HTML-документ і запустити за допомогою браузера, який проглядає цей документ.

2.1 Основи створення|створіння| аплетів

Аплет є класом, виведеним з|із| класу Japplet.| | Клас JApplet| входить до складу бібліотеки Swing|, тому, використовуючи клас Japplet|, необхідно вставити в програму наступний| оператор імпорту.

import javax.swing.*;

При створенні|створінні| аплета вам|вамва може також знадобитися бібліотека AWT|, тому варто вставити оператори імпорту|із| з наступно|такого|го повнішо|цілковитого|го списку.

import javax.swing.*;

import java.awt.*;

import Java.awt.event.*;

Аплети не мають заголовків і не потребують використання методу setvisible|. Аплети вбудовуються в HTML-документи|, і функцію відображення аплета| виконує HTML-документ|. З цієї причини аплет| заз|звично|вичай не має методу main|. У “Прикладі 1” приведений текст простого аплета|, при прогляданні якого (з|звично|азвичай ус|всередині|ередині HTML-документа|) він просто ві|відображує|дображає н|такий|аступний текст: Привіт з|із| аплета|!

Приклад 1

import j avax.swing.*;


import java.awt.*;//Для класу Container.

public class HelloApplet extends JApplet

{

public void initO

{

Container| contentPane| = getContentPane|();

contentPane.setLayout (new FlowLayout());

JLabel friendlyLabel = new JLabel(“Привіт з аплета!”);

contentPane.add(friendlyLabel);

}

}

Очевидно , що, клас JApplet має панель вмісту, і компоненти додаються не безпосередньо в клас JApplet, а на цю панель вмісту класу JApplet. Як показано в “Прикладі 1”, компонент JLabel (або будь-який інший компонент) додається в клас JApplet точно так, як і в клас JFrame.

Аплети не мають заголовків, і тому в аплеті| не потрібно використовувати метод setTitle|. Річ у тому, |справа в тому , що|що аплети| зазви|звично|чай входять до складу HTML-документів|, і можна вставити заголовок в HTML-документ|, який відоб|відображує|ражає цей аплет|. HTML-документ| також визначає і розмір аплета|, тому користувачеві не потрібно турбуватися про команди |задавання|завдання розмірів для аплета|.

Аплети зазвичай|звично| не використовують конструктори, але|та| використовують метод init|, який виконує аналогічну функцію. Створюючи аплет|, потрібно сформувати всі дії з ініціалізації (наприклад, установка кольорів, додаван|добавляти|ня кнопок, текстових полів і так далі) в методі init|. Метод init| не має параметрів.

Аплети не закриваються|зачиняють| об’єктами слухачів і тому не включають звернення до методу addWindowListener| в своїх init-методах|. Аплет закриваєть|зачиняє|ся автоматично| при закритті HTML-документа|.

Клас JApplet

Клас JApplet| — це саме той клас, який зазвича|звично|й використовується для створенн|створіння|я аплетів|. Клас JApplet| входить в бібліотеку Swing|, і тому, використовуючи його, необхідно| включати в програму аплета| наст|такого|упний оператор імпорту.

import javax.swing.*;

2.2 Виконання аплета

|

Зазвичай аплет запускається з HTML-документа, але для тестування можна запустити його за допомогою візуалізатора аплетів (applet viewer). Візуалізатор аплетів є програмою, яка автоматично поміщає ваш аплет на просту HTML-сторінку, а потім запускає його звідти. Проте візуалізатор аплетів створює враження, ніби аплет виконується подібно до будь-якої іншої програми. Якщо ви використовуєте яке-небудь інтегроване середовище, в меню якої є команда, іменована “Run Applet”, “Run” або “Execute” (а може, ще абияк), то ви можете виконати аплет як звичайну Java-програму, тобто використовуючи одну з перерахованих команд. У середовищі TextPad, а саме в меню Tools (Сервіс), передбачена команда Run Java Applet (Виконати аплет). Якщо після вибору цієї команди на екрані з’явиться вікно з пропозицією вибрати файл (Choose а file), відповідайте No (Ні). По цій команді буде автоматично викликаний візуалізатор аплетів.

Якщо вам не вдасться запустити візуалізатор| аплетів| |із|зі свого інтегрованого середови|середи|ща, то ви, без сумніву, зможете запустити візуалізатор| аплетів| за допомогою команди|, що складається всього з одного рядка. Наприклад, аплет|, наведений в “Прикладі 1”, можна запустити таким чином. appletviewer| HelloApplet|.html

Але|та| в цьому випадку користувачеві доведеться|припаде| самостійно створити HTML-документ| (у даному приклад|зразку|і він називається HelloApplet|.html) і помістити в нього тестований аплет|.

2.3 Аплети в HTML-документах

|

В HTML-документ| аплет| можна помістити таким чином. Для цього використовується байт-код аплета| (фай|із|л з розширенням .class). Якщо цей файл знаходит|перебуває|ься не в тому ж каталозі (т|папці|еці|із|) з HTML-документом|, то для файлу аплета| можна використовувати |цілковите|повне або відносне ім’я |колії|шляху. Значення ширини і висоти задаються в пікселях.

Синтаксис

< APPLET C0DE=” Ім’я_файла. class”

WlDTH=Ціле_Число НEIGHT=Ціле_Число>

</APPLET|>

Приклад|зразок|

<APPLET| CODE=”HelloApplet|.class” WIDTH=400| HEIGHT=200|>

</APPLET>

3. Розробка аплета для реалізації гри “Хрестики-нулі”. Підсистема вибору стратегії.

 

 

3.1 Аналіз вимог

 

Необхідно розробити Java-аплет для реалізації гри “Хрестики-нулики”. Необхідна наявність діалогового інтерфейсу, що дозволяє реалізувати ігровий процес між користувачем і комп’ютером.

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

  • При ідеальній грі виграти неможливо
  • Єдиний шанс виграти – створити безвихідну ситуацію. Це досягається створенням певної комбінації міток, при якій, як би ворог не походив, користувач завжди може виграти партію. Ці комбінації – заповнені 3 кутових крапки, причому між двома парами з них повинні бути порожні клітки; заповнені 2 кутові і центральна, і дотримується того ж правила.
  • З другого пункту можна зрозуміти, що існують “виграшні” позиції – це (1,1) (1,3) (3,1) (3,3) (2,2).

При формулюванні використовувалися наступні визначення:

  • Влучна – хрестик або нуль.
  • Лінія – набір з 3-х кліток.

Тепер, зрозумівши правила гри, можна реалізувати програму, що імітує супротивника.

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

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

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

Отже, варто узагальнити вищевикладене і стисло викласти кроки програми-супротивника:

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

Таким чином, можна написати алгоритм гри «Хрестики – нулики».

3.2 Проектування

 

При проектуванні гри «Хрестики – нулики», відбулося зіткнення з такою ситуацією, як реалізація програми-супротивника.

На початку потрібно ініціалізувати всі виграшні позиції.

У грі всі позиції помічені бітовою маскою. Цей біт встановлений, якщо позиція зайнята яким-небудь з гравців. Plus – це користувач, zero – програма-супротивник.

У грі “Хрестики нулики” всього 9 квадратів, отже, 1<<9 (512) можливих позицій. Таким чином, створивши масив типу Boolean з 1<<9 елементів, в нього записуємо всі виграшні позиції за допомогою процедури isWon (int pos), де як параметр передаємо виграшну позицію.

Всі виграшні позиції ініціалізували за допомогою виклику процедури isWon. Наприклад, isWon ((1<<0)|(1<<1)|(1<<2)). Видно, що в параметрах передаються позиції 0, 1 і 2, що відповідає верхньому горизонтальному ряду. Ініціалізували так всі можливі комбінації для виграшу. Також необхідно задати пріоритети квадратів для ходу програми-супротивника.

Задаємо масив int moves[ ] = {4, 0, 2, 6, 8, 1, 3, 5, 7}. Найвищим пріоритетом володіє 4 квадрат, тобто центральний. Далі слідують верхні кутові квадрати і так далі.

В ході ігрового процесу користувач, використовує мишу, для відмітки своєї позиції на ігровому полі. Тому використовуємо метод mouseReleased(MouseEvente), в якому визначуваний квадрат, зайнятий користувачем. У нім викликаються функції yourMove і myMove. Функція yourMove визначає правильність ходу користувача.

Функція myMove викликає функцію bestMove, в якій визначається кращий з доступних ходів програми. Функція працює по складеному алгоритму:

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

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

3.3 Кодування

 

Розроблена схема програми кодувалася в середовищі програмування JDK v.1.4.

Для реалізації гри використовувався Java – аплет. Ігрове поле було реалізоване за допомогою вбудованих методів мови Java, в HTML сторінці.

Тег <apрlet> використовується для запуску аплета як з HTML-документа, так і з програми appletviewer. Програма appletviewer виконує кожен знайдений ній тег <applet> в окремому вікні, тоді як браузери дозволяють розмістити на одній сторінці декілька аплетів. Синтаксис тега <APPLET> в даний час такий:

<APPLET

CODE= appletFile
OBJECT = appletSerialFile
WIDTH = pixels
HEIGHT = pixels
[ARCHIVE = jarFiles]
[CODEBASE = codebaseURL]
[ALT = alternateText]
[NAME = appletInstanceName]
[ALIGN = alignment]
[VSPACE = pixels]
[HSPACE = pixels]
>
[< PARAM NAME = AttributeNamel VALUE = AttributeValuel >]
[< PARAM NAME = AttributeName2 VALUE = AttributeValue2 >]
[HTML-текст, що відображається за відсутності підтримки Java]
</APPLET>

CODE — обов’язковий атрибут, задаючий ім’я файлу, в якому міститься відтрансльований код аплета. Ім’я файлу задається відносно codebase, тобто або від поточного каталога, або від каталога, вказаного в атрибуті CODEBASE.

OBJECT – вказує ім’я файлу, що містить серіалізованний аплет, з якого останній буде відновлений. При запуску визначенним таким чином аплета повинен викликатися не метод init(), а метод start(). Для аплета необхідно задати або атрибут CODE, або атрибут OBJECT, але задавати ці атрибути одночасно не можна.

WIDTH і HEIGHT — обов’язкові атрибути, задаючі початковий розмір видимої області аплета.

CODEBASE — необов’язковий атрибут, що задає базовий URL код аплета, є каталогом, в якому виконуватиметься пошук виконуваного файлу аплета (що задається в CODE). Якщо цей атрибут не заданий, за замовчуванням використовується каталог даного HTML-документа. CODEBASE не обов’язково повинен вказувати на той же вузол, з якого був завантажений HTML-документ.

Ознака ALT — необов’язковий атрибут, задаючий коротке текстове повідомлення, яке повинно бути виведене в тому випадку, якщо використовуваний браузер розпізнає синтаксис тега <applet>, але виконувати аплети не уміє. Це не те ж саме, що HTML-текст, який можна вставляти між <applet> і </applet> для браузерів, що взагалі не підтримують аплетів.

Порядок ініціалізації аплета:

Метод init викликається першим. У нім повинні ініціалізувати змінні.

Метод paint викликається кожного разу при пошкодженні аплета. AWT стежить за поляганням вікон в системі і помічає такі випадки, як, наприклад, перекриття вікна аплета іншим вікном. У таких випадках, після того, як аплет знову виявляється видимим, для відновлення його зображення викликається метод paint.

Метод repaint використовується для примусового перемальовувуння аплета. Цей метод, у свою чергу, викликає метод update.

import java.awt.*;

import java.awt.event.*;

import java.awt.image.*;

import java.net.*;

import java.applet.*;

Необхідно підключити всі методи класу applet, net, awt, awt.event, awt.image необхідні при роботі з графікою, зображенням і мишею.

Для реалізації ігрового процесу, за допомогою миші використовується процедури addMouseListener, mouseReleased і removeMouseListener.

Текст програми приведений в додатку Б.

Схема алгоритму представлена в додатку А.


Малюнок 1 – Ієрархічна схема програми PlusAndZero.

3.4 Тестування

Правильність роботи аплета перевірена методом функціонального тестування.

Тестування проводилося на комп’ютерах з архітектурою Intel x86 і ОС Windows XP.

Критерії тестування:

  • Після запуску аплета на екрані повинна бути намальовано ігрове поле, що складається з 9 квадратів. Якщо на комп’ютері не встановлена віртуальна машина Java, повинна бути видана інформація про те, що потрібно встановити Java.
  • Протягом ігрового процесу, перевірити можливість заміни користувачем квадрата, зайнятим програмою-супротивником, своїм знаком.
  • Програма – супротивник повинна закривати небезпечні позиції, що загрожують програшем, своїм знаком.
  • Програма повинна будувати виграшні комбінації.
  • Намагатися створити безвихідну ситуацію для користувача.
  • Право першого ходу повинне передаватися поперемінно користувачеві і програмі-супротивникові.

Результати тестування приведені в додатку В.

ВИСНОВКИ

 

В результаті виконання курсового проектування був розроблений JAVA-аплет для реалізації гри “Хрестики-нулики”.

Розробка проводилася на мові програмування Java. Початковий текст відкомпілювався за допомогою середовища JDK v.1.4.

Розробка проведена з використанням операційної системи MS Windows XP на персональному комп’ютері з Intel x86 архітектурою.

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

СПИСОК ВИКОРИСТАНИХ ДЖЕРЕЛ

 

  1. Джон Родли Создание Java-апплетов.- The Coriolis Group,Inc.,1996, Издательство НИПФ “ДиаСофт Лтд.”,1996
  2. Нотон П.JAVA:Справ.руководство:Пер.с англ./Под ред.А.Тихонова.-М.:БИНОМ:Восточ.Кн.Компания,1996:Восточ.Кн.Компания.-447с..-(Club Computer)
  3. Ноутон П., Шилдт Г. Java 2: Пер. с англ. – СПб.: БХВ – Петербург, 2003. – 1072 с.
  4. Уолтер Савитч Язык JAVA Курс программирования ,2 издання, издатильский дом “Вильямс”, Москва, 2002. – 928 с.
  5. David Flanagan Java in a Nutshell – O’Reilly & Associates, 1997

ДОДАТОК А

Схема алгоритму.


ДОДАТОК Б

Початковий текст програми

import java.awt.*;

import java.awt.event.*;

import java.awt.image.*;

import java.net.*;

import java.applet.*;

public

class PlusAndZero extends Applet implements MouseListener

{

int zero;

int plus;

final static int moves[] = {4, 0, 2, 6, 8, 1, 3, 5, 7};

static boolean won[] = new boolean[1 << 9]; // 1<<9 = 512

static final int DONE = (1 << 9) – 1; // 511

static final int OK = 0;

static final int WIN = 1;

static final int LOSE = 2;

static final int STALEMATE = 3;

boolean first = true;

Image zeroImage;

Image plusImage;

Image emptyImage;


/* Оцінка усіх позицій з бітами, які ставляться,как виграшні,*/


static void isWon(int pos)

{

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

{

if ((i & pos) == pos)

{

won[i]= true;


}

}

}

/* Ініціалізація всіх виграшних позицій,*/


static

{


isWon((1 << 0) | (1 << 1) | (1 << 2));


isWon((1 << 3) | (1 << 4) | (1 << 5));


isWon((1 << 6) | (1 << 7) | (1 << 8));


isWon((1 << 0) | (1 << 3) | (1 << 6));


isWon((1 << 1) | (1 << 4) | (1 << 7));


isWon((1 << 2) | (1 << 5) | (1 << 8));


isWon((1 << 0) | (1 << 4) | (1 << 8));


isWon((1 << 2) | (1 << 4) | (1 << 6));

}

/* Визначення програмою кращого ходу і повернення значення вибраного ходу,*/


int bestMove(int zero, int plus)

{

int bestmove = -1;

loop:

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

{

int mw = moves[i];

if (((zero & (1 << mw)) == 0) && ((plus & (1 << mw)) == 0))

{

int pw = zero | (1 << mw);

if (won[pw])


{

//Якщо можливий виграшний хід


return mw;

}

//Якщо немає виграшного ходу програма оцінюємо можливий (такий, щоб не виграв гравець)


for (int mb = 0 ; mb < 9 ; mb++)

{

if (((pw & (1 << mb)) == 0) && ((plus & (1 << mb)) == 0))

{

int pb = plus | (1 << mb);

if (won[pb])

{

// виграє гравець

continue loop;

}

}

}

if (bestmove == -1)

{

bestmove = mw;

}

}

}

if (bestmove != -1)

{

return bestmove;


}

// Якщо програма програє


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


{

int mw = moves[i];

if (((zero & (1 << mw)) == 0) && ((plus & (1 << mw)) == 0))


{


return mw;

}

}

// Більше ходів немає


return -1;

}

// Хід Гравця. Повертання значення “істина” якщо хід можливий


boolean yourMove(int m)

{

if ((m < 0) || (m > 8))

{

return false;

}

if (((plus | zero) & (1 << m)) != 0)

{

return false;

}

plus |= 1 << m;

return true;


}

// Хід Комп’ютера. Повертання значення “істина” якщо хід можливий

     boolean myMove()

{

if ((plus | zero) == DONE)

{

return false;

}

int best = bestMove(zero, plus);

zero |= 1 << best;


return true;

}

// Визначення положення, що створилося


int status()

{

if (won[zero])

{

return WIN;

}

if (won[plus])

{

return LOSE;

}

if ((plus | zero) == DONE)

{

return STALEMATE;

}

return OK;

}

public void init()

{

zeroImage = getImage(getCodeBase(), “zero.jpg”);

plusImage = getImage(getCodeBase(), “plus.jpg”);

emptyImage = getImage(getCodeBase(), “empty.jpg”);

addMouseListener(this);

}

public void destroy()

{

removeMouseListener(this);

}

public void paint(Graphics g)

{

Dimension d = getSize();

int xoff = d.width / 3;

int yoff = d.height / 3;

g.setColor(Color.decode(“#8322EE”));

g.drawRect(0,0,d.width-1,d.height-1);

g.drawRect(1,1,d.width-3,d.height-3);

g.drawLine(xoff, 0, xoff, d.height); g.drawLine(xoff+1, 0, xoff+1, d.height);

g.drawLine(2*xoff, 0, 2*xoff, d.height); g.drawLine(2*xoff+1, 0, 2*xoff+1, d.height);

g.drawLine(0, yoff+1, d.width, yoff+1); g.drawLine(0, yoff, d.width, yoff);

g.drawLine(0, 2*yoff, d.width, 2*yoff); g.drawLine(0, 2*yoff+1, d.width, 2*yoff+1);

int i = 0;

for (int r = 0 ; r < 3 ; r++)

{

for (int з = 0 ; з < 3 ; c++, i++)

{

if ((zero & (1 << i)) != 0)

{

g.drawImage(zeroImage, c*xoff + 2, r*yoff + 2, this);

}

else if ((plus & (1 << i)) != 0)

{

g.drawImage(plusImage, c*xoff + 2, r*yoff + 2, this);

}

else

{

g.drawImage(emptyImage, c*xoff + 2, r*yoff + 2, this);


}

}

}

}

// Простановка хрестиків і нулів в аплеті (і визначення чи був хід можливий, тобто здійснений у вікні аплета)


public void mouseReleased(MouseEvent e)

{

int x = e.getX();

int у = e.getY();

switch (status())

{

case WIN:

case LOSE:

case STALEMATE:

zero = plus = 0;

if (first)

{

zero |= 1 << (int)(Math.random() * 9);

}

first = !first;

repaint();


return;

}

// Визначення послідовності ходів і закінчення гри. І також прописуємо хід гравця


Dimension d = getSize();


int з = (x * 3) / d.width;


int r = (у * 3) / d.height;


if (yourMove(з + r * 3))

{

repaint();

switch (status())

{

case WIN:

case LOSE:

case STALEMATE:

break;

default:

if (myMove())

{

repaint();

}

}

}

}

public void mousePressed(MouseEvent e)

{

}

public void mouseClicked(MouseEvent e)

{

}

public void mouseEntered(MouseEvent e)

{

}

public void mouseExited(MouseEvent e)


{

}

}

Індивідуальна частина програми


int zero;


int plus;

final static int moves[] = {4, 0, 2, 6, 8, 1, 3, 5, 7};

static boolean won[] = new boolean[1 << 9]; // 1<<9 = 512

static final int DONE = (1 << 9) – 1; // 511

static final int OK = 0;

static final int WIN = 1;

static final int LOSE = 2;

static final int STALEMATE = 3;

boolean first = true;


/* Оцінка всіх позицій з бітами, які ставляться,як виграшні,*/


static void isWon(int pos)

{

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

{

if ((i & pos) == pos)

{

won[i]= true;


}

}

}

/* Ініціалізація усіх виграшних позицій,*/


static

{


isWon((1 << 0) | (1 << 1) | (1 << 2));


isWon((1 << 3) | (1 << 4) | (1 << 5));


isWon((1 << 6) | (1 << 7) | (1 << 8));


isWon((1 << 0) | (1 << 3) | (1 << 6));


isWon((1 << 1) | (1 << 4) | (1 << 7));


isWon((1 << 2) | (1 << 5) | (1 << 8));


isWon((1 << 0) | (1 << 4) | (1 << 8));


isWon((1 << 2) | (1 << 4) | (1 << 6));

}

/* Визначення програмою кращого ходу і повернення значення вибраного ходу,*/


int bestMove(int zero, int plus)

{

int bestmove = -1;

loop:

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

{

int mw = moves[i];

if (((zero & (1 << mw)) == 0) && ((plus & (1 << mw)) == 0))

{

int pw = zero | (1 << mw);

if (won[pw])


{

//Якщо можливий виграшний хід


return mw;

}

//Якщо немає виграшного ходу програма оцінює можливий (такий, щоб не виграв гравець)


for (int mb = 0 ; mb < 9 ; mb++)

{

if (((pw & (1 << mb)) == 0) && ((plus & (1 << mb)) == 0))

{

int pb = plus | (1 << mb);

if (won[pb])

{

// виграє гравець

continue loop;

}

}

}

if (bestmove == -1)

{

bestmove = mw;

}

}

}

if (bestmove != -1)

{

return bestmove;


}

// Якщо програма програє


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


{

int mw = moves[i];

if (((zero & (1 << mw)) == 0) && ((plus & (1 << mw)) == 0))


{


return mw;

}

}

// Більше ходів немає


return -1;

}

// Хід Гравця. Повертання значення “істина” якщо хід можливий


boolean yourMove(int m)

{

if ((m < 0) || (m > 8))

{

return false;

}

if (((plus | zero) & (1 << m)) != 0)

{

return false;

}

plus |= 1 << m;

return true;


}

// Хід Комп’ютера. Повертання значення “істина” якщо хід можливий


boolean myMove()

{

if ((plus | zero) == DONE)

{

return false;

}

int best = bestMove(zero, plus);

zero |= 1 << best;


return true;

}

// Визначення положення, що створилося


int status()

{

if (won[zero])

{

return WIN;

}

if (won[plus])

{

return LOSE;

}

if ((plus | zero) == DONE)

{

return STALEMATE;

}

return OK;

}

ЗАВАНТАЖИТИ

Для скачування файлів необхідно або Зареєструватись

Java (58.0 KiB, Завантажень: 7)

завантаження...
WordPress: 23.49MB | MySQL:26 | 0,349sec