Форум программистов, компьютерный форум CyberForum.ru

Крестики нолики - установить факт выигрыша - C++

Восстановить пароль Регистрация
 
kamish77777
0 / 0 / 0
Регистрация: 21.04.2014
Сообщений: 38
25.04.2014, 19:02     Крестики нолики - установить факт выигрыша #1
ребят,помогите пожалуйста,пишу крестики нолики на с++,почти все сделал не знаю как реализовать функцию победы,т.е надо проверить когда тот или иной человек выиграл))
вот мой код

C++
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
#include "stdafx.h"
#include "iostream"
#include "time.h"
#include "string"
#include "vector"
using namespace std;
 
class  Matrix
{
private:
    int Width; // длинна
    int Height; //ширина
    char *Body;  // тело матрицы
public:
    Matrix(int w, int h)
    {
        Width = w;
        Height = h;
        Body = new char[w * h];
    }
    ~Matrix()
    {
        delete[] Body;
    }
    //добавляет в массив знчение value
    void Set(int col, int row, double value)
    {
        Body[col * Width + row] = value;
    }
    // достает то что нужно из матрицы
    char Get(int col, int row)
    {
        return Body[col * Width + row];
    }
    // заполняет матрицу единицами
    void SetRand()
    {
        for (int i = 0; i < Width; i++)
        {
            for (int j = 0; j < Height; j++)
            {
                Set(i, j, '.');
            }
        }
    }
    // выводит матрицу на экран
    void Print()
    {
        for (int i = 0; i < Width; i++)
        {
            for (int j = 0; j < Height; j++)
            {
                cout << Get(i, j) << "    ";
            }
            cout << endl;
            cout << endl;
        }
    }
    // заполняет матрицу
    void filling(int t,int t1,char n)
    {
        Set(t, t1, n);
        system("cls");
        Print();
    }
};
 
 
 
int _tmain(int argc, _TCHAR* argv[])
{
    setlocale(LC_ALL, "Russian");
    Matrix A(3,3);
    A.SetRand();
    string name1; //имя первого игрока
    string name2; // имя вторго игрока
    cout << "Введите имя первого игрока" << endl << endl;
        cin >> name1;
        cout << endl;
        cout << "Введите имя вторго игрока" << endl << endl;
        cin >> name2;
        cout << endl;
        system("cls");
        int t, t1, n;
    for (int i = 0; i < 9; i++)
    {
        if (i % 2 == 0)
        {
            A.Print();
            cout << "Ходит" <<"   "<< name1 <<" "<< endl << endl;
            cout << "Введите i" << endl << endl;
            cin >> t;
            cout << "Введите j" << endl << endl;
            cin >> t1;
            n = 'X';
            A.filling(t,t1,n);
        }
        if (i % 2 != 0)
        {
            A.Print();
            cout << "Ходит"<<"   " << name2 <<" "<< endl << endl;
            cout << "Введите i" << endl << endl;
            cin >> t;
            cout << "Введите j" << endl << endl;
            cin >> t1;
            n = 'O';
            A.filling(t, t1, n);
        }
 
    }
    system("PAUSE");
    return 0;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.04.2014, 19:02     Крестики нолики - установить факт выигрыша
Посмотрите здесь:

Крестики-нолики C++
C++ Крестики-нолики
C++ крестики нолики
C++ Крестики нолики
Крестики нолики C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Vaiz
 Аватар для Vaiz
97 / 91 / 29
Регистрация: 01.07.2012
Сообщений: 268
Завершенные тесты: 1
25.04.2014, 19:26     Крестики нолики - установить факт выигрыша #2
kamish77777, сделайте функцию Check в классе, которая после каждого хода проверяла бы 3 строки, 3 столбца и 2 диагонали.

Добавлено через 2 минуты
И массив бы двумерный сделать, а не одномерный.
C++
1
2
3
4
5
6
7
8
    char **Body;  // тело матрицы
    Matrix(int w, int h)
    {
        Width = w;
        Height = h;
        Body = new char*[h];
        for(int i = 0; i<h;i++) Body[i] = new char[w];
    }
kamish77777
0 / 0 / 0
Регистрация: 21.04.2014
Сообщений: 38
25.04.2014, 19:31  [ТС]     Крестики нолики - установить факт выигрыша #3
ну я думал что нужно проверять после 5 хода,смысл раньше проверять.А на счет проверки в голову кроме как проверять через if ничего не лезет,100 % есть какой то уже готовый алгоритм)

Добавлено через 2 минуты
А еще вдруг у нас матрица не 3 на 3,а к примеру 4 на 4,тогда такое уже не покатит,очень много if писать)))а если 5 на 5 и больше то там вылезет в 100и ifоф))
Vaiz
 Аватар для Vaiz
97 / 91 / 29
Регистрация: 01.07.2012
Сообщений: 268
Завершенные тесты: 1
25.04.2014, 19:39     Крестики нолики - установить факт выигрыша #4
C++
1
2
3
4
5
6
Check()
{
//Строки
     for(int i = 0; i < Height; i++)
{
}
kamish77777
0 / 0 / 0
Регистрация: 21.04.2014
Сообщений: 38
25.04.2014, 19:42  [ТС]     Крестики нолики - установить факт выигрыша #5
не понятно маленько(
Vaiz
 Аватар для Vaiz
97 / 91 / 29
Регистрация: 01.07.2012
Сообщений: 268
Завершенные тесты: 1
25.04.2014, 19:55     Крестики нолики - установить факт выигрыша #6
Отправил случайно...

Вот в таком стиле думаю стоит проверять


Добавлено через 2 минуты
Такой же цикл еще для столбцов и еще над диагоналями надо подумать. В матрице 3 на 3 наверное не стоит придумывать универсальный алгоритм, а так в принципе можно.

Добавлено через 7 минут
один else добавил

C++
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
Check()
{
     int tmp, tmpCnt;
     //Строки
     for(int i = 0; i < Height; i++)
     {
           tmp = 0;
           tmpCnt = 0;
           for(int j = 0; j < width; j++)
           {
                 if(Body[i][j] != tmp && Body[i][j] != '.')
                 { 
                         tmp = Body[i][j]; 
                         tmpCnt = 1;
                 }
                 else if(Body[i][j] == tmp)
                 {
                         tmpCnt++;
                         if(tmpCnt == 3) break;
                 }
                 else if(Body[i][j] == '.')
                 {
                       tmp = 0;
                       tmpCnt = 0; 
                 }
           }
           if(tmpCnt == 3) break;
     }
     if(tmpCnt == 3) cout << "Win " << tmp; 
}
imm
 Аватар для imm
8 / 8 / 2
Регистрация: 25.10.2013
Сообщений: 101
Завершенные тесты: 2
25.04.2014, 19:58     Крестики нолики - установить факт выигрыша #7
Не по теме, но так и не понял, для чего тут звездочка?
C++
1
char *Body
Чисто для себя, не понимаю, что она делает и для чего.
Vaiz
 Аватар для Vaiz
97 / 91 / 29
Регистрация: 01.07.2012
Сообщений: 268
Завершенные тесты: 1
25.04.2014, 20:00     Крестики нолики - установить факт выигрыша #8
imm, обозначает, что это указатель на ячейку оперативной памяти. Может указывать либо на один элемент, либо на начало массива.
kamish77777
0 / 0 / 0
Регистрация: 21.04.2014
Сообщений: 38
25.04.2014, 20:03  [ТС]     Крестики нолики - установить факт выигрыша #9
ну боди,это у нас наш массив,мы же не знаем какого он будет размера,мы его задаем только в main,а для работы в классе,нам необходим указатель))

Добавлено через 57 секунд
спасибо большое за помощь,обязательно попробую подставить все это))
imm
 Аватар для imm
8 / 8 / 2
Регистрация: 25.10.2013
Сообщений: 101
Завершенные тесты: 2
25.04.2014, 20:05     Крестики нолики - установить факт выигрыша #10
Vaiz, а в каких случаях используют это?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.04.2014, 20:13     Крестики нолики - установить факт выигрыша
Еще ссылки по теме:

Крестики нолики C++
Крестики-нолики C++

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

Или воспользуйтесь поиском по форуму:
Vaiz
 Аватар для Vaiz
97 / 91 / 29
Регистрация: 01.07.2012
Сообщений: 268
Завершенные тесты: 1
25.04.2014, 20:13     Крестики нолики - установить факт выигрыша #11
Цитата Сообщение от imm Посмотреть сообщение
Vaiz, а в каких случаях используют это?
На самом деле часто используется:
- для создания динамических массивов любого размера, с этим обычно сталкиваются в самом начале
- для передачи элементов в функции и т.д., где нужно вносить изменения в элемент, а не в его копию.

Тут можно прочитать целую лекцию, но это будет совсем уж не по теме. Ищите в гугле по ключевым словам "работа с указателями C++"
Yandex
Объявления
25.04.2014, 20:13     Крестики нолики - установить факт выигрыша
Ответ Создать тему
Опции темы

Текущее время: 06:37. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru