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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 22.12.2012, 20:00   #1
Exidnyi Pekar
Новичок
Джуниор
 
Регистрация: 22.12.2012
Сообщений: 2
По умолчанию Крестики нолики с компьютером на C

Такое вот задание: сделать крестики-нолики для игры с компьютером на C. Немного погуглив и нифуя не поняв, решил взяться за это сам. Мучился долго и упорно, в итоге готово всё, кроме хода компьютера.
Код:
#include<iostream>
#include<conio.h>
using namespace std;
void print_board(char board[][3]);
void fill_board(char board[][3]);
void player_move(char board[][3]);
int win(char board[][3]);
void print_move_options();
void computer_move(char board[][3]);
int a,b; 
char player='0', computer='X';
void main()
{
int nichyah=0; 
char board[3][3];
fill_board(board);
do
    {
        print_move_options();//рисуется поле
        print_board(board);//рисуется доска с ходами
        player_move(board);//ход игрока
        print_board(board);
        if(win(board)==1)
        {
            cout<<"Player pobejdaet!\n";
            break;
        }
        computer_move(board);
        print_board(board);
        if(win(board)==2)
        {
            cout<<"Computer pobejdaet!\n";
            break;
        }
        nichyah++;
    }while(nichyah<9);
}
void fill_board(char board[][3])
{
for(int i=0;i<3;i++)
    {
        for(int j=0;j<3;j++)
        {   
            board[i][j]='-';
        }
    }
}
void print_board(char board[][3])
{   cout<<"\n";
    cout<<"-"<<board[0][0]<<"-|-"<<board[0][1]<<"-|-"<<board[0][2]<<"-\n";
    cout<<"-"<<board[1][0]<<"-|-"<<board[1][1]<<"-|-"<<board[1][2]<<"-\n";
    cout<<"-"<<board[2][0]<<"-|-"<<board[2][1]<<"-|-"<<board[2][2]<<"-\n";
}
 
void player_move(char board[][3])
{
    cin>>a;
    cin>>b;
    while(board[a-1][b-1]!='-')
    {
        cout<<"Kletka s koordianami "<<a<<"."<<b<<" Uje zanyata! Vyberite druguju!\n";
        cin>>a;
        cin>>b;
    }
    
    board[a-1][b-1]='0';
}
void print_move_options()
{
    cout<<"\nMove positions: \n";
    cout<<"a positions:\n";
    cout<<"   1| 2 | 3 \n";
    cout<<"============\n";
    cout<<"|1.1|1.2|1.3\n";
    cout<<"|2.1|2.2|2.3| b positions\n";
    cout<<"|3.1|3.2|3.3\n";
    cout<<"\n";
}
 
int win(char board[][3])
{
    if((board[0][0]==player&&board[0][1]==player&&board[0][2]==player)||(board[1][0]==player&&board[1][1]==player&&board[1][2]==player)||(board[2][0]==player&&board[2][1]==player&&board[2][2]==player)||(board[0][0]==player&&board[1][0]==player&&board[2][0]==player)||(board[0][1]==player&&board[1][1]==player&&board[2][1]==player)||(board[0][2]==player&&board[1][2]==player&&board[2][2]==player)||(board[0][0]==player&&board[1][1]==player&&board[2][2]==player)||(board[0][2]==player&&board[1][1]==player&&board[2][0]==player))
    {cout<<"Player pobejdaet!\n";
        return 1;
    }
    else if((board[0][0]==computer&&board[0][1]==computer&&board[0][2]==computer)||(board[1][0]==computer&&board[1][1]==computer&&board[1][2]==computer)||(board[2][0]==computer&&board[2][1]==computer&&board[2][2]==computer)||(board[0][0]==computer&&board[1][0]==computer&&board[2][0]==computer)||(board[0][1]==computer&&board[1][1]==computer&&board[2][1]==computer)||(board[0][2]==computer&&board[1][2]==computer&&board[2][2]==computer)||(board[0][0]==computer&&board[1][1]==computer&&board[2][2]==computer)||(board[0][2]==computer&&board[1][1]==computer&&board[2][0]==computer))
    {cout<<"Computer pobejdaet!\n";
        return 2;
    }
}
void computer_move(board[][3])
{
//собственно, сабж
}
А вот теперь насчёт функции computer_move. Выиграть можно, если вставить в 3 клетки по горизонтали, вертикали и диагонали один и тот же символ. Эта функция будет пересматривать в массиве по очереди диагонали, вертикали и горизонтали. Если в одной из этих позиций два одинаковых символа - она ставит в третью свободную клетку символ компьютера и передаёт ход игроку. Сначала функция ищет 2 символа, которые принадлежат компьютеру, на случай, если он может выиграть, потом 2 символа пользователя, чтобы помешать ему победить. Если эти условия не выполняются, то она ищет случайную свободную клетку и ставит символ туда. Игровое поле это символьный массив забитый '-'. Он значит, что эта клетка свободна и туда можно ходить. Реализовать это так и не смог - получилось очень криво, пока не буду выкладывать, посмотрю, что посоветуют.
==================
Прошу прощения за транслит в коде и функцию поиска победы, которая растянула страницу.

Последний раз редактировалось Exidnyi Pekar; 22.12.2012 в 20:07.
Exidnyi Pekar вне форума Ответить с цитированием
Старый 23.12.2012, 18:19   #2
Exidnyi Pekar
Новичок
Джуниор
 
Регистрация: 22.12.2012
Сообщений: 2
По умолчанию

Модераторы, будьте няшками, перенести пожалуйста в "Игры", может мне там ответят.
Exidnyi Pekar вне форума Ответить с цитированием
Старый 29.12.2018, 20:32   #3
itrobo
Новичок
Джуниор
 
Регистрация: 29.12.2018
Сообщений: 1
По умолчанию

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


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
крестики нолики aesoem Общие вопросы Delphi 11 12.06.2011 11:32
Крестики-Нолики Jasper92 Помощь студентам 3 01.11.2010 18:35
Крестики нолики aud Паскаль, Turbo Pascal, PascalABC.NET 2 15.06.2009 22:32
Крестики-нолики Linker88 Фриланс 10 20.05.2009 07:24
Крестики-нолики С++ ROD Помощь студентам 7 21.12.2008 20:07