Текст програми

Тут я коротко опишу програму, тому що в тексті програми аплету є багато коментарів, які допоможуть вам зрозуміти, як вона работаетАпплет буде використовувати BorderLayout, у верхній частіокна буде раположена кнопка New  Game” У центрі вікна будуть розташовуватися девять кнопок, представляють клітини поля, а в нижній частині будуть відображатися повідомлення:

Всі компоненти вікна будуть створюватися в методі аплету init () Всі події будуть оброблятися слухачем ActionListener в методі actionPerformed () Метод lookForWinner () буде викликатися після кожного ходу, щоб перевірити, чи закінчилася гра

Останні три правила нашої стратегії запрограмовані в методі computerMove (), якому може знадобитися генерувативипадкові числа Це робиться за допомогою класу Java Math і його методу random ()

Вам також може здатися незвичайним синтаксис, коли кілька методів викликаються в одному вираженні, Наприклад:

if(squares[0]getLabel()equals(squares[1]getLabel())){…}

Цей рядок робить програму коротше, тому що в ній виробляються такі ж дії, які могли бути зроблені в наступних рядках: String label0 = squares [0] GetLabel () String label1 = squares [1] GetLabel ()

if(label0equals(label1)){…}

Java обчислює вираз в дужках, перш ніж виробляти будь-які інші обчислення Коротка версія цього тексту програми спочатку отримує результат вирази в дужках, і відразу ж використовує його як аргумент для методу equals (), який застосовується для результату першого виклику getLabel ()

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

/**

* Гра хрестики-нулики на дошці 3×3

*/

import javaawt*

import javaawtevent*

import javaappletApplet

public class TicTacToe extends Applet implements ActionListener{ Button squares[]

Button newGameButton

Label score

int emptySquaresLeft=9

/**

* Метод init – це конструктор аплету

*/

public void init(){

/ / Встановлюємо менеджер розташування аплету, шрифт і колір

thissetLayout(new BorderLayout())

thissetBackground(ColorCYAN)

/ / Змінюємо шрифт аплету так, щоб він був жирним

/ / І мав розмір 20

Font appletFont=new Font(&quotMonospased&quot,FontBOLD, 20)

thissetFont(appletFont)

/ / Створюємо кнопку New Game і реєструємо в ній

/ / Слухач дії

newGameButton=new Button(&quotNew Game&quot)

newGameButtonaddActionListener(this) Panel topPanel=new Panel()

topPaneladd(newGameButton)

thisadd(topPanel,&quotNorth&quot) Panel centerPanel=new Panel()

centerPanelsetLayout(new GridLayout(3,3))

thisadd(centerPanel,&quotCenter&quot)

score=new Label(&quotYour turn&quot)

thisadd(score,&quotSouth&quot)

/ / Створюємо масив, щоб зберігати посилання на 9 кнопок

squares=new Button[9]

/ / Створюємо кнопки, зберігаємо посилання на них у масиві

/ / Реєструємо в них слухач, фарбуємо їх

/ / В помаранчевий колір і додаємо на панель

for(int i=0i&lt9i++){

squares[i]=new Button() squares[i]addActionListener(this) squares[i]setBackground(ColorORANGE) centerPaneladd(squares[i])

}

}

/**

* Цей метод буде обробляти всі події

* @param ActionEvent обєкт

*/

public void actionPerformed(ActionEvent e) { Button theButton = (Button) egetSource()

/ / Це кнопка New Game

if (theButton ==newGameButton){

for(int i=0i&lt9i++){

squares[i]setEnabled(true) squares[i]setLabel(&quot&quot) squares[i]setBackground(ColorORANGE)

}

emptySquaresLeft=9 scoresetText(&quotYour turn&quot) newGameButtonsetEnabled(false)

return / / Виходимо з методу

}

String winner = &quot"

/ / Це одна з клітин

for ( int i=0 i&lt9 i++ ) {

if (  theButton == squares[i] ) {

squares[i]setLabel(&quotX&quot)

winner = lookForWinner()

if(&quot&quot.equals(winner)){

endTheGame()

} else {

computerMove()

winner = lookForWinner()

if ( &quot&quot.equals(winner)){

endTheGame()

}

}

break

}

} / / Кінець циклу for

if ( winnerequals(&quotX&quot) ) {

scoresetText(&quotYou won&quot)

} else if (winnerequals(&quotO&quot)){

scoresetText(&quotYou lost&quot)

} else if (winnerequals(&quotT&quot)){

scoresetText(&quotIts a tie&quot)

}

} / / Кінець методу actionPerformed

/**

* Цей метод викликається після кожного ходу, щоб дізнатися,

* Чи є переможець Він перевіряє кожен ряд, колонку

* І діагональ, щоб знайти три клітини з однаковими написами

* (Не порожніми)

@return X, O, T – Нічия, ” – Ще немає переможця

*/

String lookForWinner() { String theWinner = &quot"

emptySquaresLeft–

if (emptySquaresLeft==0){

return T; / / Це нічия T від англійського слова tie

}

/ / Перевіряємо ряд 1 – елементи масиву 0,1,2

if (squares[0]getLabel()equals(&quot&quot)  &amp&amp

squares[0]getLabel()equals(squares[1]getLabel()) &amp&amp

squares[0]getLabel()equals(squares[2]getLabel())) {

theWinner = squares[0]getLabel()

highlightWinner(0,1,2)

/ / Перевіряємо ряд 2 – елементи масиву 3,4,5

} else if (squares[3]getLabel()equals(&quot&quot) &amp&amp

squares[3]getLabel()equals(squares[4]getLabel()) &amp&amp

squares[3]getLabel()equals(squares[5]getLabel())) {

theWinner = squares[3]getLabel()

highlightWinner(3,4,5)

/ / Перевіряємо ряд 3 – елементи масиву 6,7,8

} else if ( squares[6]getLabel()equals(&quot&quot)  &amp&amp

squares[6]getLabel()equals(squares[7]getLabel()) &amp&amp

squares[6]getLabel()equals(squares[8]getLabel())) {

theWinner = squares[6]getLabel()

highlightWinner(6,7,8)

/ / Перевіряємо колонку 1 – елементи масиву 0,3,6

} else if ( squares[0]getLabel()equals(&quot&quot)  &amp&amp

squares[0]getLabel()equals(squares[3]getLabel()) &amp&amp

squares[0]getLabel()equals(squares[6]getLabel())) {

theWinner = squares[0]getLabel()

highlightWinner(0,3,6)

/ / Перевіряємо колонку 2 – елементи масиву 1,4,7

} else if ( squares[1]getLabel()equals(&quot&quot)  &amp&amp

squares[1]getLabel()equals(squares[4]getLabel()) &amp&amp

squares[1]getLabel()equals(squares[7]getLabel())) {

theWinner = squares[1]getLabel()

highlightWinner(1,4,7)

/ / Перевіряємо колонку 3 – елементи масиву 2,5,8

} else if (  squares[2]getLabel()equals(&quot&quot)  &amp&amp

squares[2]getLabel()equals(squares[5]getLabel()) &amp&amp

squares[2]getLabel()equals(squares[8]getLabel())) {

theWinner = squares[2]getLabel()

highlightWinner(2,5,8)

/ / Перевіряємо першу діагональ – елементи масиву 0,4,8

} else if ( squares[0]getLabel()equals(&quot&quot)  &amp&amp

squares[0]getLabel()equals(squares[4]getLabel()) &amp&amp

squares[0]getLabel()equals(squares[8]getLabel())) {

theWinner = squares[0]getLabel()

highlightWinner(0,4,8)

/ / Перевіряємо другий діагональ – елементи масиву 2,4,6

} else if ( squares[2]getLabel()equals(&quot&quot)  &amp&amp

squares[2]getLabel()equals(squares[4]getLabel()) &amp&amp

squares[2]getLabel()equals(squares[6]getLabel())) {

theWinner = squares[2]getLabel()

highlightWinner(2,4,6)

}

return theWinner

}

/**

* Цей метод застосовує набір правил, щоб знайти

* Кращий компютерний хід Якщо хороший хід

* Не знайдений, вибирається випадкова клітина

*/

void computerMove() {

int selectedSquare

/ / Спочатку компютер намагається знайти порожню клітину

/ / Поряд з двома клітинами з нуликами, щоб виграти

selectedSquare = findEmptySquare(&quotO&quot)

/ / Якщо він не може знайти два нолика, то хоча б

/ / Спробує не дати опонентові зробити ряд з 3-х

/ / Хрестиків, помістивши нулик поряд з двома хрестиками

if ( selectedSquare == -1 )

selectedSquare =  findEmptySquare(&quotX&quot)

}

/ / Якщо selectedSquare все ще дорівнює -1, то

/ / Спробує зайняти центральну клітку

if ( (selectedSquare == -1)

&amp&amp(squares[4]getLabel()equals(&quot&quot))  ){

selectedSquare=4

}

/ / Не пощастило з центральною клітиною ..

/ / Просто займаємо випадкову клітку

if ( selectedSquare == -1 ){

selectedSquare = getRandomSquare()

}

squares[selectedSquare]setLabel(&quotO&quot)

}

/**

* Цей метод перевіряє кожен ряд, колонку і діагональ

* Щоб дізнатися, чи є в ній дві клітини

* З однаковими написами і порожньою кліткою

* @param передається X – для користувача і O – для компа

* @return  кількість вільних клітин,

* Або -1, якщо не знайдено дві клітини

* З однаковими написами

*/

int findEmptySquare(String player) {

int weight[] = new int[9]

for ( int i = 0 i &lt 9 i++ ) {

if ( squares[i]getLabel()equals(&quotO&quot)  )

weight[i] = -1

else if ( squares[i]getLabel()equals(&quotX&quot)  )

weight[i] = 1

else

weight[i] = 0

}

int twoWeights = playerequals(&quotO&quot) -2 : 2

/ / Перевіримо, чи є в ряду 1 дві однакові клітки і

/ / Одна порожня

if ( weight[0] + weight[1] + weight[2] == twoWeights ) {

if ( weight[0] == 0 )

return 0

else if ( weight[1] == 0 )

return 1

else

return 2

}

/ / Перевіримо, чи є в ряду 2 дві однакові клітки і

/ / Одна порожня

if (weight[3] +weight[4] + weight[5] == twoWeights) {

if ( weight[3] == 0 )

return 3

else if ( weight[4] == 0 )

return 4

else

return 5

}

/ / Перевіримо, чи є в ряду 3 дві однакові клітки і

/ / Одна порожня

if (weight[6] + weight[7] +weight[8] == twoWeights ) {

if ( weight[6] == 0 )

return 6

else if ( weight[7] == 0 )

return 7

else

return 8

}

/ / Перевіримо, чи є в колонці 1 дві однакові клітки і

/ / Одна порожня

if (weight[0] + weight[3] + weight[6] == twoWeights) {

if ( weight[0] == 0 )

return 0

else if ( weight[3] == 0 )

return 3

else

return 6

}

/ / Перевіримо, чи є в колонці 2 дві однакові клітки

/ / І одна порожня

if (weight[1] +weight[4] + weight[7] == twoWeights ) {

if ( weight[1] == 0 )

return 1

else if ( weight[4] == 0 )

return 4

else

return 7

}

/ / Перевіримо, чи є в колонці 3 дві однакові клітки

/ / І одна порожня

if (weight[2] + weight[5] + weight[8] == twoWeights ){

if ( weight[2] == 0 )

return 2

else if ( weight[5] == 0 )

return 5

else

return 8

}

/ / Перевіримо, чи є в діагоналі 1 дві однакові клітки

/ / І одна порожня

if (weight[0] + weight[4] + weight[8] == twoWeights ){

if ( weight[0] == 0 )

return 0

else if ( weight[4] == 0 )

return 4

else

return 8

}

/ / Перевіримо, чи є в діагоналі 2 дві однакові клітки

/ / І одна порожня

if (weight[2] + weight[4] + weight[6] == twoWeights ){

if ( weight[2] == 0 )

return 2

else if ( weight[4] == 0 )

return 4

else

return 6

}

/ / Не знайдено двох однакових сусідніх клітин

return -1

} / / Кінець методу findEmptySquare ()

/**

* Цей метод вибирає будь-яку порожню клітину

* @return випадково обраний номер клітини

*/

int getRandomSquare() {

boolean gotEmptySquare = false

int selectedSquare = -1

do {

selectedSquare = (int) (Mathrandom() * 9 )

if (squares[selectedSquare]getLabel()equals(&quot&quot)){

gotEmptySquare = true / / Щоб закінчити цикл

}

} while (gotEmptySquare )

return selectedSquare

} / / Кінець методу getRandomSquare ()

/**

* Цей метод виділяє виграла лінію

* @param перша, друга і третя клітини для виділення

*/

void highlightWinner(int win1, int win2, int win3) {

squares[win1]setBackground(ColorCYAN) squares[win2]setBackground(ColorCYAN) squares[win3]setBackground(ColorCYAN)

}

/ / Робимо недоступними клітини і доступною кнопку New Game

void endTheGame(){ newGameButtonsetEnabled(true) for(int i=0i&lt9i++){

squares[i]setEnabled(false)

}

}

} / / Кінець класу

Вітаю Ви створили вашу першу гру на Java

При використанні бібліотеки Swing, потрібно поміняти Button на JButton, Panel на JPanel, і тд Більш детальна інформація, правда по – анлійского, тут: http://downloadoraclecom/javase/tutorial/deployment/applet  

Цей аплет можна запустити або прямо з Eclipse, або відкривши файл TicTacToehtml, який ми створили на початку глави, тільки скопіюйте файли TicTacToehtml і TicTacToeclass в одну папку У нашому класі TicTacToe є маленька помилка – можливо, ви її навіть не помітили, але я впевнений, що вона зникне після того, як ви зробите друге завдання нижче

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

 Матеріали для додаткового читання

Аплети Java: http://downloadoraclecom/javase/tutorial/deployment/

applet/

Клас Math http://javasuncom/j2se/150/docs/api/java/lang/Math html  Практичні вправи

1 Додайте на верхню панель класу TicTacToe два написи для підрахунку виграшів і програшів Для цього оголосіть дві змінні в класі і збільшуйте відповідну змінну кожен раз, коли людина виграє або програє Рахунок повинен оновлюватися відразу після того, як програма виводить повідомлення You won” або You lost”2 Наша програма дозволяє клацати на клітці, в якій вже є хрестик або нулик Це помилка Програма продовжує працювати, як ніби ви зробили правильний хід Змініть текст програми так, щоб натискання на такі клітини ігноріровалісь3 Додайте метод main () до класу TicTacToe, щоб мати можливість запускати гру не як аплет, а як Java – додаток Практичні вправи для розумників і розумниць

1 Перепишіть TicTacToe, щоб заменітьодномерний масив, який зберігає кнопкіJButton squares []

на двовимірний масив 3×3:

JButton squares[][]

2 Почитайте про багатовимірні масиви вінтернете

Джерело: Java Programming for Kids, Parents and Grandparents by Yakov Fain

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*