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

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

Восстановить пароль Регистрация
Другие темы раздела
C++ Экономическая задачка http://www.cyberforum.ru/cpp-beginners/thread32801.html
Вот текст задачи: Какова эффективная ставка i, если номинальная ставка равна j % при помесячном начислении? ( , где m – количество наращений в год; ставка записывается как десятичная дробь). А вот решение, но в чем то косяк, помогите, пожалуйста исправить ошибку или заново решить. #include <math.h> #include <iostream.h> const m=4; void main()
C++ Функция получает стекк и создает из него список Народ помогите пожалуйста я пропустил тему и не могу прогу сделать даже не представляю как мне завтро хоть умри сдать если вам не сложно решите задачку сам не понемаю как хелп!!!!!!!! Собственно вот задача :Функция получает стек и создает из него список. http://www.cyberforum.ru/cpp-beginners/thread32799.html
C++ Проверьте, в чем ошибка?
Задача, в том что надо открыть 2 файла, скопировать из одного во второй строки, при этом цифры поменять на пробелы, а пробелы на звездочки. #include <fstream.h> #include <string.h> #include <iostream.h> #include <ctype.h> #define BUF_SIZE 512
Квадратная матрица C++
Сегодня зачет, а я не могу написать следующую программу: Дана целочисленная квадратная матрица. Определить произведение элементов в тех строках, которые не содержат отрицательных элементов
C++ Структура и класс string. Проблема с выводом строки. http://www.cyberforum.ru/cpp-beginners/thread32769.html
Такая проблема: объявляю структуру с классом string: struct exam { std::string name; ... }; Затем объявляю переменную и присваю значения :
C++ вывод на экран информации мне нужно сдать программу помогите плз 1) занести данные в файл 2) вывод на экран информации 3)удалять не нужные записи 4)сортировка 5)добавление в записи что должно входить: -название фирмы -объем продаж подробнее

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

Вот исходники:
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;
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
Текущее время: 17:51. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru