Форум программистов, компьютерный форум CyberForum.ru

Морской бой - C++

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 24, средняя оценка - 4.79
Бартимеус
 Аватар для Бартимеус
181 / 33 / 2
Регистрация: 29.10.2008
Сообщений: 283
05.05.2009, 14:24     Морской бой #1
Написал морской бой. Просьба прокоменнтировать, улучшить где возможно и помочь написать ИИ.

Вот исходники:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
#include <iostream>
#include <iomanip>
#include <cstdlib>
 
using namespace std;
 
class Player
{
    public:
        Player();
        ~Player();
        void PrintFields();//напечатать поля
        bool ShipFieldTest(const int&, const int&, const int&, const int&);//проверить возможна ли установка корабля
        void setFlotShip(int);//установить корабль (int-количество палуб)
        void setFirstFieldElement(const int& x, const int& y, char znak){FirstField[y][x]=znak;}//установить елемент первого поля
        char getFirstFieldElement(const int& x, const int& y){return FirstField[y][x];};//получить элемент первого поля
        void setSecondFieldElement(const int& x, const int& y, char znak){SecondField[y][x]=znak;}//установить елемент второго поля
        char getSecondFieldElement(const int& x, const int& y){return SecondField[y][x];}//получить элемент второго поля
        void getAtackCoordinates(int& x, int& y);//получить координаты атаки
        bool ShipTest(const int&, const int&);//проверить уничтожен ли корабль
        void getDeletedShipCoordinates(const int&, const int&, int&, int&, int&, int&);//получить координаты уничтоженного корабля
        void DeleteOpponentShip(const int&, const int&, const int&, const int&);//обозначить уничтоженный корабль на втором поле
        void DeletePlayerShip(const int&, const int&, const int&, const int&);//обозначить свой уничтоженный корабль
        void DeleteFlotLife(){FlotLife--;}
        bool FlotLifeTest(){return FlotLife>0 ? false : true;}//не уничтожена ли экскадра
    protected:
        char FirstField[12][12];
        char SecondField[12][12];
        int FlotLife;//общее количество палуб в экскадре
};
 
 
Player::Player():
    FlotLife(20)
{
    for(int i=0; i<12; i++)
        for(int j=0; j<12; j++)
            FirstField[i][j]=' ';
            
    for(int i=0; i<12; i++)
        for(int j=0; j<12; j++)
            SecondField[i][j]=' ';
}
 
Player::~Player()
{
    //пустое тело
}
 
void Player::PrintFields()
{
    system("cls");//очистить экран
 
    cout<<"  ";
    
    for (int i=1; i<=10; i++)//напечататать верхнюю линейку координат для FirstField
        cout<<i<<" ";
    
    cout<<"  ";
 
    for(int i=1; i<=10; i++)//напечатать верхнюю линейку координат для SecondField
        cout<<i<<" ";           
    
    cout<<endl;
    
    for(int i=1; i<=10; i++)//напечатать боковые линейки координат и сами поля
    {
        cout<<setw(2)<<i;
        
        for(int j=1; j<=10; j++)
            cout<<FirstField[i][j]<<" ";
        
        cout<<" "<<setw(2)<<i;
        
        for(int k=1; k<=10; k++)
            cout<<SecondField[i][k]<<" ";
        
        cout<<setw(2)<<i<<endl;
    }
    
    cout<<endl;
}
 
bool Player::ShipFieldTest(const int& x1, const int& y1, const int& x2, const int& y2)
{
    for(int i=y1-1; i<=y2+1; i++)
        for(int j=x1-1; j<=x2+1; j++)
            if(FirstField[i][j]!=' ')
                return true;
    return false;
}
 
void Player::setFlotShip(int size)
{
    int x1, y1, x2, y2;
    
    while(1)
    {
        cout<<"Vvedite coordinatu: ";
        cin>>x1>>y1>>x2>>y2;
    
        if((x1!=x2 && y1!=y2) || (x1<1) || (x2>10) || (y1<1) || (y2>10) || (ShipFieldTest(x1,y1,x2,y2)))
            {cout<<"Neverny vvod, ystanovka korablya nevozmojna"<<endl; continue;}
        else
            if(x2-x1!=size-1 && y2-y1!=size-1)
                {cout<<"Nevernoe colichestvo palyb"<<endl; continue;}
            else
                for(int i=y1; i<=y2; i++)
                    for(int j=x1; j<=x2; j++)
                        FirstField[i][j]='*';
        break;
    }
}
 
void Player::DeleteOpponentShip(const int& x1, const int& y1, const int& x2, const int& y2)
{
    if(x1==x2)//если корабль расположен по вертикали
    {
        for(int i=y1-1; i<=y2+1; i++)
            for(int j=x1-1; j<=x2+1; j+=2)
                SecondField[i][j]='o';
        SecondField[y1-1][x1]='o';
        SecondField[y2+1][x1]='o';
    }
    
    else
    {
        for(int i=y1-1; i<=y2+1; i+=2)
            for(int j=x1-1; j<=x2+1; j++)
                SecondField[i][j]='o';
        SecondField[y1][x1-1]='o';
        SecondField[y1][x2+1]='o';
    }
}
 
void Player::DeletePlayerShip(const int& x1, const int& y1, const int& x2, const int& y2)
{
    if(x1==x2)//если корабль расположен по вертикали
    {
        for(int i=y1-1; i<=y2+1; i++)
            for(int j=x1-1; j<=x2+1; j+=2)
                FirstField[i][j]='o';
        FirstField[y1-1][x1]='o';
        FirstField[y2+1][x1]='o';
    }
    
    else
    {
        for(int i=y1-1; i<=y2+1; i+=2)
            for(int j=x1-1; j<=x2+1; j++)
                FirstField[i][j]='o';
        FirstField[y1][x1-1]='o';
        FirstField[y1][x2+1]='o';
    }
}
 
bool Player::ShipTest(const int& x, const int& y)
{
    for(int i=y; FirstField[i][x]!=' ' && FirstField[i][x]!='o'; i++)//проитись циклами в разные стороны пока поле!=координате
        if(FirstField[i][x]=='*')//палубы корабля и веруть false если осталась целая палуба
            return false;
            
    for(int i=y; FirstField[i][x]!=' ' && FirstField[i][x]!='o'; i--)
        if(FirstField[i][x]=='*')
            return false;
            
    for(int j=x; FirstField[y][j]!=' ' && FirstField[y][j]!='o'; j++)
        if(FirstField[y][j]=='*')
            return false;
            
    for(int j=x; FirstField[y][j]!=' ' && FirstField[y][j]!='o'; j--)
        if(FirstField[y][j]=='*')
            return false;
    
    return true;
}
 
void Player::getDeletedShipCoordinates(const int& x, const int& y, int& x1, int& y1, int& x2, int& y2)
{
    if(FirstField[y+1][x]=='*' || FirstField[y+1][x]=='x' || FirstField[y-1][x]=='*' || FirstField[y-1][x]=='x')//если корабль расположен по вертикали
    {
        x1=x2=x;//присвоить х1 и х2 значение полученого 'х'
        for(int i=y; FirstField[i][x]!=' ' && FirstField[i][x]!='o'; y1=i, i--);//получить координаты у1 и у2
        for(int i=y; FirstField[i][x]!=' ' && FirstField[i][x]!='o'; y2=i, i++);
    }
    
    else//если корабль расположен по горизонтали
    {
        y1=y2=y;//присвоить у1 и у2 значение полученного 'у'
        for(int j=x; FirstField[y][j]!=' ' && FirstField[y][j]!='o'; x1=j, j--);//получить координаты х1 и х2
        for(int j=x; FirstField[y][j]!=' ' && FirstField[y][j]!='o'; x2=j, j++);
    }
}
 
void Player::getAtackCoordinates(int& x, int& y)
{
    while(1)
    {
        cout<<"Vvedite coordinatu ataki: ";
        cin>>x>>y;
        if(x<1 || x>10 || y<1 || y>10)
        {
            cout<<"Nevernui vood";
            continue;
        }
        else
            break;
    }
}

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
#include "Player.h"
#include <ctime>
#include <cstdlib>
 
using namespace std;
 
class Computer : public Player
{
    public:
        void setFlotShip(int);//установить корабль в случайном порядке
        void getAtackCoordinates(int& x, int& y){x=1+rand() % 10; y=1+rand() % 10;};//получить координаты для атаки
};
 
void Computer::setFlotShip(int size)
{
    int x1,y1,x2,y2;
    srand(time(0));
    enum {VERTICAL=1};
    int POSITION;
    
    
    while(1)
    {
        POSITION=1+rand() % 2;//определить позицию корабля
        
        if(POSITION==VERTICAL)//если корабль расположен вертикально
        {
            x1=x2=1+rand() % 10;//то тогда х1=х2
            y1=1+rand() % 10;
            if(y1+size-1>10)//если вторая координата будет выходить за пределы массива
                continue;//начать цикл сначала
            else//иначе второй координате присвоить значение первой+количество палуб 
                y2=y1+size-1;
        }
        
        else//если корабль расположен горизонтально
            {
                y1=y2=1+rand() % 10;
                x1=1+rand() % 10;
                if(x1+size-1>10)
                    continue;
                else
                    x2=x1+size-1;
            }
            
        if(ShipFieldTest(x1,y1,x2,y2))//если рядом есть корабль
            continue;//начать цикл сначала
        
        else//иначе обозначить корабль на поле
        {
            for(int i=y1; i<=y2; i++)
                for(int j=x1; j<=x2; j++)
                    FirstField[i][j]='*';
            break;
        }
    }
}

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
#include "Computer.h"
#include <conio.h>
#include <iostream>
 
using namespace std;
 
class TheGame
{
    public:
        TheGame();
        ~TheGame();
        void setShips();//установть корабли
        void RunGame();//процесс игры
    private:
        Player player;
        Computer computer;
        int x,y,x1,y1,x2,y2;//данные для атаки(x,y) и установки/уничтожения кораблей(х1,у1,х2,у2)
        bool PlayerWin;
        bool ComputerWin;
};
 
TheGame::TheGame()
{
    PlayerWin=false;
    ComputerWin=false;
}
 
 
TheGame::~TheGame()
{
 
}
 
void TheGame::setShips()//установить корабли (как свои так и компа)
{
    player.PrintFields();
    player.setFlotShip(4);
    computer.setFlotShip(4);
 
    for(int i=0; i<2; i++)
    {
        player.PrintFields();
        player.setFlotShip(3);
        computer.setFlotShip(3);
    }
 
    for(int i=0; i<3; i++)
    {
        player.PrintFields();
        player.setFlotShip(2);
        computer.setFlotShip(2);
    }
 
    for(int i=0; i<4; i++)
    {
        player.PrintFields();
        player.setFlotShip(1);
        computer.setFlotShip(1);
    }
}
 
void TheGame::RunGame()
{
    while(1)//внешний цикл объеденяет в себе два подцикла (для игрока и компа)
    {
        while(1)//ход игрока
        {
            player.PrintFields();//напечатать поля
            player.getAtackCoordinates(x,y);//получить координаты для атаки
 
            if(player.getSecondFieldElement(x,y)=='x' || player.getSecondFieldElement(x,y)=='o')
            {//действия если по полю стрелять бессмысленно
                cout<<"V eto pole strelyat bessmyslenno";
                _getch();
                continue;
            }
 
            else
            {
                if(computer.getFirstFieldElement(x,y)==' ')
                {//если промазал
                    player.setSecondFieldElement(x,y,'o');
                    player.PrintFields();
                    _getch();
                    break;
                }
 
                else//если попал
                {
                    player.setSecondFieldElement(x,y,'x');//отметить попадание на втором поле
                    computer.setFirstFieldElement(x,y,'x');//отметить попадание на первом поле у компа
 
                    if(computer.ShipTest(x,y))//если корабль уничтожен
                    {
                        computer.getDeletedShipCoordinates(x,y,x1,y1,x2,y2);//получить координаты
                        player.DeleteOpponentShip(x1,y1,x2,y2);//отметить уничтоженный корабль на втором поле
                    }
 
                    computer.DeleteFlotLife();//уменьшить жизнь экскадры на одну палубу
 
                    if(computer.FlotLifeTest())//если экскадра разгромлена
                    {
                        PlayerWin=true;
                        player.PrintFields();
                        _getch();
                        break;
                    }
                    continue;
                }
            }
        }
 
        if(PlayerWin==true)
        {
            player.PrintFields();
            cout<<"Igrok pobedil!"<<endl;
            _getch();
            break;
        }
 
        while(1)//ходит комп-действия аналогичны
        {
            computer.getAtackCoordinates(x,y);
 
            if(computer.getSecondFieldElement(x,y)=='x' || computer.getSecondFieldElement(x,y)=='o')
                continue;
 
            else
            {
                if(player.getFirstFieldElement(x,y)==' ')
                {
                    computer.setSecondFieldElement(x,y,'o');
                    player.setFirstFieldElement(x,y,'o');
                    break;
                }
 
                else
                {
                    player.setFirstFieldElement(x,y,'x');
                    computer.setSecondFieldElement(x,y,'x');
                    player.PrintFields();
                    _getch();
 
                    if(player.ShipTest(x,y))
                    {
                        player.getDeletedShipCoordinates(x,y,x1,y1,x2,y2);
                        player.DeletePlayerShip(x1,y1,x2,y2);
                        player.PrintFields();
                        _getch();
                        computer.DeleteOpponentShip(x1,y1,x2,y2);
                    }
 
                    player.DeleteFlotLife();
 
                    if(player.FlotLifeTest())
                    {
                        ComputerWin=true;
                        player.PrintFields();
                        _getch();
                        break;
                    }
                    continue;
                }
            }
        }
 
        if(ComputerWin==true)
        {
            player.PrintFields();
            cout<<"Computer vuigral!"<<endl;
            _getch();
            break;
        }
    }
}
Добавлено через 2 минуты 48 секунд
C++
1
2
3
4
5
6
7
8
9
#include "TheGame.h"
 
int main()
{
    TheGame one;
    one.setShips();
    one.RunGame();
    return 0;
}
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.05.2009, 14:24     Морской бой
Посмотрите здесь:

C++ морской бой
Морской Бой C++
Морской бой C++
C++ Морской бой в С
C++ Морской Бой
C++ Морской бой
C++ Морской бой=)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Бартимеус
 Аватар для Бартимеус
181 / 33 / 2
Регистрация: 29.10.2008
Сообщений: 283
05.05.2009, 14:27  [ТС]     Морской бой #2
Сообщение было отмечено автором темы, экспертом или модератором как ответ
вот в архиве
Вложения
Тип файла: rar Морской бой.rar (4.4 Кб, 292 просмотров)
Return
 Аватар для Return
2 / 2 / 0
Регистрация: 12.04.2009
Сообщений: 11
05.05.2009, 22:24     Морской бой #3
Бартимеус, Впечатляет!
Только почему текст не на русском?!

Добавлено через 22 минуты 55 секунд
continue не просто начинает цикл снова, а прерывает указанную итерацию и переводит цикл к следующей итерации!!!
Бартимеус
 Аватар для Бартимеус
181 / 33 / 2
Регистрация: 29.10.2008
Сообщений: 283
06.05.2009, 05:57  [ТС]     Морской бой #4
Цитата Сообщение от Return Посмотреть сообщение
continue не просто начинает цикл снова, а прерывает указанную итерацию и переводит цикл к следующей итерации!!!
немного не понял
Return
 Аватар для Return
2 / 2 / 0
Регистрация: 12.04.2009
Сообщений: 11
06.05.2009, 13:49     Морской бой #5
Просто переход, без выполнения действия. То есть, если условие истинно, то оператор continue переводит к следующей итерации без выполнения ниже обозначенных действий в данном цикле!
Кто из нас Морской бой написал?! Это я тебя должен спрашивать!
Я вообще только начинаю что-то понимать.
Бартимеус
 Аватар для Бартимеус
181 / 33 / 2
Регистрация: 29.10.2008
Сообщений: 283
06.05.2009, 14:27  [ТС]     Морской бой #6
Ааа) ну так там все continue на месте - conyinue которые стоят не в конце цикла и должны прерывать его без выполнения последующих действий
Fanktast
Сообщений: n/a
28.02.2010, 17:14     Морской бой #7
что то не работает эта игра
НастЁнкО
Сообщений: n/a
14.04.2010, 19:29     Морской бой #8
Помогите, пожалуйста, написать эту же программу, но на языке Си. ))
lexeres
0 / 0 / 0
Регистрация: 20.12.2009
Сообщений: 36
15.04.2010, 18:28     Морской бой #9
блин, пытаюсь запустить в BC - error - unable to open input file .... /main.cpp

как исправить?? я так понимаю директорию менять нужно подругому, но никак подобрать не могу - у меня Борлэнд находится на C:\bc\
как настроить две последние директории (в настройках) ??
Vorona
Peace 2 all shining faces
 Аватар для Vorona
661 / 523 / 44
Регистрация: 05.03.2010
Сообщений: 1,270
15.04.2010, 20:01     Морской бой #10
Бартимеус, могу посоветовать для большей понятности писать какие именно корабли требуется разместить, ато я немного запутался вначале и можно сделать поле: сверху с буквами, сбоку с цифрами, так легче ориентироваться будет
и еще, вам стоит доработать размещение кораблей по заданным координатам, т.е., когда ввожу координаты корабля ((1, 10)(1, 8)) пишет ошибку, а когда ввожу((1, 8)(1, 10)), то нормально, я предполагаю, что длину корабля нужно вычислять с помощью модуля, тогда не будет противоречия в результате -2 и 2 (примерно)

Насчет ИИ, думаю, будет логично, если враг попадает в корабль игрока, то он теперь должен стрелять рядом в горизонтальном либо вертикальном направлениях
для этого будет лучше написать отдельную ф-цию, где враг начинает обстрел вокруг пораженной части корабля (на пример стреляет в точку выше пораженной области, если мимо, то по часовой стрелке к примеру или рандомно стреляет в другую часть около пораженной цели(справа и т.д.) если с какой-то стороны ему удалось снова поразить цель, то он движется в этом направлении пока не затопит корабль)
так же можно придумать тактики хода, к примеру враг буде атаковать главные и побочные диагонали поля через 1, а потом крест-на крест...в интернете впринципе должно быть много разных тактик, если этот проект стоит этих стараний
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.04.2010, 20:02     Морской бой
Еще ссылки по теме:

C++ Морской бой
C++ Морской бой
C++ Морской бой C++
C++ Морской бой С++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
GAME
 Аватар для GAME
23 / 23 / 3
Регистрация: 31.10.2009
Сообщений: 199
15.04.2010, 20:02     Морской бой #11
Бартимеус, интересная тема)тоже хотел что-то подобное сделать
Yandex
Объявления
15.04.2010, 20:02     Морской бой
Ответ Создать тему
Опции темы

Текущее время: 02:48. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru