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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.80
^Tecktonik_KiLLeR
1159 / 441 / 22
Регистрация: 23.06.2009
Сообщений: 6,235
Завершенные тесты: 1
#1

крестик-нолик - функция пoбеды - C++

02.12.2010, 20:32. Просмотров 1269. Ответов 17
Метки нет (Все метки)

Ну кто же!!!
Помогите,функция проверки на победу не работает нормально!
Даже коменты написал что бы не запутаться...помогите.
вот если крестики(или нолики) будут весь первый ряд, то есть первая вертикаль,то как я понял получается бесконечный цикл..то есть ничего не выводится и нельзя что-либо вводить
В чем проблема?
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
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
#include <iostream>
#include <time.h>
#include <windows.h>
#include <math.h>
#include <D:\\alex\\head-files\\mathem.h>
#include <D:\\alex\\head-files\\kurs.h>
#include <D:\\alex\\head-files\\factorial.h>
using namespace std;
const int n=3;  //матрица
//объявление функций
void inp(int x[][n]);//функция ввода
void out(int x[][n]);//функиця вывода матрицы
bool win(int x[][n]);//проверка на победу/проигрыш/ничью
void comp(int x[][n]);//функция интелекта компьютера
 
void main()
{
    int x[n][n]={0};    //инициализованная матрица
    while(true) //бесконечный цикл
{
    out(x); //вывод матрицы
    inp(x); //ввод крестика в матрицу
    if(win(x)==1)//если конец игры
    {
        out(x);         //вывод
        win(x);         //выводит либо победителя 
        break;          //остановка цикла-игры
    }
        else comp(x);   //если не конец игры,то ход компьютера
    }
}
 
void inp(int x[][n])
{
    int i=0,j=0;
loop: //цикл
    //вводим координаты-где будет Х
    cout<<"i=";
    cin>>i;
    cout<<"j=";
    cin>>j;
    if(x[i][j]==0)//если не занято то присвоить Х
    x[i][j]=1;
    else if(i>2 || j>2 || i<0 || j<0 || x[i][j]!=0)
    {
        cout<<"WRONG,TRY AGAIN"<<endl; //или же повторить ход сначала
        goto loop;
    }
}
void out(int x[][n]) //функция вывода матрицы
{
        system("cls");//заранее экран очищяется
    cout<<endl;
for(int i=0;i<1;i++)
{
        for(int m=0;m<n;m++)
            cout<<"_____";
    cout<<endl;
}
for(int i=0;i<n;i++)
{
    for(int j=0;j<n;j++){
        
            if(x[i][j]==1)
        cout<<"I"<<" X "<<"I";
            else if(x[i][j]==2)
                cout<<"I"<<" 0 "<<"I";
            else if(x[i][j]==0)
                cout<<"I"<<"   "<<"I";      
        }
    cout<<endl;
    for(int m=0;m<n;m++)
            cout<<"_____";
    cout<<endl;
}
cout<<endl; 
}
 
bool win(int x[][n])//функция проверки игры
{
        for(int i = 0; i < n; i++)
        if(x[i][0] == x[i][1] && x[i][0] == x[i][2] && x[i][0]!=0)//Проверка i-ой линии
        {
        if(x[i][0]==1)cout<<"YOU WON!!!!!!"<<endl;
        else if(x[i][0]==2)cout<<"YOU LOSE!!!!!!"<<endl;
        return 1;
        }
     for(int i = 0; i < n; i++)
        if(x[0][i] == x[1][i] && x[0][i] == x[i][2]  && x[0][i]!=0)//Проверка столбца
     {
        if(x[0][i]==1)cout<<"YOU WON!!!!!!"<<endl;
        else if(x[0][i]==2)cout<<"YOU LOSE!!!!!!"<<endl;
        return 1;
        }
     if(x[0][0] == x[1][1] && x[1][1] == x[2][2]  && x[0][0]!=0)//Проверка главной диагонали
         {
        if(x[0][0]==1)cout<<"YOU WON!!!!!!"<<endl;
        else if(x[0][0]==2)cout<<"YOU LOSE!!!!!!"<<endl;
        return 1;
        }
     if(x[0][2] == x[1][1] && x[1][1] == x[2][0]  && x[0][2]!=0)//Проверка побочной диагонали
        {
        if(x[1][1]==1)cout<<"YOU WON!!!!!!"<<endl;
        else if(x[1][1]==2)cout<<"YOU LOSE!!!!!!"<<endl;
        return 1;
        }        
     if(x[0][0] == x[1][0] && x[0][0] == x[2][0]  && x[0][2]!=0)//проверка первого столбца
        {
        if(x[0][0]==1)cout<<"YOU WON!!!!!!"<<endl;
        else if(x[0][0]==2)cout<<"YOU LOSE!!!!!!"<<endl;
        return 1;
        }
      if(x[0][1] == x[1][1] && x[0][1] == x[2][1]  && x[2][1]!=0)//Проверка второго столбца
        {
        if(x[0][1]==1)cout<<"YOU WON!!!!!!"<<endl;
        else if(x[0][1]==2)cout<<"YOU LOSE!!!!!!"<<endl;
        return 1;
        }   
     return 0;
}
 
void comp(int x[][n])//Ход компьютера. Если рядом с крестиком есть крестик,то рядом с другим крестиком написать 0
{
    int a=0,b=0;
    for(int i=0;i<n;i++)
        for(int j=0;j<n;j++)
        {           
rrand:      a=rand()%2;
            b=rand()%2;
            if(x[a][b]==0)x[a][b]=2;
            else goto rrand;
            i=n;
                j=n;
        }
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.12.2010, 20:32
Здравствуйте! Я подобрал для вас темы с ответами на вопрос крестик-нолик - функция пoбеды (C++):

крестик-нолик - функция победы - C++
пишу игру крестики нолики. функция bool win(int x; порверят на каждом шагу наличие на победу. Как мне писать грамотно условие...

крестик-нолик-условие ничьи - C++
как написать условие ничьи для игры крестики нолики? Если рассмотреть доску как матрицу,то я смог написать условие только для самого...

Интеллект компьютера в игре Крестик-Нолик - C++
вот написал себе игру крестик нолик. Все нормально получилось. Просто вот не могу объяснить компьютеру как правильно думать. У меня есть...

Игра крестики-нолик - C++
Пишу игру крестики-нолики с хоть каким-то ИИ. Есть функция bot_attack и функция bot_def bool Game::bot_attack() { ...

Список, выводит лишний нолик - C++
Задание таково: Внести значения, выбрать количество элементов которые должны вывестись на экран с конца списка. Я почти решил но есть...

Как сделать, так, чтобы ряд действий в программе выполнялся до тех пор, пока пользователь не нажмёт на крестик - C++
Как сделать, так, чтобы ряд действий в программе выполнялся до тех пор, пока пользователь не нажмёт на крестик? Я работаю в программе...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
valeriikozlov
Эксперт C++
4670 / 2496 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
02.12.2010, 20:48 #2
Цитата Сообщение от ^Tecktonik_KiLLeR Посмотреть сообщение
if(x[0][i] == x[1][i] && x[0][i] == x[i][2] && x[0][i]!=0)//Проверка столбца
Здесь ошибка, должно быть так:
C++
1
if(x[0][i] == x[1][i] && x[0][i] == x[2][i] && x[0][i]!=0)//Проверка столбца
Это лишнее:
Цитата Сообщение от ^Tecktonik_KiLLeR Посмотреть сообщение
if(x[0][0] == x[1][0] && x[0][0] == x[2][0] && x[0][2]!=0)//проверка первого столбца
{
if(x[0][0]==1)cout<<"YOU WON!!!!!!"<<endl;
else if(x[0][0]==2)cout<<"YOU LOSE!!!!!!"<<endl;
return 1;
}
if(x[0][1] == x[1][1] && x[0][1] == x[2][1] && x[2][1]!=0)//Проверка второго столбца
{
if(x[0][1]==1)cout<<"YOU WON!!!!!!"<<endl;
else if(x[0][1]==2)cout<<"YOU LOSE!!!!!!"<<endl;
return 1;
^Tecktonik_KiLLeR
1159 / 441 / 22
Регистрация: 23.06.2009
Сообщений: 6,235
Завершенные тесты: 1
02.12.2010, 21:17  [ТС] #3
Ход мой,я ввел координаты Х-а,и тут снова то ли бесконечный цикл то ли прога зависает. Скорее всего бесконечный цикл...крестик-нолик - функция пoбеды
valeriikozlov
Эксперт C++
4670 / 2496 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
02.12.2010, 21:46 #4
Цитата Сообщение от ^Tecktonik_KiLLeR Посмотреть сообщение
rrand: a=rand()%2;
b=rand()%2;
Замените на:
C++
1
2
rrand:          a=rand()%3;
                        b=rand()%3;
ForEveR
02.12.2010, 21:48
  #5

Не по теме:

Это игра с полной информацией?

^Tecktonik_KiLLeR
1159 / 441 / 22
Регистрация: 23.06.2009
Сообщений: 6,235
Завершенные тесты: 1
03.12.2010, 18:22  [ТС] #6
Цитата Сообщение от ForEveR Посмотреть сообщение
Это игра с полной информацией?
как понять?О_о
Object
Заблокирован
03.12.2010, 18:36 #7
Он хотел спросить: кореллируют ли выигрышные стратегии игрока и его противника друг с другом.
valeriikozlov
Эксперт C++
4670 / 2496 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
03.12.2010, 19:21 #8
Цитата Сообщение от Object Посмотреть сообщение
Он хотел спросить: кореллируют ли выигрышные стратегии игрока и его противника друг с другом.
В слове "кореллируют " две ошибки. А ответ - нет.
^Tecktonik_KiLLeR
1159 / 441 / 22
Регистрация: 23.06.2009
Сообщений: 6,235
Завершенные тесты: 1
04.12.2010, 15:28  [ТС] #9
valeriikozlov, ничего не понял

Добавлено через 14 часов 47 минут
valeriikozlov, вот написал отрывок лдя ничьи
C++
1
2
3
4
5
6
7
8
9
10
     //НИЧЬЯ
     int d=0;
     for(int i=0;i<n;i++)
         for(int j=0;j<n;j++)
        if(x[i][j]!=0)d++;//если данная ячейка не свободна то d++
     if(d==9)//если d==9(то есть если нигде не пусто), то ничья
     {
     cout<<"DRAW!!!!!!"<<endl;
     return 1;
     }
если все правильно то осталось написать,то есть дописать функцию компа. Его интелект..Как сделать?
valeriikozlov
Эксперт C++
4670 / 2496 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
04.12.2010, 16:49 #10
Замучился я с Вашей программой играть, что бы была ничья, но все-таки добился. Теперь сами проверяйте-играйте:
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
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
#include <iostream>
#include <time.h>
#include <windows.h>
#include <math.h>
//#include <D:\\alex\\head-files\\mathem.h>
//#include <D:\\alex\\head-files\\kurs.h>
//#include <D:\\alex\\head-files\\factorial.h>
using namespace std;
const int n=3;  //матрица
//объявление функций
void inp(int x[][n]);//функция ввода
void out(int x[][n]);//функиця вывода матрицы
bool win(int x[][n]);//проверка на победу/проигрыш/ничью
void comp(int x[][n]);//функция интелекта компьютера
 
void main()
{
        int x[n][n]={0};        //инициализованная матрица
        while(true) //бесконечный цикл
{
        out(x); //вывод матрицы
        inp(x); //ввод крестика в матрицу
        if(win(x)==1)//если конец игры
        {
                out(x);                 //вывод 
                win(x);                 //выводит либо победителя                 
                break;                  //остановка цикла-игры
                
        }
                else comp(x);   //если не конец игры,то ход компьютера
                if(win(x)==1)
                {
                    out(x);                 //вывод
                    win(x);                 //выводит либо победителя    
                    break;                 //выводит либо победителя 
                }
        }
}
 
void inp(int x[][n])
{
        int i=0,j=0;
loop: //цикл
        //вводим координаты-где будет Х
        cout<<"i=";
        cin>>i;
        cout<<"j=";
        cin>>j;
        if(x[i][j]==0)//если не занято то присвоить Х
        x[i][j]=1;
        else if(i>2 || j>2 || i<0 || j<0 || x[i][j]!=0)
        {
                cout<<"WRONG,TRY AGAIN"<<endl; //или же повторить ход сначала
                goto loop;
        }
}
void out(int x[][n]) //функция вывода матрицы
{
                system("cls");//заранее экран очищяется
        cout<<endl;
for(int i=0;i<1;i++)
{
                for(int m=0;m<n;m++)
                        cout<<"_____";
        cout<<endl;
}
for( i=0;i<n;i++)
{
        for(int j=0;j<n;j++){
                
                        if(x[i][j]==1)
                cout<<"I"<<" X "<<"I";
                        else if(x[i][j]==2)
                                cout<<"I"<<" 0 "<<"I";
                        else if(x[i][j]==0)
                                cout<<"I"<<"   "<<"I";          
                }
        cout<<endl;
        for(int m=0;m<n;m++)
                        cout<<"_____";
        cout<<endl;
}
cout<<endl;     
}
 
bool win(int x[][n])//функция проверки игры
{
            for(int i = 0; i < n; i++)
        if(x[i][0] == x[i][1] && x[i][0] == x[i][2] && x[i][0]!=0)//Проверка i-ой линии
                {
                if(x[i][0]==1)cout<<"YOU WON!!!!!!"<<endl;
                else if(x[i][0]==2)cout<<"YOU LOSE!!!!!!"<<endl;
                return 1;
                }
     for(int i = 0; i < n; i++)
        if(x[0][i] == x[1][i] && x[0][i] == x[2][i] && x[0][i]!=0)//Проверка столбца
         {
                if(x[0][i]==1)cout<<"YOU WON!!!!!!"<<endl;
                else if(x[0][i]==2)cout<<"YOU LOSE!!!!!!"<<endl;
                return 1;
                }
     if(x[0][0] == x[1][1] && x[1][1] == x[2][2]  && x[0][0]!=0)//Проверка главной диагонали
                 {
                if(x[0][0]==1)cout<<"YOU WON!!!!!!"<<endl;
                else if(x[0][0]==2)cout<<"YOU LOSE!!!!!!"<<endl;
                return 1;
                }
     if(x[0][2] == x[1][1] && x[1][1] == x[2][0]  && x[0][2]!=0)//Проверка побочной диагонали
                {
                if(x[1][1]==1)cout<<"YOU WON!!!!!!"<<endl;
                else if(x[1][1]==2)cout<<"YOU LOSE!!!!!!"<<endl;
                return 1;
                } 
     int d=0;
     for(int i=0;i<n;i++)
         for(int j=0;j<n;j++)
             if(x[i][j]!=0)d++;//если данная ячейка не свободна то d++
             if(d==9)//если d==9(то есть если нигде не пусто), то ничья
             {
                 cout<<"DRAW!!!!!!"<<endl;
                 return 1;
             }
    return 0;
}
 
void comp(int x[][n])//Ход компьютера. Если рядом с крестиком есть крестик,то рядом с другим крестиком написать 0
{
        int a=0,b=0;
        for(int i=0;i<n;i++)
                for(int j=0;j<n;j++)
                {                       
rrand:          a=rand()%3;
                        b=rand()%3;
                if(x[a][b]==0)x[a][b]=2;
                        else goto rrand;
                        i=n;
                                j=n;
                }
}
silent_1991
Эксперт С++
4963 / 3039 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
04.12.2010, 17:17 #11
Цитата Сообщение от valeriikozlov Посмотреть сообщение
Замучился я с Вашей программой играть, что бы была ничья
Это говорит о том, что бот написан плохо. Ибо при безупречной игре обоих игроков на поле 3х3 ничья обеспечена в любом случае.
valeriikozlov
Эксперт C++
4670 / 2496 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
04.12.2010, 18:46 #12
В этом коде вообще нет правила безупречной игры со стороны противника. Со стороны противника все основано на случайных числах. Даже выигрышная позиция противником пропускается.
^Tecktonik_KiLLeR
1159 / 441 / 22
Регистрация: 23.06.2009
Сообщений: 6,235
Завершенные тесты: 1
04.12.2010, 19:37  [ТС] #13
Цитата Сообщение от valeriikozlov Посмотреть сообщение
В этом коде вообще нет правила безупречной игры со стороны противника. Со стороны противника все основано на случайных числах. Даже выигрышная позиция противником пропускается.
Вот в этом и вся проблема..
Вместо случайных чисел там должен быть мозг,но я не могу создать его.

Добавлено через 11 секунд
Вот поэтому и написал сюда.
valeriikozlov
Эксперт C++
4670 / 2496 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
04.12.2010, 19:43 #14
^Tecktonik_KiLLeR, Так в чем проблемма? Я в ввашем коде прочитал комментарии:
//Ход компьютера. Если рядом с крестиком есть крестик,то рядом с другим крестиком написать 0
{
Но реализации этого не увидел. У Вас просто ставится 0 по принципу rand. И Вы об этом тоже не просите. Нужно Вам это реализовать? Если да, то это не очень сложно.
^Tecktonik_KiLLeR
1159 / 441 / 22
Регистрация: 23.06.2009
Сообщений: 6,235
Завершенные тесты: 1
05.12.2010, 17:58  [ТС] #15
Цитата Сообщение от valeriikozlov Посмотреть сообщение
Я в ввашем коде прочитал комментарии:
Цитата Сообщение от valeriikozlov Посмотреть сообщение
Но реализации этого не увидел
Т.к. я не бездельничал, я попробовал написать этот код,но не вышло,не вышло написать код если два крестика стоят друг рядом с другом и если та, третья ячейка пуста-написать нолик...Вот и этот неработающий код удалил.А комент забыл.
Цитата Сообщение от valeriikozlov Посмотреть сообщение
Если да, то это не очень сложно.
Для студента первого курса,который только только начинает изучать матрицу-сложно. Еще как.
Ибо не открыл бы тему.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.12.2010, 17:58
Привет! Вот еще темы с ответами:

Как из еденички сделать нолик - C (СИ)
здравствуйте. мне надо при происхождении события менять некоторое число. типа есть число х=0, происходит событие и х=1, опять происходит...

Нарисовать крестик - Delphi
Всем привет подскажите как нарисовать на экране средствами Delphi крестик? не в окне программы а на самом экране?

Съезжает крестик - C# WPF
Какая то непонятная фигня происходит. Я делаю для TabControl-а вкладку с крестиком закрывающим. Делаю отдельным контролом. Но когда пытаюсь...

Крестик на звуке - Windows 10
добрый день. звука нет. драйвера менял. наушники и колонки рабочие. случилось после попытки вставить наушники и проверить рабочий ли...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
05.12.2010, 17:58
Ответ Создать тему
Опции темы

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