Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 09.02.2014, 21:37   #1
Nigrum_papilio
 
Регистрация: 09.02.2014
Сообщений: 4
По умолчанию Игра Х/О,сделать программу умнее (С++)

Помогите доделать Х/О, так то работает все, но ходы компа оставляют желать лучшего(( меня хватило на банальный рандом координат.
Помогите хоть с какой то оптимизацией его разума, что б он не проигрывал так банально

Код:
#include<iostream>
#include<stdlib.h>
#include<time.h>
using namespace std;

int main(){
srand(time(0));
const int S=3,PROC=0,X_W=1,O_W=2,DRAW=3;
char pole[S][S];
int x,y,kh=1;
int gs=PROC;
for(int i=0;i<S;i++){
	for(int j=0; j<S; j++){
		pole[i][j]='-';
	}
}
while(gs==PROC){
	if(kh%2!=0){
	cout<<"HOD -X-";
	cout<<"kordinat hoda: ";
	cin>>x>>y;
	}
	else{
	cout<<"HOD -O-";
	x=rand()%S;  //ходит комп
	y=rand()%S;
	}
	cout<<endl;

x--;y--;
	if(x<0 || x>S-1 || y<0 || y>S-1 ){
	continue;
	}
	if(pole[x][y]!='-'){
	continue;
	}
	if(kh%2!=0){
		pole[x][y]='x';
	}
	else{
		pole[x][y]='o';
	}	
	kh++;
for(int i=0;i<S;i++){
	for(int j=0; j<S; j++){
		cout<<pole[i][j];
		if(j!=S-1){
		cout<<" | ";
		}
	}
	cout<<endl;
	if(i!=S-1){
	cout<<"---------\n";
	}
	
		
}
for(int i=0;i<S;i++){
if(pole[i][0]=='x'&&
	pole[i][1]=='x'&&
	pole[i][2]=='x'){
	gs=X_W;
		break;
	}
	if(pole[i][0]=='o'&&
	pole[i][1]=='o'&&
	pole[i][2]=='o'){
	gs=O_W;
		break;
	}
	if(pole[0][i]=='x'&&
	pole[1][i]=='x'&&
	pole[2][i]=='x'){
	gs=X_W;
		break;
	}
	if(pole[0][i]=='o'&&
	pole[1][i]=='o'&&
	pole[2][i]=='o'){
	gs=X_W;
		break;
	}
	if(gs==PROC && kh>9){
	gs=DRAW;
	break;
	}
}
if(pole[0][0]=='x'&&pole[1][1]=='x'&&pole[2][2]=='x')
	gs=X_W;
if(pole[0][2]=='x'&&pole[1][1]=='x'&&pole[2][0]=='x')
	gs=X_W;
if(pole[0][0]=='o'&&pole[1][1]=='o'&&pole[2][2]=='o')
	gs=O_W;
if(pole[0][2]=='o'&&pole[1][1]=='o'&&pole[2][0]=='o')
	gs=O_W;
}
if(gs==X_W)
	cout<<"-X- WIN!!!";
else if(gs==DRAW)
	cout<<"PAT";
else
	cout<<"WIN -O-";
}
Nigrum_papilio вне форума Ответить с цитированием
Старый 09.02.2014, 23:06   #2
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,543
По умолчанию

Опа-на. Вам всю "теорию игр" рассказать или по-частям?
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder

Последний раз редактировалось Smitt&Wesson; 09.02.2014 в 23:21.
Smitt&Wesson вне форума Ответить с цитированием
Старый 09.02.2014, 23:17   #3
Nigrum_papilio
 
Регистрация: 09.02.2014
Сообщений: 4
По умолчанию

Я знаю что его нужно заставить ходить по крайним клеткам, и при этом проверять хода противника не выходит ли у него выигрышная комбинация и если что, то перекрывать.
Сложность состоит в том что не могу понять как это написать
Nigrum_papilio вне форума Ответить с цитированием
Старый 09.02.2014, 23:22   #4
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,543
По умолчанию

Ну, страниц 200 (печатных) или 2 000 постов на форуме Вам хватит? Очень на это надеюсь.
Эту задачку, на сколько знаю, ещё нико в полном объёме рещить не смог,хотя есть и частные решения.
Теорему Ферма уже доказали. Так, что - фиг его знает, может и Вам повезёт.
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder

Последний раз редактировалось Smitt&Wesson; 09.02.2014 в 23:31.
Smitt&Wesson вне форума Ответить с цитированием
Старый 09.02.2014, 23:55   #5
Nigrum_papilio
 
Регистрация: 09.02.2014
Сообщений: 4
По умолчанию

я был бы вам очень признателен если б вы показали этот кусочек с ИИ, как делать первый ход что б не проиграть или свести к ничьей я знаю, возникает только проблема с проверкой "если следующим ходом противник выиграет" что б ИИ перекрывал этот ход. Конечно можно написать гору if'ов но это не правильно и нужно оптимизировать хоть как то.
Nigrum_papilio вне форума Ответить с цитированием
Старый 10.02.2014, 13:03   #6
DanZ
Пользователь
 
Регистрация: 31.01.2014
Сообщений: 52
По умолчанию

Думаю поможет. Правда если с помощью If делать то код огромный будет...а как еще не знаю
Изображения
Тип файла: jpg 1391085062_286213350.jpg (69.7 Кб, 71 просмотров)
DanZ вне форума Ответить с цитированием
Старый 10.02.2014, 13:51   #7
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,331
По умолчанию

Я не понял, что требуется - доказать, что игра не имеет выигрышной стратегии или подобрать алгоритм, чтоб сводить игру к ничьей?
waleri вне форума Ответить с цитированием
Старый 10.02.2014, 14:05   #8
Nigrum_papilio
 
Регистрация: 09.02.2014
Сообщений: 4
По умолчанию

подобрать алгоритм что б программа сводила игру к ничьей или выигрывала.
поскольку на данный момент ходы делаются от фанаря это не совсем правильно
Nigrum_papilio вне форума Ответить с цитированием
Старый 10.02.2014, 15:27   #9
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,331
По умолчанию

Начните с того, что сформулирайте нужные правила на человекопонятном языке, потом можно будет думать как их реализовывать в коде.
waleri вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сделать, чтобы пустой квадрат был в нижнем правом углу (игра пятнашки) Nikitos_ Паскаль, Turbo Pascal, PascalABC.NET 21 03.06.2012 22:04
Нужно сделать движение чисел кнопоками (w,a,s,d) игра пятнашки Nikitos_ Паскаль, Turbo Pascal, PascalABC.NET 5 01.06.2012 23:23
я вот решил задать вопрос умнее... pufystyj Свободное общение 34 10.07.2011 03:34
Есть игра, как сделать ее сетевой? Ellita Работа с сетью в Delphi 24 25.03.2009 21:07