1 / 1 / 0
Регистрация: 30.05.2017
Сообщений: 54
1

Крестики-нолики против компьютера

09.11.2017, 18:42. Показов 4664. Ответов 12
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Есть код для игры против человека.
Нужно добавить код, чтобы можно было выбрать режим игры: против компа, или против человека, и, собственно, играть против компа, или против человека.

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
package tictactoe;
 
import javafx.application.Application;
import javafx.beans.binding.Bindings;
import javafx.beans.property.*;
import javafx.beans.value.*;
import javafx.event.*;
import javafx.scene.Node;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.control.*;
import javafx.scene.image.*;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.*;
import javafx.stage.Stage;
 
import java.util.*;
 
public class TicTacToe extends Application {
    @Override public void start(Stage stage) throws Exception {
        GameManager gameManager = new GameManager();
 
        Scene scene = gameManager.getGameScene();
        scene.getStylesheets().add(
                getResource(
                        "tictactoe.css"
                )
        );
 
        stage.setTitle("Tic-Tac-Toe");
        stage.getIcons().add(SquareSkin.crossImage);
        stage.setScene(scene);
        stage.show();
    }
 
    private String getResource(String resourceName) {
        return getClass().getResource(resourceName).toExternalForm();
    }
 
    public static void main(String[] args) {
        Application.launch(TicTacToe.class);
    }
}
 
class GameManager {
    private Scene gameScene;
    private Game  game;
 
    GameManager() {
        newGame();
    }
 
    public void newGame() {
        game = new Game(this);
 
        if (gameScene == null) {
            gameScene = new Scene(game.getSkin());
        } else {
            gameScene.setRoot(game.getSkin());
        }
    }
 
    public void quit() {
        gameScene.getWindow().hide();
    }
 
    public Game getGame() {
        return game;
    }
 
    public Scene getGameScene() {
        return gameScene;
    }
}
 
class GameControls extends HBox {
    GameControls(final GameManager gameManager, final Game game) {
        getStyleClass().add("game-controls");
 
        visibleProperty().bind(game.gameOverProperty());
 
        Label playAgainLabel = new Label("Play Again?");
        playAgainLabel.getStyleClass().add("info");
 
        Button playAgainButton = new Button("Yes");
        playAgainButton.getStyleClass().add("play-again");
        playAgainButton.setDefaultButton(true);
        playAgainButton.setOnAction(new EventHandler<ActionEvent>() {
            @Override public void handle(ActionEvent actionEvent) {
                gameManager.newGame();
            }
        });
 
        Button exitButton = new Button("No");
        playAgainButton.getStyleClass().add("exit");
        exitButton.setCancelButton(true);
        exitButton.setOnAction(new EventHandler<ActionEvent>() {
            @Override
            public void handle(ActionEvent actionEvent) {
                gameManager.quit();
            }
        });
 
        getChildren().setAll(
                playAgainLabel,
                playAgainButton,
                exitButton
        );
    }
}
 
class StatusIndicator extends HBox {
    private final ImageView playerToken = new ImageView();
    private final Label     playerLabel = new Label("Current Player: ");
 
    StatusIndicator(Game game) {
        getStyleClass().add("status-indicator");
 
        bindIndicatorFieldsToGame(game);
 
        playerToken.setFitHeight(32);
        playerToken.setPreserveRatio(true);
 
        playerLabel.getStyleClass().add("info");
 
        getChildren().addAll(playerLabel, playerToken);
    }
 
    private void bindIndicatorFieldsToGame(Game game) {
        playerToken.imageProperty().bind(
                Bindings.when(
                        game.currentPlayerProperty().isEqualTo(Square.State.NOUGHT)
                )
                        .then(SquareSkin.noughtImage)
                        .otherwise(
                                Bindings.when(
                                        game.currentPlayerProperty().isEqualTo(Square.State.CROSS)
                                )
                                        .then(SquareSkin.crossImage)
                                        .otherwise((Image) null)
                        )
        );
 
        playerLabel.textProperty().bind(
                Bindings.when(
                        game.gameOverProperty().not()
                )
                        .then("Current Player: ")
                        .otherwise(
                                Bindings.when(
                                        game.winnerProperty().isEqualTo(Square.State.EMPTY)
                                )
                                        .then("Draw")
                                        .otherwise("Winning Player: ")
                        )
        );
    }
}
 
class Game {
    private GameSkin skin;
    private Board board = new Board(this);
    private WinningStrategy winningStrategy = new WinningStrategy(board);
 
    private ReadOnlyObjectWrapper<Square.State> currentPlayer = new ReadOnlyObjectWrapper<>(Square.State.CROSS);
    public ReadOnlyObjectProperty<Square.State> currentPlayerProperty() {
        return currentPlayer.getReadOnlyProperty();
    }
    public Square.State getCurrentPlayer() {
        return currentPlayer.get();
    }
 
    private ReadOnlyObjectWrapper<Square.State> winner = new ReadOnlyObjectWrapper<>(Square.State.EMPTY);
    public ReadOnlyObjectProperty<Square.State> winnerProperty() {
        return winner.getReadOnlyProperty();
    }
 
    private ReadOnlyBooleanWrapper drawn = new ReadOnlyBooleanWrapper(false);
    public ReadOnlyBooleanProperty drawnProperty() {
        return drawn.getReadOnlyProperty();
    }
    public boolean isDrawn() {
        return drawn.get();
    }
 
    private ReadOnlyBooleanWrapper gameOver = new ReadOnlyBooleanWrapper(false);
    public ReadOnlyBooleanProperty gameOverProperty() {
        return gameOver.getReadOnlyProperty();
    }
    public boolean isGameOver() {
        return gameOver.get();
    }
 
    public Game(GameManager gameManager) {
        gameOver.bind(
                winnerProperty().isNotEqualTo(Square.State.EMPTY)
                        .or(drawnProperty())
        );
 
        skin = new GameSkin(gameManager, this);
    }
 
    public Board getBoard() {
        return board;
    }
 
    public void nextTurn() {
        if (isGameOver()) return;
 
        switch (currentPlayer.get()) {
            case EMPTY:
            case NOUGHT: currentPlayer.set(Square.State.CROSS);  break;
            case CROSS:  currentPlayer.set(Square.State.NOUGHT); break;
        }
    }
 
    private void checkForWinner() {
        winner.set(winningStrategy.getWinner());
        drawn.set(winningStrategy.isDrawn());
 
        if (isDrawn()) {
            currentPlayer.set(Square.State.EMPTY);
        }
    }
 
    public void boardUpdated() {
        checkForWinner();
    }
 
    public Parent getSkin() {
        return skin;
    }
}
 
class GameSkin extends VBox {
    GameSkin(GameManager gameManager, Game game) {
        getChildren().addAll(
                game.getBoard().getSkin(),
                new StatusIndicator(game),
                new GameControls(gameManager, game)
        );
    }
}
 
class WinningStrategy {
    private final Board board;
 
    private static final int NOUGHT_WON = 3;
    private static final int CROSS_WON  = 30;
 
    private static final Map<Square.State, Integer> values = new HashMap<>();
    static {
        values.put(Square.State.EMPTY,  0);
        values.put(Square.State.NOUGHT, 1);
        values.put(Square.State.CROSS,  10);
    }
 
    public WinningStrategy(Board board) {
        this.board = board;
    }
 
    public Square.State getWinner()
    {
        for (int i = 0; i < 3; i++)
        {
            int score = 0;
            for (int j = 0; j < 3; j++)
            {
                score += valueOf(i, j);
            }
            if (isWinning(score))
            {
                return winner(score);
            }
        }
 
 
        for (int i = 0; i < 3; i++) {
            int score = 0;
            for (int j = 0; j < 3; j++) {
                score += valueOf(j, i);
            }
            if (isWinning(score)) {
                return winner(score);
            }
        }
 
        int score = 0;
        score += valueOf(0, 0);
        score += valueOf(1, 1);
        score += valueOf(2, 2);
        if (isWinning(score)) {
            return winner(score);
        }
 
        score = 0;
        score += valueOf(2, 0);
        score += valueOf(1, 1);
        score += valueOf(0, 2);
        if (isWinning(score)) {
            return winner(score);
        }
 
        return Square.State.EMPTY;
    }
 
    public boolean isDrawn() {
        for (int i = 0; i < 3; i++) {
            for (int j = 0; j < 3; j++) {
                if (board.getSquare(i, j).getState() == Square.State.EMPTY) {
                    return false;
                }
            }
        }
 
        return getWinner() == Square.State.EMPTY;
    }
 
    private Integer valueOf(int i, int j) {
        return values.get(board.getSquare(i, j).getState());
    }
 
    private boolean isWinning(int score) {
        return score == NOUGHT_WON || score == CROSS_WON;
    }
 
    private Square.State winner(int score) {
        if (score == NOUGHT_WON) return Square.State.NOUGHT;
        if (score == CROSS_WON)  return Square.State.CROSS;
 
        return Square.State.EMPTY;
    }
}
 
class Board {
    private final BoardSkin skin;
 
    private final Square[][] squares = new Square[3][3];
 
    public Board(Game game) {
        for (int i = 0; i < 3; i++) {
            for (int j = 0; j < 3; j++) {
                squares[i][j] = new Square(game);
            }
        }
 
        skin = new BoardSkin(this);
    }
 
    public Square getSquare(int i, int j) {
        return squares[i][j];
    }
 
    public Node getSkin() {
        return skin;
    }
}
 
class BoardSkin extends GridPane {
    BoardSkin(Board board) {
        getStyleClass().add("board");
 
        for (int i = 0; i < 3; i++) {
            for (int j = 0; j < 3; j++) {
                add(board.getSquare(i, j).getSkin(), i, j);
            }
        }
    }
}
 
class Square {
    enum State { EMPTY, NOUGHT, CROSS }
 
    private final SquareSkin skin;
 
    private ReadOnlyObjectWrapper<State> state = new ReadOnlyObjectWrapper<>(State.EMPTY);
    public ReadOnlyObjectProperty<State> stateProperty() {
        return state.getReadOnlyProperty();
    }
    public State getState() {
        return state.get();
    }
 
    private final Game game;
 
    public Square(Game game) {
        this.game = game;
 
        skin = new SquareSkin(this);
    }
 
    public void pressed() {
        if (!game.isGameOver() && state.get() == State.EMPTY) {
            state.set(game.getCurrentPlayer());
            game.boardUpdated();
            game.nextTurn();
        }
    }
 
    public Node getSkin() {
        return skin;
    }
}
 
class SquareSkin extends StackPane {
    static final Image noughtImage = new Image(
            "http://icons.iconarchive.com/icons/double-j-design/origami-colored-pencil/128/green-cd-icon.png"
    );
    static final Image crossImage = new Image(
            "http://icons.iconarchive.com/icons/double-j-design/origami-colored-pencil/128/blue-cross-icon.png"
    );
 
    private final ImageView imageView = new ImageView();
 
    SquareSkin(final Square square) {
        getStyleClass().add("square");
 
        imageView.setMouseTransparent(true);
 
        getChildren().setAll(imageView);
        setPrefSize(crossImage.getHeight() + 20, crossImage.getHeight() + 20);
 
        setOnMousePressed(new EventHandler<MouseEvent>() {
            @Override public void handle(MouseEvent mouseEvent) {
                square.pressed();
            }
        });
 
        square.stateProperty().addListener(new ChangeListener<Square.State>() {
            @Override public void changed(ObservableValue<? extends Square.State> observableValue, Square.State oldState, Square.State state) {
                switch (state) {
                    case EMPTY:  imageView.setImage(null);        break;
                    case NOUGHT: imageView.setImage(noughtImage); break;
                    case CROSS:  imageView.setImage(crossImage);  break;
                }
            }
        });
    }
}
CSS
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
.root {
    -fx-background-color: green;
    -fx-padding: 30px;
    -fx-font-size: 20px;
    -fx-font-family: "Comic Sans MS";
}
 
.info {
    -fx-text-fill: whitesmoke;
}
 
.button {
    -fx-base: red;
}
 
.game-controls {
    -fx-spacing: 20px;
    -fx-alignment: center;
}
 
.status-indicator {
    -fx-alignment: center;
    -fx-padding: 16px;
}
 
.board {
    -fx-background-color: yellow;
    -fx-hgap: 10px;
    -fx-vgap: 10px;
}
 
.square {
    -fx-padding: 10px;
    -fx-background-color: azure;
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
09.11.2017, 18:42
Ответы с готовыми решениями:

Крестики-нолики
нужно переделать данный проект для поля 5х5, победа 3 в ряд

Крестики-нолики
Здравствуйте, уважаемые форумчане! Нужна помощь в реализации всем известной игры крестики-нолики....

Крестики-нолики
Помогите доделать программу: 1.Добавьте на верхнюю панель класса TicTacToe две надписи для...

Крестики нолики
подскажите как с точки зрения свинга лучше делать? мне нужно задавать имя и порт и адрес я...

12
90 / 89 / 23
Регистрация: 08.07.2014
Сообщений: 548
10.11.2017, 22:40 2
А вопрос то в чем ?
0
33 / 33 / 10
Регистрация: 12.07.2017
Сообщений: 90
10.11.2017, 23:08 3
Он же написал, добавить опцию выбора, будет ли игра человек комп, или человек человек.
0
1 / 1 / 0
Регистрация: 30.05.2017
Сообщений: 54
11.11.2017, 13:13  [ТС] 4
korshun84, добавить опцию выбора, но помимо этого, добавить стабильный код для логичного хода компьютера.
Код выше, для игры 1 на 1 используя одну мышку
0
90 / 89 / 23
Регистрация: 08.07.2014
Сообщений: 548
11.11.2017, 16:42 5
В смысле "сделайте за меня" что ли ? Прикололи На раз-два такое не делается, тем более за бесплатно.
0
33 / 33 / 10
Регистрация: 12.07.2017
Сообщений: 90
11.11.2017, 19:37 6
это же крестики нолики, чего там за бабки то делать?
Вытащить следующий ход по случайному выбору, если упадет на занятую клетку, значит долбить до тех пор пока не упадет на пустую. Автору предлагаю полазить на github там этих игр вагончик.
0
1 / 1 / 0
Регистрация: 30.05.2017
Сообщений: 54
11.11.2017, 19:51  [ТС] 7
dolomit, спасибо за совет, я в курсе. Но у меня будут проблемы с синхронизацией другого кода с моим. Поэтому я здесь и прошу. Может кто и найдет ТАМ нужный код, но нужно переделать его под эту "логику"
0
90 / 89 / 23
Регистрация: 08.07.2014
Сообщений: 548
12.11.2017, 22:47 8
Цитата Сообщение от dolomit Посмотреть сообщение
это же крестики нолики, чего там за бабки то делать?
Так сделай, если для тебя это на раз-два.
Если прикручивать сюда возможность игры с другим реальным игроком, то это будет мягко говоря сложнее, чем
Цитата Сообщение от dolomit Посмотреть сообщение
Вытащить следующий ход по случайному выбору, если упадет на занятую клетку, значит долбить до тех пор пока не упадет на пустую.
Цитата Сообщение от Max_Raptor Посмотреть сообщение
Может кто и найдет ТАМ нужный код, но нужно переделать его под эту "логику"
Жесть.
Если не секрет, зачем оно тебе надо ? Курсач\диплом\лабораторная горит ?))
0
33 / 33 / 10
Регистрация: 12.07.2017
Сообщений: 90
13.11.2017, 01:06 9
Цитата Сообщение от korshun84 Посмотреть сообщение
Если прикручивать сюда возможность игры с другим реальным игроком, то это будет мягко говоря сложнее, чем
Может я чего не понимаю, но чем выбор следующего хода случайным образом сложнее ввода сканером этого самого следующего хода. По моему два реальных игрока это самый простой вариант реализации игры.
0
90 / 89 / 23
Регистрация: 08.07.2014
Сообщений: 548
13.11.2017, 11:26 10
Цитата Сообщение от dolomit Посмотреть сообщение
По моему два реальных игрока это самый простой вариант реализации игры.
Не, в целом, конечно, ничего дикого тут нет, но не до такой уж степени, что бы подрываться это делать непойми кому за "спасибо", при том, что этот непоймикто даже палец о палец ударить не хочет, что бы что-то сделать.
Даже анекдот-притча есть:
Идёт Будда с учениками по дороге. Видит: яма, в ней вол, крестьянин пытается его вытянуть, но сил не хватает. Будда кивнул ученикам, они быстро помогли вытянуть животное. Идут дальше, снова яма, в ней вол, на краю сидит крестьянин и горько плачет. Будда прошёл мимо и как бы не заметил. Ученики его спрашивают:
- Учитель, почему ты не захотел помочь этому крестьянину?
- Чем помочь, плакать?
0
1 / 1 / 0
Регистрация: 30.05.2017
Сообщений: 54
13.11.2017, 17:09  [ТС] 11
korshun84, то чувство, когда я ему показываю код игры с человеком, а он говорит, цитирую:"Палец о палец ударить не хочет".
Во-вторых, да, горит, возможно курсач, но это не точно.
У меня, к сожалению, ограничение во времени, но на этом сайте, я вижу, только упрекать умеют
0
xoraxax
13.11.2017, 17:36
  #12

Не по теме:

Цитата Сообщение от Max_Raptor Посмотреть сообщение
когда я ему показываю код игры с человеком
во-первых по своему вопросу ты нифига не показал, во-вторых, не умничай.
Цитата Сообщение от Max_Raptor Посмотреть сообщение
У меня, к сожалению, ограничение во времени
это твои личные проблемы, которые кроме тебя никого не волнуют

0
90 / 89 / 23
Регистрация: 08.07.2014
Сообщений: 548
14.11.2017, 07:43 13
Цитата Сообщение от Max_Raptor Посмотреть сообщение
то чувство, когда я ему показываю код игры с человеком, а он говорит, цитирую:"Палец о палец ударить не хочет".
Типа ты этот "код" сам написал, да ?

з.ы. Мне казалось, что под постановкой "играть с человеком" имеется в виду игра по сети, а не на одном компьютере))
0
14.11.2017, 07:43
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
14.11.2017, 07:43
Помогаю со студенческими работами здесь

Крестики нолики
Из ряда: &quot;Старые песни о главном&quot;. Посмотрел по поиску темы, не нашел что надо. Может кто-то идею...

Реализовать ничью в игре Крестики-Нолики
Помогите сделать, чтоб в форме выводились не только победы крестиков и ноликов, но еще и ничья ...

Игра крестики - нолики. Установка шрифта, текстового поля
Здравствуйте! С недавнего времени занялся программированием на Java, читаю лекции в инете на...

Приложение "Крестики-нолики"
напишите программу на java крестники нолики AWT


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru