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

крестик-нолик-условие ничьи - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.90
^Tecktonik_KiLLeR
 Аватар для ^Tecktonik_KiLLeR
1144 / 426 / 19
Регистрация: 23.06.2009
Сообщений: 6,141
Завершенные тесты: 1
26.11.2010, 23:22     крестик-нолик-условие ничьи #1
как написать условие ничьи для игры крестики нолики?
Если рассмотреть доску как матрицу,то я смог написать условие только для самого первого элемента
C++
1
2
3
4
5
6
7
 
if(x[i][j]!=x[i+1][j] && x[i][j]!=x[i][j+1] && x[i][j]!=x[i+1][j+1])
        {
        cout<<"ничья!"<<endl;
    
        return 1;
        }
то есть проверяет,если справа,снизу и по диагонали нету похожее число(я вместо Х пишу 1 вместо 0 пишу 2) то выводит на экран НИЧЬЯ
если написать условие для центрального элемента,то думаю на всех заработает...хотя для первого элемента нету соседа слева.Или сверху. Вобщем как написать условие?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Crudelis
Шаровик затейник
 Аватар для Crudelis
668 / 410 / 13
Регистрация: 06.05.2010
Сообщений: 1,109
26.11.2010, 23:27     крестик-нолик-условие ничьи #2
создайте счетчик который считает добавление крестиков или ноликов и при добавлении крестика или 0 проверяйте равен ли он 9
^Tecktonik_KiLLeR
 Аватар для ^Tecktonik_KiLLeR
1144 / 426 / 19
Регистрация: 23.06.2009
Сообщений: 6,141
Завершенные тесты: 1
27.11.2010, 12:12  [ТС]     крестик-нолик-условие ничьи #3
Crudelis, эмм...а где именно
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;          //остановка цикла-игры
    }
        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
    {
        cout<<"WRONG,TRY AGAIN"<<endl; //или же повторить ход сначала
        goto loop;
    }
}
 
void out(int x[][n]) //функция вывода матрицы
{
        system("cls");//заранее экран очищяется
    cout<<endl;
for(int i=0;i<n;i++)
{
    for(int j=0;j<n;j++)
        cout<<x[i][j]<<" ";
    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[i][0]==1)cout<<"YOU WON!!!!!!"<<endl;
        else if(x[i][0]==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;
        }
}
Crudelis
Шаровик затейник
 Аватар для Crudelis
668 / 410 / 13
Регистрация: 06.05.2010
Сообщений: 1,109
27.11.2010, 16:24     крестик-нолик-условие ничьи #4
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
void main()
{
        int x[n][n]={0};        //инициализованная матрица
        int count = 0;
        while(count!=9) //бесконечный цикл
{
        out(x); //вывод матрицы
        inp(x); //ввод крестика в матрицу
        count++;
        if(win(x)==1)//если конец игры
        {
                out(x);                 //вывод
                win(x);                 //выводит либо победителя либо ничья
                break;                  //остановка цикла-игры
        }
                comp(x);        //если не конец игры,то ход компьютера
        }
if(count==9)
cout<<"НИЧЬЯ";
}
ход человека мы считаем, далее нужно переделать функцию хода компьютера:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
void comp(int x[][n],int *count)//Ход компьютера. Если рядом с крестиком есть крестик,то рядом с другим крестиком написать 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;
                }
count++;
}
вызов функции:
C++
1
comp(x,&count);
передаем по ссылке, чтоб его значение менялось и в main()
Yandex
Объявления
27.11.2010, 16:24     крестик-нолик-условие ничьи
Ответ Создать тему
Опции темы

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