Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Шепель МАН+.docx
Скачиваний:
2
Добавлен:
01.07.2025
Размер:
551 Кб
Скачать
☆

Висновки

У ході виконання роботи була написанна гра хрестики-нулики мовою Java з використанням середовища eclipse.

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

Хрестики – нулики легка та зрозуміла гра в яку можна грати навіть на аркуші паперу.

В процесі написання гри я навчився програмувати мовою Java, працювати з додатковою інформацією та середовищем eclipse, дізнався історію мови Java та алгоритми гри хрестики - нулики.

Програма допоможе покращити навички гри та придумати нові стратегіі. Згодом я збираюсь збільшити «поле» гри хрестики-нулики та вдосконалити інтерфейс. Планую в майбутньому написати й інші ігрові та неігрові та програми.

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

  1. Файн Я. Программирование на Java для детей, родителей, дедушек и бабушек.

  2. http://4brain.ru/blog/как-выиграть-в-крестики-нолики/

  3. http://kultura-socio.ru/shpargalki-po-sotsialno-kulturnoj-deyatelnosti/276-klassifikaciya-igr-rol-igrovyx-programm-v.html

  4. http://www.znannya.org/?view=jc-history2

  5. http://uk.wikipedia.org/wiki/Java

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

import java.awt.*;

import java.awt.event.*;

import java.applet.Applet;

public class TicTacToe extends Applet implements ActionListener{

Button squares[];

Button newGameButton;

Label score;

int emptySquaresLeft=9;

/**

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

*/

public void init(){

//Устанавливаем менеджер расположения апплета, шрифт и цвет

this.setLayout(new BorderLayout());

this.setBackground(Color.CYAN);

// Изменяем шрифт апплета так, чтобы он был жирным

// и имел размер 20

Font appletFont=new Font("Monospased",Font.BOLD, 20);

this.setFont(appletFont);

// Создаем кнопку “New Game” и регистрируем в ней

// слушатель действия

newGameButton=new Button("New Game");

newGameButton.addActionListener(this);

Panel topPanel=new Panel();

topPanel.add(newGameButton);

this.add(topPanel,"North");

Panel centerPanel=new Panel();

centerPanel.setLayout(new GridLayout(3,3));

this.add(centerPanel,"Center");

score=new Label("Your turn!");

this.add(score,"South");

// создаем массив, чтобы хранить ссылки на 9 кнопок

squares=new Button[9];

// Создаем кнопки, сохраняем ссылки на них в массиве

// регистрируем в них слушатель, красим их

// в оранжевый цвет и добавляем на панель

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

squares[i]=new Button();

squares[i].addActionListener(this);

squares[i].setBackground(Color.ORANGE);

centerPanel.add(squares[i]);

}

}

/**

* Этот метод будет обрабатывать все события

* @param ActionEvent объект

*/

public void actionPerformed(ActionEvent e) {

Button theButton = (Button) e.getSource();

// Это кнопка New Game ?

if (theButton ==newGameButton){

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

squares[i].setEnabled(true);

squares[i].setLabel("");

squares[i].setBackground(Color.ORANGE);

}

emptySquaresLeft=9;

score.setText("Your turn!");

newGameButton.setEnabled(false);

return; // выходим из метода

}

String winner = "";

// Это одна из клеток?

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

if ( theButton == squares[i] ) {

squares[i].setLabel("X");

winner = lookForWinner();

if(!"".equals(winner)){

endTheGame();

} else {

computerMove();

winner = lookForWinner();

if ( !"".equals(winner)){

endTheGame();

}

}

break;

}

} // конец цикла for

if ( winner.equals("X") ) {

score.setText("You won!");

} else if (winner.equals("O")){

score.setText("You lost!");

} else if (winner.equals("T")){

score.setText("It's a tie!");

}

} // конец метода actionPerformed

/**

* Этот метод вызывается после каждого хода, чтобы узнать,

* есть ли победитель. Он проверяет каждый ряд, колонку

* и диагональ, чтобы найти три клетки с одинаковыми надписями

* (не пустыми)

* @return "X", "O", "T" – ничья, "" - еще нет победителя

*/

String lookForWinner() {

String theWinner = "";

emptySquaresLeft--;

if (emptySquaresLeft==0){

return "T"; // это ничья. T от английского слова tie

}

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

if (!squares[0].getLabel().equals("") &&

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

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("") &&

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

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("") &&

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

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("") &&

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

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("") &&

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

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("") &&

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

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

theWinner = squares[2].getLabel();

highlightWinner(2,5,8);

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

} else if ( ! squares[0].getLabel().equals("") &&

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

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

theWinner = squares[0].getLabel();

highlightWinner(0,4,8);

// Проверяем вторую диагональ – элементы массива 2,4,6

} else if ( ! squares[2].getLabel().equals("") &&

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

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

theWinner = squares[2].getLabel();

highlightWinner(2,4,6);

}

return theWinner;

}

/**

* Этот метод применяет набор правил, чтобы найти

* лучший компьютерный ход. Если хороший ход

* не найден, выбирается случайная клетка.

*/

void computerMove() {

int selectedSquare;

// Сначала компьютер пытается найти пустую клетку

// рядом с двумя клетками с ноликами, чтобы выиграть

selectedSquare = findEmptySquare("O");

// Если он не может найти два нолика, то хотя бы

// попытается не дать оппоненту сделать ряд из 3-х

// крестиков,поместив нолик рядом с двумя крестиками

if ( selectedSquare == -1 )

selectedSquare = findEmptySquare("X");

// если selectedSquare все еще равен -1, то

// попытается занять центральную клетку

if ( (selectedSquare == -1)

&&(squares[4].getLabel().equals("")) ){

selectedSquare=4;

}

// не повезло с центральной клеткой...

// просто занимаем случайную клетку

if ( selectedSquare == -1 ){

selectedSquare = getRandomSquare();

}

squares[selectedSquare].setLabel("O");

}

/**

* Этот метод проверяет каждый ряд, колонку и диагональ

* чтобы узнать, есть ли в ней две клетки

* с одинаковыми надписями и пустой клеткой.

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

* @return количество свободных клеток,

* или -1, если не найдено две клетки

* с одинаковыми надписями

*/

int findEmptySquare(String player) {

int weight[] = new int[9];

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

if ( squares[i].getLabel().equals("O") )

weight[i] = -1;

else if ( squares[i].getLabel().equals("X") )

weight[i] = 1;

else

weight[i] = 0;

}

int twoWeights = player.equals("O") ? -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) (Math.random() * 9 );

if (squares[selectedSquare].getLabel().equals("")){

gotEmptySquare = true; // чтобы закончить цикл

}

} while (!gotEmptySquare );

return selectedSquare;

} // конец метода getRandomSquare()

/**

* Этот метод выделяет выигравшую линию.

* @param первая, вторая и третья клетки для выделения

*/

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

squares[win1].setBackground(Color.CYAN);

squares[win2].setBackground(Color.CYAN);

squares[win3].setBackground(Color.CYAN);

}

// Делаем недоступными клетки и доступной кнопку ”New Game”

void endTheGame(){

newGameButton.setEnabled(true);

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

squares[i].setEnabled(false);

}

}

} // конец класса