Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.65/48: Рейтинг темы: голосов - 48, средняя оценка - 4.65
0 / 0 / 0
Регистрация: 25.04.2020
Сообщений: 2
1

графика с++ , змейка

25.04.2020, 18:37. Показов 9806. Ответов 6
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Еще учу с++. Тренируюсь писать игры (это конечно громко сказано, но все же). Начал со змейки.Код уже готов. Игра запускается конечно же на компиляторе. Хочу добавить графики ну и вообще сделать эту игру, собственно похожей на игру.
Прошу помочь, так как я только начинаю в этом (потихоньку) разбираться и еще много чего не знаю.
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
//Код////////////
//Писал код в DEV C++//////
 
#include <graphics.h> //это я уже  пытался добавлять графику, но дальше библиотеки не зашел
#include <ctime> 
#include <iostream>
#include <conio.h> //Позволит отслеживать что нажал пользователь и не будет вызывать ничего лишнего//Это я для себя писал
#include <random>
#include <Windows.h>
 
 
 
 
using namespace std;
 
    bool gameOver;
int const shwid = 40;
int const hei = 20;
int x, y, fruktx, frukty, score;
int tallx[100], tally[100];
int ntall;
enum eDir {STOP = 0, LEFT, RIGHT, UP, DOWN};
eDir dir;
    
 
void Start()
{   
    gameOver = false;
    dir = STOP;
    x = shwid / 2 - 1;
    y = hei / 2 - 1;
    fruktx = rand() % shwid;
    frukty = rand() % hei;
    score = 0;
}
 
void Draww()
{
    system("cls");
    for(int i = 0; i < shwid + 1; i++)
    cout<<"#";
    cout << endl;
    
    for(int i = 0; i < hei; i++)
    {
        for(int j = 0; j < shwid; j++)
        {
            if(j == 0 || j == shwid - 1)
                cout <<"#";
                if(i == y && j == x)
                cout <<"0";
                else if(i == frukty && j == fruktx)
                    cout << "*";
                else
                {
                    bool print = false;
                    for(int k = 0; k < ntall; k++)
                    {
                        if(tallx[k] == j&& tally[k] == i)
                        {
                         print  = true;
                         cout << "#";                       
                        }
                    }
                    
                    if(!print)
                    cout << " ";
                }   
        }
        cout << endl;
    }
    
    for(int i = 0; i < shwid + 1; i++)
    cout<<"#";
    cout << endl;
    cout <<"SCORE: " << score<< endl;
}
void Input()
{
    if(_kbhit())
   {
    switch(_getch ())
    {
        case 'a':
            dir = LEFT;
            break;
            
        case 'd':
            dir = RIGHT;
            break;
            
        case 'w':
            dir = UP;
            break;
            
        case 's':
            dir = DOWN;
            break;
            
            case 'x':
                cout << "GAME OVER !";
                gameOver = true;
                break;
    }
   }
}
int Logic()
{
    int prevx = tallx[0];
    int prevy = tally[0];
    int prev2x, prev2y;
    tallx[0] = x;
    tally[0] = y; 
    for(int i = 1; i < ntall; i++)
    {
        prev2x = tallx[i];
        prev2y = tally[i];
        tallx[i] = prevx;
        tally[i] = prevy;
        prevx = prev2x;
        prevy = prev2y;
 
    }
    switch(dir)
    {   
        case LEFT:
            x--;
            break;
            
        case RIGHT:
            x++;
            break;
            
        case UP:
            y--;
            break;
            
        case DOWN:
            y++;
            break;  
    }
    
    /*if(x > shwid || x < 0 || y > hei || y < 0)
    gameOver = true;*/ //Змейка врезаеться в стенку
    if(x >= shwid - 1)
    {
        x=0;
    }
    else if(x < 0)
    {
        x = shwid - 2;
    }
    
    if(y >= hei)
    {
        y=0;
    }
    else if(y < 0)
    {
        y = hei - 1;
    }
    
    for(int i = 0; i < ntall; i++)
    {
        if(tallx[i] == x&& tally[i] == y)
        gameOver = true;
    }
if(x == fruktx && y == frukty)
{
    score += 1;
    fruktx = rand() % shwid;
    frukty = rand() % hei;
    ntall++;
}
 
}
 
int main() 
{
    srand (time(NULL));
    
    Start();
    while(!gameOver)
    {
        Draww();
        Input();
        Logic();
    }
    return 0;   
}
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
25.04.2020, 18:37
Ответы с готовыми решениями:

Игра "Змейка": чтобы змейка не съедала сама себя
Здравствуйте! Пишу змейку на VB 2010. Не получается составить условие того, что бы змейка не...

Chart - диаграмма: изменить точность делений графика, установить центр графика в (0,0)
Создал диаграмму (все прекрасно считается точки расставляются), но есть проблемыЖ 1. В случае...

Рисование графика: обработка новых входящих данных и движение графика на форме
Подскажите каким способом можно вывести график частью главного окна программы, при чем график...

Автоматическое изменение графика при переносе данных, формулы и графика на другой лист
На первом листе, на основании каких-либо вычислений строим график, а затем полностью копируем...

6
nmcf
25.04.2020, 18:42
  #2

Не по теме:

Цитата Сообщение от ford D Посмотреть сообщение
Тренируюсь писать игры
На допотопных средствах? :)

0
5268 / 2866 / 481
Регистрация: 05.10.2013
Сообщений: 7,623
Записей в блоге: 154
25.04.2020, 18:47 3
Лучший ответ Сообщение было отмечено ford D как решение

Решение

ford D, одна из самых простых библиотек для вывода графики - SFML. Есть специальный раздел под вопросы связанные с SFML: https://www.cyberforum.ru/sfml/

Цитата Сообщение от ford D Посмотреть сообщение
//Код////////////
//Писал код в DEV C++//////
Если у вас есть Visual Studio, то у меня есть короткий пример, в котором уже подключена SFML. Вы можете просто скачать и проект должен запуститься без каких либо дополнительных действий: DrawText_SfmlCpp.zip

графика с++ , змейка


main.cpp

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
#include <iostream>
#include <SFML/Graphics.hpp>
 
int main()
{
    sf::RenderWindow window(sf::VideoMode(280, 280), "SFML works!");
 
    sf::CircleShape circle0(20.f);
    circle0.setFillColor(sf::Color::Red);
    sf::CircleShape circle1(30.f);
    circle1.setFillColor(sf::Color::Green);
    sf::CircleShape circle2(40.f);
    circle2.setFillColor(sf::Color::Blue);
    
    sf::RectangleShape rectangle;
    rectangle.setSize(sf::Vector2f(200, 50));
    rectangle.setFillColor(sf::Color::Yellow);
    rectangle.setOutlineColor(sf::Color::Magenta);
    rectangle.setOutlineThickness(5);
 
    sf::Font font;
    if (!font.loadFromFile("Fonts/arial.ttf"))
    {
        std::cout << "Failed to load the font file.";
        return EXIT_FAILURE;
    }
    sf::Text text;
    text.setFont(font);
    text.setString("Hello, World!");
    text.setCharacterSize(24);
    text.setFillColor(sf::Color::Red);
    text.setStyle(sf::Text::Bold);
 
    circle0.setPosition(100, 100);
    circle0.setPosition(50, 150);
    circle1.setPosition(150, 150);
    rectangle.setPosition(50, 40);
    text.setPosition(80, 50);
 
    // Run the program as long as the window is open
    while (window.isOpen())
    {
        // check all the window's events that were triggered since the last iteration of the loop
        sf::Event event;
        while (window.pollEvent(event))
        {
            // "close requested" event: we close the window
            if (event.type == sf::Event::Closed)
                window.close();
        }
 
        window.clear(sf::Color::White);
        window.draw(circle0);
        window.draw(circle1);
        window.draw(circle2);
        window.draw(rectangle);
        window.draw(text);
        window.display();
    }
 
    return EXIT_SUCCESS;
}
1
0 / 0 / 0
Регистрация: 25.04.2020
Сообщений: 2
26.04.2020, 12:22  [ТС] 4
есть и visual st. на моей основной машине, Dev только на стареньком ноуте
0
5268 / 2866 / 481
Регистрация: 05.10.2013
Сообщений: 7,623
Записей в блоге: 154
26.04.2020, 16:08 5
Есть у меня желание попробовать переписать вашу змейку под веб. Не знаю, получится ли, может попробую. Canvas API очень похож на SFML. Змейку можно квадратами рисовать, а фрукты - разноцветными кружками.

С теми же параметрами, что и в примере выше на SFML получаются, как ни странно, такие же кружки:

Запустить в песочнице по клику

HTML5
1
<canvas id="renderCanvas" width="280" height="280" style="border: solid black 1px"></canvas>
Javascript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
    let canvas = document.getElementById("renderCanvas") as HTMLCanvasElement;
    let ctx = canvas.getContext("2d");
 
    // Red circle
    ctx.fillStyle = "#ff0000";
    ctx.beginPath();
    ctx.arc(50, 150, 20, 0, 2 * Math.PI);
    ctx.fill();
 
    // Green circle
    ctx.fillStyle = "#00ff00";
    ctx.beginPath();
    ctx.arc(150, 150, 30, 0, 2 * Math.PI);
    ctx.fill();
 
    // Blue circle
    ctx.fillStyle = "#0000ff";
    ctx.beginPath();
    ctx.arc(50, 40, 40, 0, 2 * Math.PI);
    ctx.fill();
Название: cicles-canvas2d-ts.png
Просмотров: 139

Размер: 2.8 Кб
1
5268 / 2866 / 481
Регистрация: 05.10.2013
Сообщений: 7,623
Записей в блоге: 154
26.04.2020, 17:16 6
На SFML прямоугольник с границей выводится таким же образом, как и на Canvas API. Этот прямоугольник можно использовать, как кнопку для начала игры, выведя на него текст:

Javascript
1
2
3
4
5
6
7
8
9
10
11
12
13
    // Rectangle with a border
    ctx.fillStyle = "yellow";
    ctx.strokeStyle = "magenta";
    ctx.lineWidth = 5;
    ctx.beginPath();
    ctx.rect(50, 40, 200, 50);
    ctx.fill();
    ctx.stroke();
 
    // Text
    ctx.font = "24px Arial";
    ctx.fillStyle = "red";
    ctx.fillText("Начать игру", 80, 70);
Нужно прописать в коде обработчик клика мыши, чтобы в это обработчике проверять, попадают ли координаты курсора в пределы прямоугольника. Если попадают то, значит, начать игру.

Я повторил свой пример выше на Canvas API и TypeScript: запустить в песочнице по клику

Исходники

HTML5
1
<canvas id="renderCanvas" width="280" height="280" style="border: solid black 1px"></canvas>
Javascript
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
import * as $ from "jquery";
 
$(() =>
{
    let canvas = document.getElementById("renderCanvas") as HTMLCanvasElement;
    let ctx = canvas.getContext("2d");
 
    // Red circle
    ctx.fillStyle = "#ff0000";
    ctx.beginPath();
    ctx.arc(50, 150, 20, 0, 2 * Math.PI);
    ctx.fill();
 
    // Green circle
    ctx.fillStyle = "#00ff00";
    ctx.beginPath();
    ctx.arc(150, 150, 30, 0, 2 * Math.PI);
    ctx.fill();
 
    // Blue circle
    ctx.fillStyle = "#0000ff";
    ctx.beginPath();
    ctx.arc(50, 40, 40, 0, 2 * Math.PI);
    ctx.fill();
 
    // Rectangle with a border
    ctx.fillStyle = "yellow";
    ctx.strokeStyle = "magenta";
    ctx.lineWidth = 5;
    ctx.beginPath();
    ctx.rect(50, 40, 200, 50);
    ctx.fill();
    ctx.stroke();
 
    // Text
    ctx.font = "24px Arial";
    ctx.fillStyle = "red";
    ctx.fillText("Начать игру", 80, 70);
});


Название: draw-text-canvas2d-ts.png
Просмотров: 137

Размер: 4.2 Кб
1
5268 / 2866 / 481
Регистрация: 05.10.2013
Сообщений: 7,623
Записей в блоге: 154
26.04.2020, 17:57 7
Я поиграл в змейку. Определённо, её стоит переписать, заменив символы на картинки. Да, я думаю, лучше выводить изображения вместо цветных квадратов и кругов. В SFML довольно просто можно загрузить фон в виде картинки и картинки фруктов. Картинки можно нарисовать в Paint (GIMP и т.д.) от руки или найти в интернете.

Я собрал 10 фруктов:



Миниатюра
графика с++ , змейка
1
26.04.2020, 17:57
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
26.04.2020, 17:57
Помогаю со студенческими работами здесь

Построение графика производной для каждого графика из 3 режимов
Дорогие друзья, прошу помочь доделать три программы. В каждой программе выводится по одному графику...

Совмещение поточечного графика и графика построенного функцией на отрезке
Есть некий массив array1 = {...} и func = y /. NDslove По отдельности строю так: Plot и...

Змейка
Здравствуйте! Я пишу змейку, и игра уже практически готова за исключением одного момента: вот код,...

Змейка
Товарищи програмисты помогите дописать игрушку, змейку. Она ещё в стадии разробоки:) вот код ...

Змейка
uses GraphABC; const step = 40; FoodD = 5; TimeLimit = 5000; type Point = class ...

Змейка
В общем, сейчас решил научится программированию, скачиваю программы и лажу в коде. Очередную...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru