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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 20.12.2008, 14:28   #1
ROD
Linux C++ Qt ARM
Старожил
 
Аватар для ROD
 
Регистрация: 30.11.2008
Сообщений: 3,030
По умолчанию Крестики-нолики С++

Решил я игру такую сделать, но столкнулся с некоторыми трудностями, а именно - АИ иногда ходит в то место куда до него уже кто-то (он или я) ходил. Вот выкладываю вам код программы, помогите, пожалусто, найти ошибку. ТОлько что установил, что там неизвестным образом, не понятно откуда берутся посторонние значения (например в пустой клетке мне попалось значение -1)

Что касается хода игрока, то циферки на нумпаде соответствуют клеточке (см ниже)
789
456
123

### ###
### ###
1## X##

### ###
#5# #X#
### ###

7## X##
### ###
### ###



P.S. В данный момент код не предусматривает победы, ибо у я щас думаю над алгоритмом определения победы (т.е. при заполнении всего поля компьютер или игрок (не помню чей ход будет после последнего) будет бесконечно пытаться найти место куда можно сходить).

Код:
//коды цифр от 1-го до 9, 49-57 соответственно
#include <iostream.h>
#include <conio.h>
#include <stdlib.h> // для доступа к srand(), rand()
#include <time.h> // для доступа к time_t и time()
void print(int *p, int player);
int turn();
int inspect(int *p,int  x,int  y);
int ai();
//int win(int *p);
void main()
{
time_t t;
srand( (unsigned) time (&t) ) ;
int fild[3][3]={0,0,0,0,0,0,0,0,0};
// Здесь находятся, соответственно,
// Координаты Х, У, Смешаные координаты (удобно возвращать из функции)
// ID игрока (если 1 = человек, если -1 - АИ)
// И метка внесения  масив
// (0- никто не ходил, 1 - человек туда ходил (крестик), -1 - АИ ходил (нолик))
int x,y,xy, player=1, metka, error=1,end=0;
//под еррором подразумевается не допустимый ход

//Алгоритм распределения хода между Игроком и АИ, если необходимо заменить АИ
//на второго игрока, то необходимо заменить строку  xy=ai();   на   xy=turn();
//Одновременно с ходом проверяется можно ли вообще в то место ходить
//Если нет, то прорграмма потребует от игрока/АИ заново сделать ход
while (end == 0)
{

while (error == 1)
	{
	if (player>0)
	{
	//ход игрока
	xy=turn();
	//Игрок у нас будет ходить крестиками.
	metka = 1;
	}
	else
	{
	//ход АИ
	xy=ai();
	//АИ у нас будет ходить ноликами.
	metka = -1;
	}
	//преобразование координат из смешаной формы
	// в форму удобную для работы с масивом
	x=xy/10;
	y=xy%10;
	cout<<"x= "<<x<<endl;
	cout<<"y= "<<y<<endl;
	getch();
   error = inspect(&fild[0][0], x, y);
   }
fild[x][y] = metka;
player = player * (-1);
//end = win(&fild[0][0]);
error = 1;
print(&fild[0][0],player);
 getch();
}
}


turn()
{
int xy, key, error =1;
while (error == 1)
{
	key = getch();
      switch (key)
      	{
      	case 49:
      	xy = 0;
         error = 0;
      	break;
      	case 50:
      	xy = 1;
         error = 0;
      	break;
      	case 51:
      	xy = 2;
         error = 0;
      	break;
      	case 52:
      	xy = 10;
         error = 0;
      	break;
      	case 53:
      	xy = 11;
         error = 0;
      	break;
      	case 54:
      	xy = 12;
         error = 0;
      	break;
      	case 55:
      	xy = 20;
         error = 0;
      	break;
      	case 56:
      	xy = 21;
         error = 0;
      	break;
      	case 57:
      	xy = 22;
         error = 0;
         break;
      	default:
         error = 1;
      	break;
         }
}
cout<<"Return to main funktion"<<endl;
return xy;
}


int inspect(int *p, int  x, int  y)
{
int error = 0;
int n = 2*x+y;

for (int i=0; i <n; i++)
{p++;}
if (*p != 0)
{error = 1;}
return error;
}

int ai()
{
int x =  rand()%3;
int y =  rand()%3;
int xy;
xy = x*10 + y;
return xy;
}

void print(int *p, int player)
{
cout<<"now ";
if (player==1)
{cout<<"player`s ";}
else
{cout<<"computer`s ";}
cout<<"turn"<<endl;
int a[3][3];
int i,j;
for (i=0; i<3; i++)
	{
   for (j=0; j<3; j++)
   	{
      a[i][j] = *p;
      p++;
      }
   }
for (i=2; i>=0; i--)
	{
   for (j=0; j<3; j++)
   	{
      if (a[i][j]== 1){cout<<"X";}
      if (a[i][j]== 0){cout<<"#";}
      if (a[i][j]== -1){cout<<"O";}

      }
   cout<<endl;
   }
}
Дилетант широкого профиля.

"Слова ничего не стоят - покажите мне код!" © Линус Торвальдс

Последний раз редактировалось ROD; 20.12.2008 в 14:53.
ROD вне форума Ответить с цитированием
Старый 20.12.2008, 20:21   #2
Goblin
Форумчанин
 
Регистрация: 24.11.2007
Сообщений: 196
По умолчанию

// Вроде работает;
// Вот только интеллекта не хватает;

Код:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int POLE[3][3] = {{0,0,0},
                  {0,0,0},
                  {0,0,0}};
int win()
{
    if(POLE[0][0] == POLE[0][1] && POLE[0][1] == POLE[0][2])
        return POLE[0][0];
    if(POLE[1][0] == POLE[1][1] && POLE[1][1] == POLE[1][2])
        return POLE[1][0];       
    if(POLE[2][0] == POLE[2][1] && POLE[2][1] == POLE[2][2])
        return POLE[2][0];
    
    if(POLE[0][0] == POLE[1][0] && POLE[1][0] == POLE[2][0])
        return POLE[0][0];
    if(POLE[0][1] == POLE[1][1] && POLE[1][1] == POLE[2][1])
        return POLE[0][1];
    if(POLE[0][2] == POLE[1][2] && POLE[1][2] == POLE[2][2])
        return POLE[0][2];
        
    if(POLE[0][0] == POLE[1][1] && POLE[1][1] == POLE[2][2])
        return POLE[0][0];
    if(POLE[0][2] == POLE[1][1] && POLE[1][1] == POLE[2][0])
        return POLE[0][2];
}
                   
void print()
{
    int i, j;
    for(i=0; i<3; i++)
    {
        for(j=0; j<3; j++)
        {
            switch (POLE[i][j])
            {
                case -1:
                    printf("%c ", 'x');
                    break;
                case 1:
                    printf("%c ", '0');
                    break;
                case 0:
                    printf("%c ", '*');
                    break;
                default:
                    printf("Ошибка: В массиве находиться нераспознанный символ\n");
                    break;
            }
        }
        printf("\n");
    }
}
int main()
{   
    int x, y, w;
    // Компьютер крестиками, игрок ноликами;
    int  comp = -1, player = 1;
    
    srand(time(0));
    
    printf("ДОБРО ПОЖАЛОВАТЬ\n\n");
    do
    {
        printf("Ваш ход (x, y):\n\n"); 
        
        scanf("%d %d", &x, &y);
        if(x>3 || y>3 || x<1 || y < 1)
        {
            printf("Ошибка вы ввели недопустимые координаты\n");
            continue;
        }
        
        if(POLE[y-1][x-1] != player && POLE[y-1][x-1] != comp)
        {
            POLE[y-1][x-1] = player;
            print();
        }
        else
        {
            printf("Сюда ходить уже нельзя\n");
            continue;
        }
        
        w = win();
        if(w==-1)
        {
            printf("ПОБЕДИЛ КОПЬЮТЕР!\n");
            return 0;
        }
        
        if(w==1)
        {
            printf("ВЫ ПОБДИЛИ\n");
            return 0;
        }
        
        // теперь ход компьютера;
        printf("Ход компьютера...\n");
        do
        {
            do
            {
                y = rand() % 10;
            }while(y<1 || y > 3);
            do
            {
                x = rand() % 10;
            }while(x<1 || x > 3);
            
            
        }while(POLE[y-1][x-1] == player || POLE[y-1][x-1] == comp);
        
        POLE[y-1][x-1] = comp;
        
        print();
        
        w = win();
        if(w==-1)
        {
            printf("ПОБЕДИЛ КОПЬЮТЕР!\n");
            return 0;
        }
        
        if(w==1)
        {
            printf("ВЫ ПОБEДИЛИ\n");
            return 0;
        }           
    }while(1);
    return 0;
}
Goblin вне форума Ответить с цитированием
Старый 20.12.2008, 20:29   #3
ROD
Linux C++ Qt ARM
Старожил
 
Аватар для ROD
 
Регистрация: 30.11.2008
Сообщений: 3,030
По умолчанию

Спасибо за ответ.
Ваша программа выглядит более компактной.
Я обязательно рассмотрю такой вариант кода.
мне все-таки удалось отладить свой, но всеравно спасибо за ответ.

Насчет отсуствия интелекта - это да,е сть такая проблема, мне никак в глову алгоритм придти не может.
Дилетант широкого профиля.

"Слова ничего не стоят - покажите мне код!" © Линус Торвальдс
ROD вне форума Ответить с цитированием
Старый 20.12.2008, 20:44   #4
Goblin
Форумчанин
 
Регистрация: 24.11.2007
Сообщений: 196
По умолчанию

Насчет интеллекта я почти придумал. Если сделаю обязательно напишу.
Goblin вне форума Ответить с цитированием
Старый 20.12.2008, 23:11   #5
ROD
Linux C++ Qt ARM
Старожил
 
Аватар для ROD
 
Регистрация: 30.11.2008
Сообщений: 3,030
По умолчанию

Буду признателен.
Дилетант широкого профиля.

"Слова ничего не стоят - покажите мне код!" © Линус Торвальдс
ROD вне форума Ответить с цитированием
Старый 20.12.2008, 23:29   #6
ROD
Linux C++ Qt ARM
Старожил
 
Аватар для ROD
 
Регистрация: 30.11.2008
Сообщений: 3,030
По умолчанию

Нет, все-таки у меня в алгоритме куча непонятных ошибок нашлась.
Дилетант широкого профиля.

"Слова ничего не стоят - покажите мне код!" © Линус Торвальдс
ROD вне форума Ответить с цитированием
Старый 21.12.2008, 19:28   #7
Goblin
Форумчанин
 
Регистрация: 24.11.2007
Сообщений: 196
По умолчанию

Цитата:
Нет, все-таки у меня в алгоритме куча непонятных ошибок нашлась.
Забудь все что написал до этого, и напиши все снова.

Мне иногда помогает
Goblin вне форума Ответить с цитированием
Старый 21.12.2008, 20:07   #8
ROD
Linux C++ Qt ARM
Старожил
 
Аватар для ROD
 
Регистрация: 30.11.2008
Сообщений: 3,030
По умолчанию

Цитата:
Забудь все что написал до этого, и напиши все снова.

Мне иногда помогает
Я еще раз пересмотрел алгоритмы, отвечающие за найденные ошибки, че-то там поковырял... пока больше не замечал ошибок, хотя пытался их "справоцировать"
Дилетант широкого профиля.

"Слова ничего не стоят - покажите мне код!" © Линус Торвальдс
ROD вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
крестики нолики aesoem Общие вопросы Delphi 11 12.06.2011 11:32
Крестики нолики на C++ Alar Gamedev - cоздание игр: Unity, OpenGL, DirectX 11 15.03.2010 16:09
Крестики - Нолики Иваненко Помощь студентам 6 09.05.2008 22:09
x_O Крестики-нолики by -ORTODOX- Общие вопросы Delphi 1 10.03.2008 19:03
Крестики-нолики Delphi yulia Помощь студентам 12 18.04.2007 18:03