Форум программистов, компьютерный форум, киберфорум
JavaScript: Vue.js
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
0 / 0 / 0
Регистрация: 16.12.2020
Сообщений: 1
1

Объясните логику проверки победителя в крестики нолики

16.12.2020, 23:51. Просмотров 1200. Ответов 1
Метки нет (Все метки)

Javascript
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
var appVue = new Vue({
    el: '#app',
    data: {
        fieldMasses: [],
        move: false,
        fieldSize: 3,
        hod: 0,
        name:'',
        isActive: false,
        igra: true,
    },
    methods: {
        // игра
        todo() {
            this.igra = false;
            this.isActive = true;
            if (this.fieldSize < 3){this.fieldSize = 3}
            this.newGame();
        },
 
 
        // ход игрока
        fillingOutTurn(index, indexItem) {
            if (this.move === false) {
                if (this.fieldMasses[index][indexItem] === ' '){
                    Vue.set(this.fieldMasses[index], indexItem, 'X'); // крестик
                    this.move = true;
                    this.hod--;
                    this.viewWinner();
                }
            } else {
                if (this.fieldMasses[index][indexItem] === ' ') {
                    Vue.set(this.fieldMasses[index], indexItem, 'O'); // нолик
                    this.move = false;
                    this.hod--;
                    this.viewWinner();
                }
            }
        },
        // поиск победителя
        viewWinner() {
            if (this.hod === 0){alert("Ничья"); location.reload();}
            for (var i = 0; i < this.fieldSize; i++) {
                for (var j = 0; j < this.fieldSize; j++) {
                    if(i < this.fieldSize - 2) {
                        for (var k = 0; k < 3; k++) {
                            var torightX = true;
                            if (this.fieldMasses[i + k][j] != 'X') {torightX = false; break;}
                        }
                        for (var k = 0; k < 3; k++) {
                            var torightO = true;
                            if (this.fieldMasses[i + k][j] != 'O') {torightO = false; break;}               //
                        }
                    }
                    if (torightX === true){ alert("Победа - X"); location.reload();}
                    if (torightO === true){ alert("Победа - O"); location.reload();}
                } // проверка по вертикали
            }
            for (var i = 0; i < this.fieldSize; i++) {
                for (var j = 0; j < this.fieldSize; j++) {
                    if (j < this.fieldSize - 2) {
                        for (var k = 0; k < 3; k++) {
                            var torightX = true;
                            if (this.fieldMasses[i][j + k] != 'X') {torightX = false; break;}
                        }
                        for (var k = 0; k < 3; k++) {
                            var torightO = true;
                            if (this.fieldMasses[i][j + k] != 'O') {torightO = false; break;}
                        }
                    }
                    if (torightX === true){ alert("Победа - X"); location.reload();}
                    if (torightO === true){ alert("Победа - O"); location.reload();}
                }
            } // проверка по горизонтали
            for (var i = 0; i < this.fieldSize; i++) {
                for (var j = 0; j < this.fieldSize; j++) {
                    if (j < this.fieldSize - 2 && i < this.fieldSize - 2) {
                        for (var k = 0; k < 3; k++) {
                            var torightX = true;
                            if (this.fieldMasses[i + k][j + k] != 'X') {torightX = false; break;}
                        }
                        for (var k = 0; k < 3; k++) {
                            var torightO = true;
                            if (this.fieldMasses[i + k][j + k] != 'O') {torightO = false; break;}
                        }
                    }
                    if (torightX === true){ alert("Победа - X"); location.reload();}
                    if (torightO === true){ alert("Победа - O"); location.reload();}
                }
            } // искось с лева на право
            for (var i = 0; i < this.fieldSize; i++) {
                for (var j = 0; j < this.fieldSize; j++) {
                    if (j > 1 && i < this.fieldSize - 2) {
                        for (var k = 0; k < 3; k++) {
                            var torightX = true;
                            if (this.fieldMasses[i + k][j - k] != 'X') {torightX = false; break;}
                        }
                        for (var k = 0; k < 3; k++) {
                            var torightO = true;
                            if (this.fieldMasses[i + k][j - k] != 'O') {torightO = false; break;}
                        }
                    }
                    if (torightX === true){ alert ("Победа - X"); location.reload();}
                    if (torightO === true){ alert("Победа - O"); location.reload();}
                }
            } // справа налево
        },
        //генератор массива
        newGame() {
            this.hod = this.fieldSize * this.fieldSize; // если ход равен нулю - все клетки заполнены, а значит, что это ничья. Потому что на каждый ход из количества ходов вычитается единица.
            for (var i = 0; i < this.fieldSize; i++) {
                this.fieldMasses.push([]);
                for (var j = 0; j < this.fieldSize; j++) {
                    this.fieldMasses[i].push(' ');
                }
            }
        },
    }
})
Не совсем понимаю логику проверки на победителя, помогите пожалуйста
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
16.12.2020, 23:51
Ответы с готовыми решениями:

Крестики-нолики: проверка на победителя
Вечер добрый, такой вопрос. Пишу игру крестики-нолики. написал проверку на победителя. можно ли...

Крестики-нолики: как определить победителя?
в некоторых местах го*** код, но всё таки. взялся сейчас делать крестики нолики, сделал рамку, а...

Крестики-нолики, поиск в массиве для выявления победителя
Здравствуйте. Имеем игру крестики-нолики, поле хранится в виде матрицы 10х10, нужно поставить 5 в...

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

__________________

Записывайтесь на профессиональные курсы Fullstack-разработчиков на JavaScript‌
1
399 / 278 / 78
Регистрация: 03.12.2015
Сообщений: 657
18.12.2020, 11:41 2
Лучший ответ Сообщение было отмечено screenshot как решение

Решение

Несколько почти одинаковых блоков:
- поиск победителя в горизонтальных строках
- поиск победителя в вертикальных строках
- поиск победителя в диагонали слева направо
- поиск победителя в диагонали справа налево

Каждый блок устроен одинаково

Javascript
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
// Сначала находим ячейки, в которых "начинаются" строки.
// Для горизонтальных строк это самые левые ячейки, для вертикальных это самые верхние ячейки.
//
// Это реализовано так:
// Циклы for проходят по всем возможным клеткам, 
// if отбирает клетки, в которых начинаются строки.
// В данном блоке (примере) мы рассматриваем горизонтальные линии, 
// поэтому нам нужны только левые клетки (i меняются, j==0)
//
// Вообще, реализация не очень эффективная и запутанная.
// Достаточно иметь один цикл по i. Цикл по j, а также if нам не нужен, т.к. j==0 в этом блоке
            for (var i = 0; i < this.fieldSize; i++) {
                for (var j = 0; j < this.fieldSize; j++) {
                    if (j < this.fieldSize - 2) {  // то же, что j==0
 
 
// далее идут два блока проверок для каждого игрока - X или O
 
// В данный момент времени i, j указывает на начало проверяемой строки (см. предыдущие циклы)
// Предполагаем, что игрок выиграл эту строку: torightX = true
// Пробегаем по всем элементам строки - fieldMasses[i][j + k], где k = от 0 до 2
// И если находим, что в этой ячейке не содержится метка игрока, 
// то значит в этой строке игрок не выиграл: torightX = false
// Прерываем цикл просмотра строки (break), т.к. смысла смотреть ее дальше нет.
                        for (var k = 0; k < 3; k++) {
                            var torightX = true;
                            if (this.fieldMasses[i][j + k] != 'X') {torightX = false; break;}
                        }
 
// аналогично для игрока O
                        for (var k = 0; k < 3; k++) {
                            var torightO = true;
                            if (this.fieldMasses[i][j + k] != 'O') {torightO = false; break;}
                        }
                    }
                    if (torightX === true){ alert("Победа - X"); location.reload();}
                    if (torightO === true){ alert("Победа - O"); location.reload();}
                }
            } // проверка по горизонтали
Добавлено через 5 минут
Вообще, реализация так себе.

Лучше сделать так:
- написать функцию, которая проверяет одну строку для заданного игрока isWinLine(x, y, dx, dy, letter), где x, y - начало строки, dx, dy - "направление" строки, letter - буква игрока
- написать функцию, которая описывает все строки getLines() - список (x,y,dx,dy)
- пробежаться по всем строкам для каждого игрока и определить победителя checkWinner()

Решение будет понятнее и раза в 4-5 короче.
2
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
18.12.2020, 11:41

Заказываю контрольные, курсовые, дипломные работы и диссертации здесь.

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

Крестики-нолики:как продумать логику компьютера?
Народ нужно просто такой себе простенький бот который будет рандомно ходить по полю а в случае...

Крестики-Нолики - продумать логику работы компьютера
Я учусь на программиста. 1 курс. Как только начали проходить паскаль, я решил что-нибудь сотворить...

Крестики нолики - как организовать интерфейс и логику игры?
С чего нужно начать в коде ? Если хочу в Windows Forms сделать. Как создать массив это я знаю, а...

Как продумать логику игры компьютера в крестики-нолики
Есть такая заготовка под крестики-нолики.... В общем, синтаксис и основы знаю, но не понимаю, что,...

Крестики-нолики: как написать код для того, чтобы программа могла объявить победителя?
И да, поле 5 на 5. Сам код: #include &lt;iostream&gt; #include &lt;locale.h&gt; #include &lt;Windows.h&gt; using...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.