Чи можна це назвати штучним інтелектом?

💡 Усі статті, обговорення, новини про AI — в одному місці. Приєднуйтесь до AI спільноти!

Вивчаючи С в університеті, задався думкою попробувати зробити щось більш серйозне, ніж лабораторні. Захотілося написати хрестики-нулики. Загалом пішло 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;
}
👍ПодобаєтьсяСподобалось0
До обраногоВ обраному0
LinkedIn
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter

Нет, это — предельно примитвная экспертная системма.

Прочитайте «Совершенный код» Макконела, срочно, немедленно, тотчас! Пример кода абсолютно неприемлимый.

В тезах:
* Це є системою штучного інтелекту, але це є дуже широке і розмите поняття.
* Експертні системи — підвид систем штучного інтелекту. Вашу програму можна назвати примітивною експертною системою.
* Системи машинного навчання — теж підвид систем штучного інтелекту. Ваша програма нічого спільного з машинним навчанням не має, хоча цю задачу можна вирішити і за допомогою цього підходу.
*

Чи варто продовжувати?
— варто поставити перед собою ціль і визначитися з методами її досягнення, а потім багато працювати щоб її досягнути. Ваш успіх не залежить від того чи є ця програма системою штучного інтелекту чи ні. Якщо вам цікаво цим займатися — гугліть по ключовим словам які вам написали інші коментатори і вперед.

Коментар порушує правила спільноти і видалений модераторами.

Коментар порушує правила спільноти і видалений модераторами.

Коментар порушує правила спільноти і видалений модераторами.

Нет, это не является Искусственным Интеллектом. Это экспертная система.
Продолжать стоит.

Вместо ИИ лучше использовать термин Машинное Обучение — Machine Learning и копать в этом направлении. ML включает в себя большинство методов так называемого ИИ такие как нейронные сети, деревья решений, классический и альтернативный анализ данных, генетические алгоритмы.

Пример решения в стиле ИИ это когда вы не учите программу, а наказываете её или поощряете за проигрыш или победу. В процессе такого обучения алгоритм ИИ сам формируется — получается модель которая умеет играть в крестики-нолики, при этом операторов if там гораздо меньше чем необходимо для описания всех вариантов игры. Хрестоматийный пример Вики — Самуэль, Артур

Смысл в том, что в вашем алгоритме изначально не должны присутствовать способы выигрыша. Программа сама должна настроиться на хорошие ходы.

Вообще — это очень интересная тема.
Хороший пример

Коментар порушує правила спільноти і видалений модераторами.

Вообще сказать относится ли нечто к искусственному интеллекту сейчас крайне затруднительно. Код Вы приводили совершенно зря, лучше бы сделали описание на 2 абзаца. Производители пылесосов например считают, что если пылесос сам определяет по давлению на ковре он или на полу и меняет мощность, то это искусственный интеллект. Мне же кажется, что искусственный интеллект прежде всего связан с вопросом обучения. Вот если бы Вы вообще не говорили системе как играть, а только бы рассказали правила, а она бы на основании сотен партий например с Вами же обучилась бы Вас обыгрывать, то это было бы искусственным интеллектом...
Просто большое количество заложенных инструкций — это не искусственный интеллект. Есть вот медицинские приложения, которые задают кучу вопросов, а потом ставят диагноз. Но тут нет искусственного интеллекта, они просто проверяют комбинации совпадений различных условий. Учиться им не нужно и даже плохо, иначе бы мы сами перестали им доверять...

Пятнашки или крестики-нолики?

Немного комментариев:
1) функция compMove содержит циклы 6 уровней вложенности + if-ы, делать так не надо. разбивайте на маленькие функции, чтобы их можно было осилить в уме.
2) форматирование кода просто ужасно
3) вечные циклы?

for (;;){
Не удивляйтесь если за них вас на работе будут бить!
4) Никакого транслита! Хотите русский/украинский язык — прикрутите UTF-8 и все сообщения повыносите в bundle_RU.properties, это называется интернационализация.
5) Пишите так, чтобы потом сами смогли разобраться и другие люди тоже.

6) Магические константы в неположенном месте.
Никаких for (i=0; i<3; i++). Лучше привязаться к N. Ну и что, что там всегда 3. Сверху лучше и написать N=3, задел на будущее.

да, про волшебные числа забыл, но без них я бы не понял, что это вроде бы крестики-нолики, т.к. в пятнашках поле обычно 4×4 и одна клетка выкинута.

Не удивляйтесь если за них вас на работе будут бить!
Я всегда использую вечные циклы, правда только в виде do { } while(1); ибо for() для этих целей некошерен.

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% от его максимальной теоретической производительности. Вот такая ирония.

Софт который был сделан сейчас для старых процов по сравнению со старым софтом того же вроня — он лучше в разы?!
Хм, любопытно.

Да, именно в разы.

printf("\nVyberit` storonu. 1 dlia X, 0 dlia O\n — ");
int perevirka( int side)
printf("\nVvedit` koodynatu");
printf("povtorit` sprobu“);
Пожалуйста, не делайте так больше, никогда в жизни. Транслит — это жутко.

for ( j = 0; j < 3;j++)
for (i = 0; i < 3; i++)
board[i][j] = −3;

Магические числа, прибитые гвоздями, тоже не нужны.
Избегайте их, однажды там может быть не совсем 3.

Код для компьютера понятный, но для людей — нет. Поработайте над стандартами кода , иначе потом будет очень сложно переучиться. Это действительно срочно.


Bивчаючи С в університеті, задався думкою попробувати зробити щось більш серйозне, ніж лабораторні.

P. S. А вообще ситуация очень показательная. Наглядно показывает, как низко пало наше образование. Преподаватели действительно такой код принимают и даже не ругают за вот это “\nVYBERIT’ STORONU”. Даже не уделяют время этому в учебной программе и начитке с последующим стребованием.
В бакалаврских работах такого тоже полно и молчание — знак согласия и разрешения продолжать в том же духе. В результате мы на выходе получаем алгоритмически подкованных людей, но которых нужно немедленно переучивать для работы, а за это браться никто не будет.
P. S. А вообще ситуация очень показательная. Наглядно показывает, как низко пало наше образование.
В нашей стране IT-образование никогда и не было на высоком уровне.
Вы просто посмотрите кто преподает в универах и найдите хотя бы 1 девелопера.
В результате мы на выходе получаем алгоритмически подкованных людей
Тоже весьма спорно. Знающие MVC в теории, но не распознающие в коде....

В НАУ вроде преподаёт человек из ДатаАрт.
Больше случаев не знаю.

код хоть подсветите
допустим этим quickhighlighter.com

Багато і недокументовано, не читав уважно код.
Напиши тести, промоделюй в них різну поведінку, протести граничні значення, непередбачену і/або некоректну поведінку і т.д. По результатах тестів зможеш дати сам собі відповідь, чи це просто декілька звичайних перемикачів, чи початок матриці ;)
І на майбутнє, називай змінні ті функції більш осмислено, пиши коменти, пиши тести до свого коду.

Цікаво, чи знайдеться хоч один, котрий не полінується в цьому розібратися?
Ви би хоч коментарі написали, не кажучи вже про опис алгоритму людською мовою.

Ага, выглядит как «я вчера курил траву, и вот что получилось... Шо это?»

Будете продолжать или нет, но привычку называть функции а-ля

perevirka
искореняйте с ненавистью:)

Искусственный интеллект имхо это любая программа где есть оператор if :)))) главное правильно накодить тогда думать начнет!

Підписатись на коментарі