Чи можна це назвати штучним інтелектом?
Вивчаючи С в університеті, задався думкою попробувати зробити щось більш серйозне, ніж лабораторні. Захотілося написати хрестики-нулики. Загалом пішло 2 дні на те, щоб придумати алгоритм і реалізацію. Результат і процес написання мені сподобався, і я думаю продовжити рух в цьому напрямку. Але питання: це є штучним інтелектом(хоч примітивним)? Чи варто продовжувати?
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int hid = 0, pside, cside, board[3][3], priorityArray[3][3];
int counter = 0;
#define PRIORITY_ZERO for (j=0;j<3;j++)\
for (i = 0; i < 3;i++)\
priorityArray[i][j] = 0;
#define CYCLE_VERTICAL for( v=0;v<3;v++)\
{if (board[i][v] == side)\
counter++;\
if (counter == 3)\
return side; \
}
#define CYCLE_HORIZONTAL for ( h=0;h<3;h++)\
{if (board[h][j] == side)\
counter++;\
if (counter == 3)\
return side; \
}
#define CYCLE_DIAGONAL1 for (h=2,v=0;h>=0 && v<3;h--,v++)\
{if (board[h][v] == side)\
counter++; \
if (counter == 3)\
return side; \
}
#define CYCLE_DIAGONAL2 for (h=0,v=0;h<3,v<3;h++,v++)\
{if (board[h][v] == side)\
counter++; \
if (counter == 3)\
return side; \
}
int perevirka( int side);
int playerMove();
int compMove();
int sideSelect();
int freecells();
int intro(){
int i, j;
printf("\nVyberit` storonu. 1 dlia X, 0 dlia O\n - ");
for ( j = 0; j < 3;j++)
for (i = 0; i < 3; i++)
board[i][j] = -3;
for (;;)
{
scanf("%d", &pside);
if (pside == 1)
{
cside = 0;
hid++;
break;
}
else if (pside == 0)
{
cside = 1;
break;
}
else { printf("\npovtorit`sprobu\n");
continue;
}
}
};
int main()
{
int i = 0, j = 0;
int x=-3;
intro();
for (;x==-3;){
if ((float)hid / 2 == hid / 2 && perevirka( cside)==-3 && hid!=9)
{
compMove();
x =perevirka(cside);
}
else if (perevirka(pside) == -3 && hid !=9)
{
playerMove();
x = perevirka(pside);
}
else break;
}
system("CLS");
printf(" \n");
for (j = 0; j < 3; j++)
{
for (i = 0; i < 3; i++)
if (board[i][j] == 1)
printf("[X] ");
else if (board[i][j] == 0)
printf("[O] ");
else
{
printf("[ ] ");
}
printf("\n");
}
if (x==pside)
printf("you won");
else if(x==cside)
printf("computer won");
else printf("draw");
getchar();
getchar();
return 0;
}
playerMove(){
system("CLS");
printf(" \n");
int j, i;
for (j = 0; j < 3; j++)
{
for (i = 0; i < 3; i++)
if (board[i][j] == 1)
printf("[X] ");
else if (board[i][j] == 0)
printf("[O] ");
else
{
printf("[ ] ");
}
printf(" \n");
}
printf("\nVvedit` koodynatu");
for (;;){
scanf("%d%d", &i, &j);
if (board[i-1][j-1] == -3)
board[i - 1][j - 1] = pside;
else {
printf("povtorit` sprobu");
continue;
}
break;
}
hid++;
}
compMove(){
int i, j, i1, i2, j1, j2,max;
PRIORITY_ZERO
for (j = 0; j < 3; j++)
{
for (i = 0; i < 3; i++)
{
if (board[i][j] != cside && board[i][j] != pside)
{
board[i][j] = pside;
if (perevirka(pside) == pside)
priorityArray[i][j] += 10;
priorityArray[i][j]++;
board[i][j] = cside;
if (perevirka(cside) == cside)
return 0;
for (j1 = 0; j1 < 3 && hid != 8; j1++)
{
for (i1 = 0; i1 < 3; i1++)
{
if (board[i1][j1] != cside && board[i1][j1] != pside)
{
board[i1][j1] = cside;
if (perevirka(cside) == cside)
priorityArray[i][j] ++;
for (j2 = 0; j2 < 3 && hid != 7; j2++)
{
for (i2 = 0; i2 < 3; i2++)
{
if (board[i2][j2] != cside && board[i2][j2] != pside)
{
board[i2][j2] = cside;
if (perevirka(cside) == cside)
priorityArray[i][j]++;
board[i2][j2] = -3;
}
}
}
board[i1][j1] = -3;
}
}
}
board[i][j] = -3;
}
}
}
max =priorityArray[0][0];
i1 = 0;
j1 = 0;
for (j = 0; j < 3;j++)
for (i = 0; i < 3;i++)
if (priorityArray[i][j]>max)
{
max = priorityArray[i][j];
i1 = i;
j1 = j;
}
board[i1][j1] = cside;
hid++;
}
int perevirka( int side){
counter = 0;
int i, j,h,v;
for (j = 0; j < 3; j++)
{
for (i = 0; i < 3; i++)
{
if (board[i][j] == side)
{
CYCLE_VERTICAL
counter = 0;
CYCLE_DIAGONAL1
counter = 0;
CYCLE_DIAGONAL2
counter = 0;
CYCLE_HORIZONTAL
counter = 0;
}
}
}
return -3;
}
24 коментарі
Додати коментар Підписатись на коментаріВідписатись від коментарівНет, это — предельно примитвная экспертная системма.
Прочитайте «Совершенный код» Макконела, срочно, немедленно, тотчас! Пример кода абсолютно неприемлимый.
В тезах:
— варто поставити перед собою ціль і визначитися з методами її досягнення, а потім багато працювати щоб її досягнути. Ваш успіх не залежить від того чи є ця програма системою штучного інтелекту чи ні. Якщо вам цікаво цим займатися — гугліть по ключовим словам які вам написали інші коментатори і вперед.* Це є системою штучного інтелекту, але це є дуже широке і розмите поняття.
* Експертні системи — підвид систем штучного інтелекту. Вашу програму можна назвати примітивною експертною системою.
* Системи машинного навчання — теж підвид систем штучного інтелекту. Ваша програма нічого спільного з машинним навчанням не має, хоча цю задачу можна вирішити і за допомогою цього підходу.
*
Коментар порушує правила спільноти і видалений модераторами.
-
Коментар порушує правила спільноти і видалений модераторами.
Коментар порушує правила спільноти і видалений модераторами.
Нет, это не является Искусственным Интеллектом. Это экспертная система.
Продолжать стоит.
Вместо ИИ лучше использовать термин Машинное Обучение — Machine Learning и копать в этом направлении. ML включает в себя большинство методов так называемого ИИ такие как нейронные сети, деревья решений, классический и альтернативный анализ данных, генетические алгоритмы.
Пример решения в стиле ИИ это когда вы не учите программу, а наказываете её или поощряете за проигрыш или победу. В процессе такого обучения алгоритм ИИ сам формируется — получается модель которая умеет играть в крестики-нолики, при этом операторов if там гораздо меньше чем необходимо для описания всех вариантов игры. Хрестоматийный пример Вики — Самуэль, Артур
Смысл в том, что в вашем алгоритме изначально не должны присутствовать способы выигрыша. Программа сама должна настроиться на хорошие ходы.
Вообще — это очень интересная тема.
Хороший пример
Коментар порушує правила спільноти і видалений модераторами.
Вообще сказать относится ли нечто к искусственному интеллекту сейчас крайне затруднительно. Код Вы приводили совершенно зря, лучше бы сделали описание на 2 абзаца. Производители пылесосов например считают, что если пылесос сам определяет по давлению на ковре он или на полу и меняет мощность, то это искусственный интеллект. Мне же кажется, что искусственный интеллект прежде всего связан с вопросом обучения. Вот если бы Вы вообще не говорили системе как играть, а только бы рассказали правила, а она бы на основании сотен партий например с Вами же обучилась бы Вас обыгрывать, то это было бы искусственным интеллектом...
Просто большое количество заложенных инструкций — это не искусственный интеллект. Есть вот медицинские приложения, которые задают кучу вопросов, а потом ставят диагноз. Но тут нет искусственного интеллекта, они просто проверяют комбинации совпадений различных условий. Учиться им не нужно и даже плохо, иначе бы мы сами перестали им доверять...
Пятнашки или крестики-нолики?
Немного комментариев:
Не удивляйтесь если за них вас на работе будут бить!1) функция compMove содержит циклы 6 уровней вложенности + if-ы, делать так не надо. разбивайте на маленькие функции, чтобы их можно было осилить в уме.
2) форматирование кода просто ужасно
3) вечные циклы?
4) Никакого транслита! Хотите русский/украинский язык — прикрутите UTF-8 и все сообщения повыносите в bundle_RU.properties, это называется интернационализация.
5) Пишите так, чтобы потом сами смогли разобраться и другие люди тоже.
6) Магические константы в неположенном месте.
Никаких for (i=0; i<3; i++). Лучше привязаться к N. Ну и что, что там всегда 3. Сверху лучше и написать N=3, задел на будущее.
да, про волшебные числа забыл, но без них я бы не понял, что это вроде бы крестики-нолики, т.к. в пятнашках поле обычно 4×4 и одна клетка выкинута.
while(true) может транслироваться в лишнию проверку. Компилятор gcc хорошо оптимизирует. Но я когда-то смотрел листинг и там торчали команды jne, jnz, je. Делает истинную проверку что true это действительно true. Не помню в каком компиляторе. Кажется VC++ 6. Помню что разочаровался махнул рукой и стал использовать for(;;). Он должен дать честный коротенький jmp.
Если это VC++ 6.0, то тогда это самая меньшая из его проблем по оптимизации, по этому поводу не стоит даже париться :D
А я вот парюсь за каждый байт до сих пор. До сих пор хочется выжимать все. Абсолютно все. Драться за каждый такт. Но это в голове. По работе... а что по работе!? :))
Учить английский :)
Кстати по поводу оптимизаций, недавно за бокалом пива об этом размышлял. Вот взять 80486, в те времена были MSCC 2.0/4.0, Borland C/C++ 1.0 или ещё древнее, Watcom 8.x. Вот возьмём культовый Watcom, как самый оптимизирующий, он даёт настолько хреновый код по сравнению с современными компиляторами, что просто диву даёшься, как оно работало на 80486. Возмём современнейший клэнг (clang), он делает код для 80486 настолько красивым, что можно часами рассматривать листинг, как какой-нибудь остросюжетный детектив. Есть в продакшене компы на базе DM&P процессоров, которые по сути четвёркой и являются, если поставить туда клэнг, то он будет компилировать небольшой проект около получаса, но зато полученный код будет работать в2-4 раза быстрее, чем полученный на компиляторах того времени. Плохие компиляторы подстёгивали развитие процессоров, в тоже время развитые процессоры подстёгивали к созданию всё более оптимизирующих компиляторов. И только спустя 20 лет после выхода процессора мы может сказать, что современный компилятор выжал процентов 80% от его максимальной теоретической производительности. Вот такая ирония.
Софт который был сделан сейчас для старых процов по сравнению со старым софтом того же вроня — он лучше в разы?!
Хм, любопытно.
Да, именно в разы.
for ( j = 0; j < 3;j++)
for (i = 0; i < 3; i++)
board[i][j] = −3;
Магические числа, прибитые гвоздями, тоже не нужны.
Избегайте их, однажды там может быть не совсем 3.
Код для компьютера понятный, но для людей — нет. Поработайте над стандартами кода , иначе потом будет очень сложно переучиться. Это действительно срочно.
P. S. А вообще ситуация очень показательная. Наглядно показывает, как низко пало наше образование. Преподаватели действительно такой код принимают и даже не ругают за вот это “\nVYBERIT’ STORONU”. Даже не уделяют время этому в учебной программе и начитке с последующим стребованием.
В бакалаврских работах такого тоже полно и молчание — знак согласия и разрешения продолжать в том же духе. В результате мы на выходе получаем алгоритмически подкованных людей, но которых нужно немедленно переучивать для работы, а за это браться никто не будет.
Вы просто посмотрите кто преподает в универах и найдите хотя бы 1 девелопера. Тоже весьма спорно. Знающие MVC в теории, но не распознающие в коде....
В НАУ вроде преподаёт человек из ДатаАрт.
Больше случаев не знаю.
код хоть подсветите
допустим этим quickhighlighter.com
Багато і недокументовано, не читав уважно код.
Напиши тести, промоделюй в них різну поведінку, протести граничні значення, непередбачену і/або некоректну поведінку і т.д. По результатах тестів зможеш дати сам собі відповідь, чи це просто декілька звичайних перемикачів, чи початок матриці ;)
І на майбутнє, називай змінні ті функції більш осмислено, пиши коменти, пиши тести до свого коду.
Цікаво, чи знайдеться хоч один, котрий не полінується в цьому розібратися?
Ви би хоч коментарі написали, не кажучи вже про опис алгоритму людською мовою.
Ага, выглядит как «я вчера курил траву, и вот что получилось... Шо это?»
Будете продолжать или нет, но привычку называть функции а-ля
искореняйте с ненавистью:)Искусственный интеллект имхо это любая программа где есть оператор if :)))) главное правильно накодить тогда думать начнет!