Морской Бой по сети C++

Тема в разделе "Разработка игр и приложений к ним", создана пользователем MiRiN, 6 май 2010.

  1. MiRiN

    MiRiN Гость

    Приветствую всех! Очень нужна помощь... Не как не могу разобраться с Сокетами(( В общем есть программа вернее игра консольный Морской бой.. Нужно реализовать возможность игры по сети... То есть запускает игру один игрок и другой и рубят друг с другом, желательно реализовать это без сервера... Ну то есть может быть чтобы один из Игроков был сервером и клиентом... В общем что то как то я не могу додуматься как это реализовать... Вот моя исходник:
    Код (Text):
    //MyHead.h

    #include <clocale>
    #include <conio.h>
    #include <stdlib.h>
    #include <iostream>
    #include <ctime>
    #include <winsock.h>
    #include <windows.h>

    enum direction{h,v};

    class player
    {
    public:
    bool defeat_flag; // переменная хранит информацию о поражении
    int hits[10][10]; // массив "выстрелов" объекта
    int ships[10][10]; // массив кораблей объекта

    player (): defeat_flag(0)   {} // конструктор

    void ships_init();
    void set(int deck);
    int place_ship(int s, int c, direction dir, int deck);
    void turn(player&, int character, int digit);
    void turn(player&);
    };
    const int s = 13, c = 29;
    char map[s][c] = {
    " 0123456789     0123456789 ",
    " #----------#  #----------#",
    "0|      | 0|        |",
    "1|      | 1|        |",
    "2|      | 2|        |",
    "3|      | 3|        |",
    "4|      | 4|        |",
    "5|      | 5|        |",
    "6|      | 6|        |",
    "7|      | 7|        |",
    "8|      | 8|        |",
    "9|      | 9|        |",
    " #----------#  #----------#" };

    void map_init(char map[s][c]);
    void show (char map[s][c]);
    int input(char&, char&);
    void test();
    int check_ending();

    char numbers[10] = { '0','1','2','3','4','5','6','7','8','9'};



    SeaWar.cpp


    #include "MyHead.h"

    player human;
    player computer;

    int main()
    {
    setlocale(LC_CTYPE, "Russian");
    int message = 0;
    srand( static_cast<unsigned int>(time(NULL)) );

    human.ships_init();
    computer.ships_init();
    map_init(map);

    /*
    message может содержать три значения:
    0 - всё нормально
    1 - пользователь нажал неверную клавишу
    2 - кто-то победил, конец игры
    */
    while (message != 2)
    {
    int user_input = 0;
    system("cls");
    show(map);   
    if (message == 1)
    std::cout << "Вы ввели неверное значение!\n";
    message = 0;  

    char character, digit;
    user_input = input(character, digit);
    if (user_input == 1)
    {
    message = 1;
    continue;
    }

    human.turn(computer,character, digit);
    computer.turn(human);
    message = check_ending();
    }
    _getch();
    return 0;
    }



    void map_init(char map[s][c])
    {
    for (int i=0;i < 10; i++)
    {
    for (int j=0; j < 10; j++)
    {
    if (human.ships[i][j] == 2)
    map[i+2][j+2] = 'К';
    }
    }
    }


    void show(char map[s][c])
    {
    for (int i=0; i<10; i++)
    {
    for (int j=0; j<10; j++)
    {
    /* Заполняем поле игрока */
    if (computer.hits[i][j] == 1 && human.ships[i][j] == 3)
    {
    map[i+2][j+2] = 'Х';
    }
    else if (computer.hits[i][j] == 1 && human.ships[i][j] != 3)
    {
    map[i+2][j+2] = 'О';
    }

    /* Заполняем поле компьютера */
    if (computer.ships[i][j] == 3 && human.hits[i][j] == 1)
    {
    map[i+2][j+2+15] = 'Х';
    }
    else if (computer.ships[i][j] != 3 && human.hits[i][j] == 1)
    {
    map[i+2][j+2+15] = 'O';
    }
    }
    }

    for (int i = 0; i < s; i++)
    {
    for (int j = 0; j < c; j++)
    {
    std::cout << map[i][j];
    }
    std::cout << "\n";
    }
    }



    // ввод координат
    int input(char& character, char& digit)
    {
    character = _getche(); // ввод "горизонтальной" координаты
    int match = 0;
    for (int i = 0; i < 10; i++)
    if (numbers[i] == character)
    {
    match = 1;
    character = i;
    }
    if (match == 0)
    return 1;
    std::cout << '-';
    match = 0;
    digit = _getche(); // ввод "вертикальной" координаты
    for (int i = 0; i < 10; i++)
    if (numbers[i] == digit)
    {
    match = 1;
    digit = i;
    }
    if (match == 0)
    return 1;
    return 0;  
    }

    // В функции устанавливаются и проверяются флаги defeat_flag игроков.
    int check_ending()
    {
    int flag = 0;
    int human_flag = 0;
    int computer_flag = 0;
    for (int i=0; i<10;i++)
    {
    for (int j=0; j<10;j++)
    {
    if (human.ships[i][j] == 2)
    human_flag = 1; // у пользователя ещё остались неповреждённые корабли
    if (computer.ships[i][j] == 2)
    computer_flag = 1; // у компьютера ещё остались неповреждённые корабли
    }
    }
    if (human_flag == 0)
    flag = 2;
    if (computer_flag == 0)
    flag = 1;
    if (flag == 1)
    {
    std::cout << "Победил игрок!\n";
    return 2;
    }
    if (flag == 2)
    {
    std::cout << "Победил компьютер!\n";
    return 2;
    }
    }

    void player::ships_init()
    {
    // инициализация массивов hits и ships
    for (int i = 0; i < 10; i++)
    {
    for (int j = 0; j< 10; j++)
    {
    ships[i][j] = 1;
    hits[i][j] = 0;
    }
    }

    // Установка кораблей
    set(4);
    set(3);
    set(3);
    set(2);
    set(2);
    set(2);
    set(1);
    set(1);
    set(1);
    set(1);
    }

    void player::set (int deck)
    {
    int my = deck - 1;
    bool isset = 0;
    int s,c;
    direction dir;
    while (isset == 0)
    {
    dir = static_cast<direction>(rand()%2);

    s = rand()%10;
    c = rand()%10;
    int e = 0;
    switch (dir)
    {
    case h:
    if (ships[s][c+deck-1] == 1)
    {
    e = place_ship(s,c,dir,deck);
    if (e == 0)
    {
    for (int i = 0; i < deck; i++)
    {
    ships[s][c+i] = 2;
    }
    isset = 1;
    }
    }
    break;
    case v:
    if (ships[s+deck-1][c] == 1)
    {
    e = place_ship(s,c,dir,deck);
    if (e == 0)
    {
    for (int i = 0; i < deck; i++)
    {
    ships[s+i][c] = 2;
    }
    isset = 1;
    }
    }
    break;
    }
    }
    }


    int player::place_ship(int s, int c, direction dir, int deck)
    {
    int e = 0;
    switch (dir)
    {
    case h:
    if (ships[s-1][c-1] == 2)
    {
    e = 1;
    /*
    #-------
    |X   
    | 2222 
    |    
    */
    }
    if (ships[s-1][c+deck] == 2)
    {
    e = 1;
    /*
    #-------
    |    X
    | 2222 
    |    
    */
    }
    if (ships[s+1][c-1] == 2)
    {
    e = 1;
    /*
    #-------
    |    
    | 2222 
    |X   
    */
    }
    if (ships[s+1][c+deck] == 2)
    {
    e = 1;
    /*
    #-------
    |    
    | 2222 
    |    X
    */
    }

    if (ships[s][c-1] == 2)
    {
    e = 1;
    /*
    #-------
    |    
    |X2222 
    |    
    */
    }
    if (ships[s][c+deck] == 2)
    {
    e = 1;
    /*
    #-------
    |    
    | 2222X
    |    
    */
    }
    for (int i = 0; i < deck; i++)
    {
    if (ships[s-1][c+i] == 2)
    {
    e = 1;
    /*
    #-------
    | XXXX   
    | 2222 
    |    
    */
    }
    if (ships[s+1][c+i] == 2)
    {
    e = 1;
    /*
    #-------
    |    
    | 2222 
    | XXXX   
    */
    }
    }
    break;
    case v:
    if (ships[s-1][c-1] == 2)
    {
    e = 1;
    /*
    #-------
    |X   
    | 2
    | 2  
    | 2  
    | 2
    |    
    */
    }
    if (ships[s-1][c+1] == 2)
    {
    e = 1;
    /*
    #-------
    | X
    | 2
    | 2  
    | 2  
    | 2
    |    
    */
    }
    if (ships[s+deck][c-1] == 2)
    {
    e = 1;
    /*
    #-------
    |    
    | 2
    | 2  
    | 2  
    | 2
    |X   
    */
    }
    if (ships[s+deck][c+1] == 2)
    {
    e = 1;
    /*
    #-------
    |    
    | 2
    | 2  
    | 2  
    | 2
    | X  
    */
    }

    if (ships[s-1][c] == 2)
    {
    e = 1;
    /*
    #-------
    | X  
    | 2
    | 2  
    | 2  
    | 2
    |    
    */
    }
    if (ships[s+deck][c] == 2)
    {
    e = 1;
    /*
    #-------
    |    
    | 2
    | 2  
    | 2  
    | 2
    | X
    */
    }
    for (int i = 0; i < deck; i++)
    {
    if (ships[s+i][c-1] == 2)
    {
    e = 1;
    /*
    #-------
    |    
    |X2
    |X2  
    |X2  
    |X2
    |    
    */
    }
    if (ships[s+i][c+1] == 2)
    {
    e = 1;
    /*
    #-------
    |    
    | 2X   
    | 2X  
    | 2X     
    | 2X   
    |    
    */
    }
    }
    break;
    }
    return e;
    }

    // Ход компьютера: вносим изменения в массивы human.ships и computer.hits
    void player::turn(player& enemy)
    {
    bool flag = 0;
    while (flag == 0)
    {
    int character = rand()%10; // Координаты по которым будет стрелять компьютер
    int digit = rand()%10;   // выбираются случайно
    if (hits[character][digit] != 1) // проверка: выбирал ли уже компьютер эти координаты
    {
    hits[character][digit] = 1;
    flag = 1;
    if (enemy.ships[character][digit] == 2)
    {
    enemy.ships[character][digit] = 3;
    }
    }
    }
    }

    // Ход игрока: вносим изменения в массивы computer.ships и human.hits
    void player::turn(player& enemy, int character, int digit)
    {
    hits[character][digit] = 1;
    if (enemy.ships[character][digit] == 2)
    {
    enemy.ships[character][digit] = 3;
    }
    }
    Очень благодарен буду за помощь...
     
Загрузка...

Поделиться этой страницей