Форум программистов, компьютерный форум, киберфорум
Бета-тестирование
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.64/11: Рейтинг темы: голосов - 11, средняя оценка - 4.64
 Аватар для Taras_Z
102 / 86 / 5
Регистрация: 27.10.2010
Сообщений: 534
Записей в блоге: 2

Крестики нолики в консоле

07.03.2012, 15:33. Показов 2350. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Вот написал Крестики нолики
В игре есть :
1. Меню
2. Игра с компом
3. Игра с игроком
4. Статистика
Учту замечания/пожелания, идеи


Вложения
Тип файла: rar Tic_tac_toe.rar (13.4 Кб, 86 просмотров)
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
07.03.2012, 15:33
Ответы с готовыми решениями:

Крестики-нолики в консоле
Недавно начал изучать С + + и для небольшой практики хотел написать что-то, типа крестики-нолики. программа должна отображать игру в виде...

Крестики-нолики: плохо прорисовываются "нолики"
Я, наверное, всех уже достал своей игрой, но я опять напоролся на подводный камень. Игра - крестики-нолики. Баг - нолики рисуются как-то...

Крестики нолики
Доброго времени суток, недавно, я решил написать программу Крестики нолики, опираясь на свои знания в С++, но при компиляции кода...

7
 Аватар для Taras_Z
102 / 86 / 5
Регистрация: 27.10.2010
Сообщений: 534
Записей в блоге: 2
07.03.2012, 15:46  [ТС]
Я начал заниматся програмированием две недели назад и мне очень надо понять свои ошибки
0
Формучанин
364 / 296 / 42
Регистрация: 02.11.2010
Сообщений: 1,245
07.03.2012, 18:25
Может интересно будет.
Простой ИИ для крестиков-ноликов

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
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
#include <assert.h>
#include <stdio.h>
unsigned char state[3][3];/*<==============Использовать эту переменную===========>*/
//массив в кортором содержится информация о поле.
//массив размера 3 на 3. 0=клетка пуста 1=крестик 2=нолик
//Перед вызовом функции из этого модуля этот массив должен быть заполнен.
 
 
void krest_init(void)/*<==============Использовать эту функцию===========>*/
//инциализирует массив нулями
//Нужно вызывать перед началом новой игры.
{
    register size_t i,j;
    for (i=0;i<3;i++)
        for (j=0;j<3;j++)
            state[i][j]=0;
    
}
 
static char check_win(void)
//Проверяет состояние игры.
//возвращает 0 если ничья, -1 если игра не закончена, 1(=крестик) или 2(=нолик) если чья либо победа
{
    unsigned char and;
    unsigned char is_invert,i,j;
    
    for (is_invert=0;is_invert<2;is_invert++)
    for (i=0;i<3;i++)
    {
        and=-1;
        for (j=0;j<3;j++)
            and&=is_invert?state[i][j]:state[j][i];
        
        if (and==1) return 1;
        if (and==2) return 2;
    }
    
    
    for (is_invert=0;is_invert<2;is_invert++)
    {
        and=-1;
        for (i=0;i<3;i++)
            and&=state[is_invert?2-i:i][i];
        
        if (and==1) return 1;
        if (and==2) return 2;
    }
    for (i=0;i<3;i++)
        for (j=0;j<3;j++)
            if (state[i][j]==0) return -1;
    return 0;
    
}
 
static unsigned char ai_do1(unsigned char ai)
//Даёт компьютеру сделать ход. ai = 1 или 2 (крестик или нолик) - им ходит компьютер
//Возвращает :
//5 если игра уже закончена.
//1 если сделан ход.
//0 если ход не сделан-ошибка
{
    assert(ai==1 || ai==2);
    unsigned char player=3-ai;
    if (check_win()!=-1) return 5;
    
    unsigned char check_player,is_invert,i,j;
    for (check_player=0;check_player<2;check_player++)        
    
        for (is_invert=0;is_invert<2;is_invert++)
        {
            unsigned char xor[2],or[2],cell[2],st[2];
            
            cell[1]=xor[1]=or[1]=0;
           
            for (i=0;i<3;i++)
            {
                
                st[1]=is_invert?state[2-i][i]:state[i][i];
                xor[1]^=st[1];
                or[1]|=st[1];
                if (st[1]==0) cell[1]=i;          
                
                cell[0]=xor[0]=or[0]=0;                
                
                for (j=0;j<3;j++)
                {
                    st[0]=is_invert?state[i][j]:state[j][i];
                    xor[0]^=st[0];
                    or[0]|=st[0];
                    if (st[0]==0) cell[0]=j;
                }
                
                if (xor[0]==0 && or[0]==(check_player?player:ai))                
                    return state[is_invert?i:cell[0]][is_invert?cell[0]:i]=ai,1;                 
                
                
            }
            
            if (xor[1]==0 && or[1]==(check_player?player:ai))            
                return state[is_invert?2-cell[1]:cell[1]][cell[1]]=ai,1;  
            
            
            
        }      
    
    
    
    for (i=0;i<3;i++)
        for (j=0;j<3;j++)           
            if (state[i][j]==0)            
                return state[i][j]=ai,1;                  
    
    return 0;//по логике сюда выполнение программы не должно дойти
    
    
    
    
}
 
 
unsigned char ai_do(unsigned char ai)/*<==============Использовать эту функцию===========>*/
//Даёт компьютеру возможность поставить крестик\нолик.
//если ai==1 то компьютер играет за крестик, если 2 то за нолик 
//функция Возвращает :
//0 Если произошла ошибка
//1 Если компьютер сделал ход, игра продолжается
//2 Если ничья
//3 Если победил крестик(1)
//4 Если победил нолик(2)
//5 Если игра уже завершена
{
    unsigned char ret=ai_do1(ai);
    char ret2=check_win();
    switch (ret2)
    {
        case 0: return 2;
        case 1: return 3;
        case 2: return 4;
        default: return ret;
            
    }
    
    
}
 
/*  //Пример реализации(откоментировать)
 
static void print(void)
{
    int i,j;
    printf("\n -----\n");
    for (i=0;i<3;i++)
    {
        for (j=0;j<3;j++)
            switch (state[i][j])
            {
                case 0: printf("| ");break;
                case 1: printf("|X");break;
                case 2:printf("|O");break;
            }
            printf("|\n -----\n");
    }
}
int main(void)
{
    int num;
    unsigned char ret;   
    printf("You are krest\n");
    while (print(),scanf("%d",&num))
    {
        if (num<1 || num>9) continue;
        num-=1;
        if (state[num/3][num % 3]) continue;
        state[num/3][num % 3]=1;
        ret=ai_do(2);
        if (ret==2 || ret==3 || ret==4) break;
    }
    print();
    
    if (ret==2) printf("Nichya\n");
    if (ret==3) printf("Krestik\n");
    if (ret==4) printf("Nolik\n");
    scanf("%*c%*c");
    return 0;
}
 */

Вложения
Тип файла: zip krest.zip (3.9 Кб, 45 просмотров)
0
 Аватар для Taras_Z
102 / 86 / 5
Регистрация: 27.10.2010
Сообщений: 534
Записей в блоге: 2
08.03.2012, 12:31  [ТС]
ИИ я как раз сделал мне вот как нибудь уменшить проверку на наличие двух крестиков подряд
код



//////////////////////HORIZONTAL///////////////
if(a[0][0]==a[0][1] && a[0][0]!=' '){ m[0][2]+=100; }
if(a[0][0]==a[0][2] && a[0][0]!=' '){ m[0][1]+=100; }
if(a[0][1]==a[0][2] && a[0][1]!=' '){ m[0][0]+=100; }
if(a[1][0]==a[1][1] && a[1][0]!=' '){ m[1][2]+=100; }
if(a[1][0]==a[1][2] && a[1][0]!=' '){ m[1][1]+=100; }
if(a[1][1]==a[1][2] && a[1][1]!=' '){ m[1][0]+=100; }
if(a[2][0]==a[2][1] && a[2][0]!=' '){ m[2][2]+=100; }
if(a[2][0]==a[2][2] && a[2][0]!=' '){ m[2][1]+=100; }
if(a[2][1]==a[2][2] && a[2][1]!=' '){ m[2][0]+=100; }
///////////////////////VERTICAL/////////////////
if(a[0][0]==a[1][0] && a[0][0]!=' '){ m[2][0]+=100; }
if(a[0][0]==a[2][0] && a[0][0]!=' '){ m[1][0]+=100; }
if(a[1][0]==a[2][0] && a[1][0]!=' '){ m[0][0]+=100; }
if(a[0][1]==a[1][1] && a[0][1]!=' '){ m[2][1]+=100; }
if(a[0][1]==a[2][1] && a[0][1]!=' '){ m[1][1]+=100; }
if(a[1][1]==a[2][1] && a[1][1]!=' '){ m[0][1]+=100; }
if(a[0][2]==a[1][2] && a[0][2]!=' '){ m[2][2]+=100; }
if(a[0][2]==a[2][2] && a[0][2]!=' '){ m[1][2]+=100; }
if(a[1][2]==a[2][2] && a[1][2]!=' '){ m[0][2]+=100; }
///////////////////////DIAGONAL/////////////////
if(a[0][0]==a[1][1] && a[0][0]!=' '){ m[2][2]+=100; }
if(a[0][0]==a[2][2] && a[0][0]!=' '){ m[1][1]+=100; }
if(a[1][1]==a[2][2] && a[1][1]!=' '){ m[0][0]+=100; }
if(a[2][0]==a[1][1] && a[2][0]!=' '){ m[0][2]+=100; }
if(a[2][0]==a[0][2] && a[2][0]!=' '){ m[1][1]+=100; }
if(a[1][1]==a[0][2] && a[1][1]!=' '){ m[2][0]+=100; }



так как два крестика могут бить так
|X| |X|
так
|X|X| |
и так
| |X|X|
можете ваш код проверки обяснить более детально?
0
Формучанин
364 / 296 / 42
Регистрация: 02.11.2010
Сообщений: 1,245
08.03.2012, 18:54
мой подход такой:

пусть a[3] это ряд, который надо проверить на наличие двух крестов и свободной клетки.
если в клетке крестик, то значение 1, если нолик то 2, а если клетка пуста, то 0
подсчитаем xor и or всех чисел(а в переменную cell запишем индекс пустой клетки):
C
1
2
3
4
5
6
7
8
9
10
unsigned char xor,or,cell;
 
xor=or=cell=0;
for (i=0;i<3;i++)
{
or|=a[i];
xor^=a[i];
if (a[i]==0) cell=i;
 
}
xor будет равен нулю в следующих случаях:
-если две клетки содержат одинаковое число (1 или 2) а другая клетка -ноль
-если все клетки нули.

or будет равен 1 если:
-в клетках есть хотябы 1 крестик(1), и нету ноликов(2)

добавляем условие:
C
1
2
3
4
5
6
7
if (xor==0 && or==1)
{
//Вот сейчас оказалось так, что в ряду есть два крестика(1) и пустая клетка( cell )
a[cell]=2;
return;
 
}
0
 Аватар для Taras_Z
102 / 86 / 5
Регистрация: 27.10.2010
Сообщений: 534
Записей в блоге: 2
08.03.2012, 19:59  [ТС]
немного не подходит
я взялся переделать из-за того что хочу делать 15х15 а там уже такой код не подойдет
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
09.03.2012, 11:57
Сейчас у тебя крестики-нолики размером 3 на 3. А поробуй сделать так, чтобы игра была N*N (т.е. НЕ фиксированного размера). Сразу много полезного для себя узнаешь
0
 Аватар для Taras_Z
102 / 86 / 5
Регистрация: 27.10.2010
Сообщений: 534
Записей в блоге: 2
09.03.2012, 14:44  [ТС]
я вот их и делаю

Добавлено через 12 секунд
а как те ети?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
09.03.2012, 14:44
Помогаю со студенческими работами здесь

Крестики нолики
Доброго времени суток, недавно я решил написать игру крестики нолики, написал, но код в ~1300 строк, что очень много, в коде много похожих...

Крестики-нолики
Как сделать игру крестик и нолик в паскале

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

Крестики нолики
Я вот написал алгоритм для крестиков ноликов, а он чегото не работает( посмотрите пожалуйста. ...

Крестики-нолики
Нужно реализовать в Pascal. Что бы были входные(1.in) и выходные(1.out) данные. ) создать .ехе файл Крестики-нолики Условие...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru