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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 26.03.2023, 16:21   #1
ChestIotVaga
Пользователь
 
Регистрация: 21.11.2022
Сообщений: 84
Восклицание Ребят срочно помогите решить пару проблем в коде змейки

Ребят срочно помогите решить пару проблем в коде
не могу понять как добавить таблицу очков и как исправить чтоб смейка головой не двигала в своё тело помогите исправить код:
вот код
Код:
#include <SFML/Graphics.hpp>
#include <time.h>

using namespace sf;

int N = 30, M = 20; //N - длина, M - ширина
int ts = 25; //Размер каждого плитки

int dir = 2, num = 4; //переменная dir отвечает за поворот, переменная num отвечает за длину змейки
/*Как поварачивается змейка при помощи переменной dir
dir = 1 -> лево
dir = 2 -> право
dir = 3 -> вверх
dir = 0 -> вниз*/

bool game = true; //переменная game отвечает за режима игры

//Структура змейки отвечает за её длину
struct Snake {
    int x, y;
    //В структуре указаны переменные x, y
    //они отвечают за координаты плитки
} s[600];

//s[] - это каждая плитка змейки

//Структура яблоки
struct Fruct
{
    int x, y;
    //Задаём координаты яблоки
} f;

//Функция Tick отвечает за саму игру
void Tick() {
    //Здесь находятся первичные координаты
    //Просто рисуется сама змейка
    for (int i = num; i > 0; i--) {
        s[i].x = s[i - 1].x;
        s[i].y = s[i - 1].y;
    }

    //движение змейки
    if (dir == 0)
        s[0].y += 1; //вниз
    if (dir == 1)
        s[0].x -= 1; //влево
    if (dir == 2)
        s[0].x += 1; //право
    if (dir == 3)
        s[0].y -= 1; //вверх

    //Здесь отвечает, если змейка уходит через стенку экрана
    //то она возращается на через другую
    if (s[0].x > N)
        s[0].x = 0;
    if (s[0].x < 0)
        s[0].x = N;
    if (s[0].y > M)
        s[0].y = 0;
    if (s[0].y < 0)
        s[0].y = M;

    //Если змейка поедает яблоко
    if ((s[0].x == f.x) && (s[0].y == f.y)) {
        num++; //Змейка растёт

        f.x = rand() % N; //Меняем рандомные координаты яблоки
        f.y = rand() % M;
    }

    //Здесь проигрышь
    for (int i = 1; i < num; i++) //цикл for для всех плиток змейки
        //Если змейка сталкивается со своим телом
        if ((s[0].x == s[i].x) && (s[0].y == s[i].y))
            game = false; //меняем значение переменной game на false
}

int main()
{
    srand(time(0));

    RenderWindow window(VideoMode(ts * N, ts * M), "Snake!");

    //Как ставляется картинка
   /*
   Texture t; <- Задаётся переменная для текстуры
    t.loadFromFile("Расположение картинки"); <- в переменную текстуры
    загружаем картинку
    Sprite tiles(t); <- Задаём следующию переменную спрайта и
    загружаем текстуру
   */

   //Ставим картнинку titels
    Texture t;
    t.loadFromFile("D:/Snake/Paint/tiles.png");
    Sprite tiles(t);

    //Ставим картинку змейки
    Texture sn;
    sn.loadFromFile("D:/Snake/Paint/snake.png");
    Sprite snake(sn);

    //Ставим картинку яблоко
    Texture ap;
    ap.loadFromFile("D:/Snake/Paint/apple.png");
    Sprite apple(ap);

    //Ставим надпись gameover
    Texture go;
    go.loadFromFile("D:/Snake/Paint/gameover.png");
    Sprite gameover(go);
    gameover.setPosition(0, 175);

    f.x = 10;
    f.y = 10;
    //первичные координаты яблоки

    Clock clock; //переменная clock нужна для ирового времени
    float timer = 0, delay = 0.1;
    //timer и delay отвечают за скорость змейки
    //timer отвечает, через какое время змейка двигается
    //delay - за задержку

    while (window.isOpen())
    {
        //Игровое время
        float time = clock.getElapsedTime().asSeconds();
        clock.restart();
        timer += time;

        Event event;
        while (window.pollEvent(event))
        {
            if (event.type == Event::Closed)
                window.close();
        }

        //Управление змейкой через клавиатуру
        if (Keyboard::isKeyPressed(Keyboard::Left)) //Если стрелка влево нажата
            dir = 1;
        if (Keyboard::isKeyPressed(Keyboard::Right)) //Если стрелка вправо нажата
            dir = 2;
        if (Keyboard::isKeyPressed(Keyboard::Up)) //Если стрелка вверх нажата
            dir = 3;
        if (Keyboard::isKeyPressed(Keyboard::Down))  //Если стрелка вниз нажата
            dir = 0;

        //Здесь отвечает за работу игры
        if (timer > delay && game) {
            timer = 0; //Возвращаем время
            Tick(); //Вызываем работу игры
        }

        window.clear();

        //Для прорисовки всего графичесского окна
        //Пишем цикл for
        for (int i = 0; i < N; i++)
            for (int j = 0; j < M; j++) {
                tiles.setPosition(i * ts, j * ts); //Позиция
                window.draw(tiles); //Рисуем
            }

        //Рисуем змейку
        for (int i = 0; i < num; i++) {
            if (i != 0) //Рисуем тело змейки
                snake.setTextureRect(IntRect(0, 0, ts, ts));
            else //Рисуем голову змейки
                snake.setTextureRect(IntRect(dir * ts, ts, ts, ts));

            // Во время проигрыша голова изменяется
            if (!game && i == 1)
                snake.setTextureRect(IntRect(dir * ts, ts * 2, ts, ts));

            snake.setPosition(s[i].x * ts, s[i].y * ts); //Задаём позицию
        //для плиток змейки
            window.draw(snake);
        }

        apple.setPosition(f.x * ts, f.y * ts); //Позиция яблоки
        window.draw(apple); //Рисуем яблоко

        //Если мы проиграли, то будеть выдовать надпись gameover
        if (!game)
            window.draw(gameover);

        window.display();
    }

    return 0;
}
ChestIotVaga вне форума Ответить с цитированием
Старый 26.03.2023, 16:45   #2
ChestIotVaga
Пользователь
 
Регистрация: 21.11.2022
Сообщений: 84
По умолчанию

вот изменённый код я добавил счётчик но он не считает кол-во съеденных яблок
где я ошибся подскажите как исправить
#include <SFML/Graphics.hpp>
#include <time.h>

using namespace sf;

int N = 30, M = 20; //N - длина, M - ширина
int ts = 25; //Размер каждого плитки

int dir = 2, num = 4; //переменная dir отвечает за поворот, переменная num отвечает за длину змейки
/*Как поварачивается змейка при помощи переменной dir
dir = 1 -> лево
dir = 2 -> право
dir = 3 -> вверх
dir = 0 -> вниз*/

bool game = true; //переменная game отвечает за режима игры

//Структура змейки отвечает за её длину
struct Snake {
int x, y;
//В структуре указаны переменные x, y
//они отвечают за координаты плитки
} s[600];

//s[] - это каждая плитка змейки

//Структура яблоки
struct Fruct
{
int x, y;
//Задаём координаты яблоки
} f;

//Функция Tick отвечает за саму игру
void Tick() {
//Здесь находятся первичные координаты
//Просто рисуется сама змейка
for (int i = num; i > 0; i--) {
s[i].x = s[i - 1].x;
s[i].y = s[i - 1].y;
}

if (dir == 0)
s[0].y += 1; //вниз
if (dir == 1)
s[0].x -= 1; //влево
if (dir == 2)
s[0].x += 1; //право
if (dir == 3)
s[0].y -= 1; //вверх

//Здесь отвечает, если змейка уходит через стенку экрана
//то она возращается на через другую
if (s[0].x > N)
s[0].x = 0;
if (s[0].x < 0)
s[0].x = N;
if (s[0].y > M)
s[0].y = 0;
if (s[0].y < 0)
s[0].y = M;




//Если змейка поедает яблоко
static int score = 0; // статическая переменная для сохранения счета между вызовами функции

if ((s[0].x == f.x) && (s[0].y == f.y)) {
num++; //Змейка растёт
score++; // Увеличиваем значение счетчика
f.x = rand() % N; //Меняем рандомные координаты яблоки
f.y = rand() % M;
}
//Здесь проигрышь
for (int i = 1; i < num; i++) //цикл for для всех плиток змейки
//Если змейка сталкивается со своим телом
if ((s[0].x == s[i].x) && (s[0].y == s[i].y))
game = false; //меняем значение переменной game на false
}

int main()
{
srand(time(0));

RenderWindow window(VideoMode(ts * N, ts * M), "Snake!");
static int score = 0;
//Загрузка шрифта для текста
Font font;
font.loadFromFile("D:/Snake/Paint/sans.ttf");

//Текст для вывода счета
Text scoreText;
scoreText.setFont(font);
scoreText.setCharacterSize(30);
scoreText.setFillColor(Color::Red);
scoreText.setString("Score: " + std::to_string(score));
scoreText.setPosition(10, 10);
//Как ставляется картинка
/*
Texture t; <- Задаётся переменная для текстуры
t.loadFromFile("Расположение картинки"); <- в переменную текстуры
загружаем картинку
Sprite tiles(t); <- Задаём следующию переменную спрайта и
загружаем текстуру
*/

//Ставим картнинку titels
Texture t;
t.loadFromFile("D:/Snake/Paint/tiles.png");
Sprite tiles(t);

//Ставим картинку змейки
Texture sn;
sn.loadFromFile("D:/Snake/Paint/snake.png");
Sprite snake(sn);

//Ставим картинку яблоко
Texture ap;
ap.loadFromFile("D:/Snake/Paint/apple.png");
Sprite apple(ap);

//Ставим надпись gameover
Texture go;
go.loadFromFile("D:/Snake/Paint/gameover.png");
Sprite gameover(go);
gameover.setPosition(0, 175);

f.x = 10;
f.y = 10;
//первичные координаты яблоки

Clock clock; //переменная clock нужна для ирового времени
float timer = 0, delay = 0.1;
//timer и delay отвечают за скорость змейки
//timer отвечает, через какое время змейка двигается
//delay - за задержку

while (window.isOpen())
{
//Игровое время
float time = clock.getElapsedTime().asSeconds();
clock.restart();
timer += time;

Event event;
while (window.pollEvent(event))
{
if (event.type == Event::Closed)
window.close();
}

//Управление змейкой через клавиатуру
if (Keyboard::isKeyPressed(Keyboard::L eft)) //Если стрелка влево нажата
dir = 1;
if (Keyboard::isKeyPressed(Keyboard::R ight)) //Если стрелка вправо нажата
dir = 2;
if (Keyboard::isKeyPressed(Keyboard::U p)) //Если стрелка вверх нажата
dir = 3;
if (Keyboard::isKeyPressed(Keyboard::D own)) //Если стрелка вниз нажата
dir = 0;

//Здесь отвечает за работу игры
if (timer > delay && game) {
timer = 0; //Возвращаем время
Tick(); //Вызываем работу игры
}

window.clear();

//Для прорисовки всего графичесского окна
//Пишем цикл for
for (int i = 0; i < N; i++)
for (int j = 0; j < M; j++) {
tiles.setPosition(i * ts, j * ts); //Позиция
window.draw(tiles); //Рисуем
}

//Рисуем змейку
for (int i = 0; i < num; i++) {
if (i != 0) //Рисуем тело змейки
snake.setTextureRect(IntRect(0, 0, ts, ts));
else //Рисуем голову змейки
snake.setTextureRect(IntRect(dir * ts, ts, ts, ts));

// Во время проигрыша голова изменяется
if (!game && i == 1)
snake.setTextureRect(IntRect(dir * ts, ts * 2, ts, ts));

snake.setPosition(s[i].x * ts, s[i].y * ts); //Задаём позицию
//для плиток змейки
window.draw(snake);
}

apple.setPosition(f.x * ts, f.y * ts); //Позиция яблоки
window.draw(apple); //Рисуем яблоко

//Если мы проиграли, то будеть выдовать надпись gameover
if (!game)
window.draw(gameover);
// Обновляем значение счетчика на экране
scoreText.setString("Score: " + std::to_string(score));
window.draw(scoreText);

window.display();
}

return 0;
}
ChestIotVaga вне форума Ответить с цитированием
Старый 26.03.2023, 17:55   #3
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

Цитата:
Сообщение от ChestIotVaga Посмотреть сообщение
static int score = 0;
Код:
int score = 0, dir = 2, num = 4; //переменная dir отвечает за поворот, переменная num отвечает за длину змейки
/*Как поварачивается змейка при помощи переменной dir
dir = 1 -> лево
dir = 2 -> право
dir = 3 -> вверх
dir = 0 -> вниз*/
Достаточно добавить проверку на установку управления
Код:
//Управление змейкой через клавиатуру
if (Keyboard::isKeyPressed(Keyboard::Left)) //Если стрелка влево нажата
  if (dir != 1) dir = 0;
if (Keyboard::isKeyPressed(Keyboard::Right)) //Если стрелка вправо нажата
  if (dir != 0) dir = 1;
if (Keyboard::isKeyPressed(Keyboard::Up)) //Если стрелка вверх нажата
  if (dir != 3) dir = 2;
if (Keyboard::isKeyPressed(Keyboard::Down)) //Если стрелка вниз нажата
  if (dir != 2) dir = 3;
Код:
if (dir == 3)
  s[0].y += 1; //вниз
if (dir == 0)
  s[0].x -= 1; //влево
if (dir == 2)
  s[0].x += 1; //право
if (dir == 1)
  s[0].y -= 1; //вверх
macomics вне форума Ответить с цитированием
Старый 26.03.2023, 18:09   #4
ChestIotVaga
Пользователь
 
Регистрация: 21.11.2022
Сообщений: 84
По умолчанию

я имею ввиду про счётчик как в игре типа сколько сьел и тд
но он не работает стоит на нуле
ChestIotVaga вне форума Ответить с цитированием
Старый 26.03.2023, 20:21   #5
ChestIotVaga
Пользователь
 
Регистрация: 21.11.2022
Сообщений: 84
По умолчанию

ещё подправил код счётчик не работает не считает кол - во сьеденных яблок хвост растёт а вот в счётчике score 0

Код:
#include <SFML/Graphics.hpp>
#include <time.h>

using namespace sf;
sf::Text scoreText;
int N = 30, M = 20; //N - длина, M - ширина
int ts = 25; //Размер каждого плитки

int dir = 2, num = 4; //переменная dir отвечает за поворот, переменная num отвечает за длину змейки
/*Как поварачивается змейка при помощи переменной dir
dir = 1 -> лево
dir = 2 -> право
dir = 3 -> вверх
dir = 0 -> вниз*/

bool game = true; //переменная game отвечает за режима игры

//Структура змейки отвечает за её длину
struct Snake {
    int x, y;
    //В структуре указаны переменные x, y
    //они отвечают за координаты плитки
} s[600];

//s[] - это каждая плитка змейки

//Структура яблоки
struct Fruct
{
    int x, y;
    //Задаём координаты яблоки
} f;


int score = 0;
void Tick() {
    //Здесь находятся первичные координаты
    //Просто рисуется сама змейка
    for (int i = num; i > 0; i--) {
        s[i].x = s[i - 1].x;
        s[i].y = s[i - 1].y;
    }
        if (dir == 0)
            s[0].y += 1; //вниз
    if (dir == 1)
        s[0].x -= 1; //влево
    if (dir == 2)
        s[0].x += 1; //право
    if (dir == 3)
        s[0].y -= 1; //вверх

    //Здесь отвечает, если змейка уходит через стенку экрана
    //то она возращается на через другую
    if (s[0].x > N)
        s[0].x = 0;
    if (s[0].x < 0)
        s[0].x = N;
    if (s[0].y > M)
        s[0].y = 0;
    if (s[0].y < 0)
        s[0].y = M;

    //Если змейка поедает яблоко
    if ((s[0].x == f.x) && (s[0].y == f.y)) {
        num++; //Змейка растёт
        score++; // Увеличиваем значение счетчика

        f.x = rand() % N; //Меняем рандомные координаты яблоки
        f.y = rand() % M;
        scoreText.setString("Score: " + std::to_string(score));
    }
    //Здесь проигрышь
    for (int i = 1; i < num; i++) //цикл for для всех плиток змейки
        //Если змейка сталкивается со своим телом
        if ((s[0].x == s[i].x) && (s[0].y == s[i].y))
            game = false; //меняем значение переменной game на false

}
int main()
{
    srand(time(0));

    RenderWindow window(VideoMode(ts * N, ts * M), "Snake!");
    //Загрузка шрифта для текста
    Font font;
    font.loadFromFile("D:/Snake/Paint/sans.ttf");

    //Текст для вывода счета
    Text scoreText;
    scoreText.setFont(font);
    scoreText.setCharacterSize(30);
    scoreText.setFillColor(Color::Red);
    scoreText.setString("Score: " + std::to_string(score));
    scoreText.setPosition(10, 10);
    //Как ставляется картинка
   /*
   Texture t; <- Задаётся переменная для текстуры
    t.loadFromFile("Расположение картинки"); <- в переменную текстуры
    загружаем картинку
    Sprite tiles(t); <- Задаём следующию переменную спрайта и
    загружаем текстуру
   */

   //Ставим картнинку titels
    Texture t;
    t.loadFromFile("D:/Snake/Paint/tiles.png");
    Sprite tiles(t);

    //Ставим картинку змейки
    Texture sn;
    sn.loadFromFile("D:/Snake/Paint/snake.png");
    Sprite snake(sn);

    //Ставим картинку яблоко
    Texture ap;
    ap.loadFromFile("D:/Snake/Paint/apple.png");
    Sprite apple(ap);

    //Ставим надпись gameover
    Texture go;
    go.loadFromFile("D:/Snake/Paint/gameover.png");
    Sprite gameover(go);
    gameover.setPosition(0, 175);

    f.x = 10;
    f.y = 10;
    //первичные координаты яблоки

    Clock clock; //переменная clock нужна для ирового времени
    float timer = 0, delay = 0.1;
    //timer и delay отвечают за скорость змейки
    //timer отвечает, через какое время змейка двигается
    //delay - за задержку

    while (window.isOpen())
    {
        //Игровое время
        float time = clock.getElapsedTime().asSeconds();
        clock.restart();
        timer += time;

        Event event;
        while (window.pollEvent(event))
        {
            if (event.type == Event::Closed)
                window.close();
        }

        //Управление змейкой через клавиатуру
        if (Keyboard::isKeyPressed(Keyboard::Left)) //Если стрелка влево нажата
            dir = 1;
        if (Keyboard::isKeyPressed(Keyboard::Right)) //Если стрелка вправо нажата
            dir = 2;
        if (Keyboard::isKeyPressed(Keyboard::Up)) //Если стрелка вверх нажата
            dir = 3;
        if (Keyboard::isKeyPressed(Keyboard::Down))  //Если стрелка вниз нажата
            dir = 0;

        //Здесь отвечает за работу игры
        if (timer > delay && game) {
            timer = 0; //Возвращаем время
            Tick(); //Вызываем работу игры
        }

        window.clear();

        //Для прорисовки всего графичесского окна
        //Пишем цикл for
        for (int i = 0; i < N; i++)
            for (int j = 0; j < M; j++) {
                tiles.setPosition(i * ts, j * ts); //Позиция
                window.draw(tiles); //Рисуем
            }

        //Рисуем змейку
        for (int i = 0; i < num; i++) {
            if (i != 0) //Рисуем тело змейки
                snake.setTextureRect(IntRect(0, 0, ts, ts));
            else //Рисуем голову змейки
                snake.setTextureRect(IntRect(dir * ts, ts, ts, ts));

            // Во время проигрыша голова изменяется
            if (!game && i == 1)
                snake.setTextureRect(IntRect(dir * ts, ts * 2, ts, ts));

            snake.setPosition(s[i].x * ts, s[i].y * ts); //Задаём позицию
        //для плиток змейки
            window.draw(snake);
        }

        apple.setPosition(f.x * ts, f.y * ts); //Позиция яблоки
        window.draw(apple); //Рисуем яблоко

        //Если мы проиграли, то будеть выдовать надпись gameover
        if (!game)
            window.draw(gameover);
        // Обновляем значение счетчика на экране
   
        window.draw(scoreText);

        window.display();
    }

    return 0;
}
ChestIotVaga вне форума Ответить с цитированием
Старый 26.03.2023, 21:27   #6
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

Код:
scoreText.setString("Score: " + std::to_string(num - 4)); // Обновлять значение надо при каждой перерисовке.
window.draw(scoreText);
Цитата:
int score = 0;
Цитата:
score++; // Увеличиваем значение счетчика
macomics вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ребят помогите срочно Kuzhimov Помощь студентам 1 21.02.2019 09:29
Ребят,нужно срочно решить задачки кому не сложно иванкпгкпр Помощь студентам 1 23.10.2016 15:52
Ребят! Нужно срочно решить задачу с массивами!!! carev96 Помощь студентам 0 12.12.2014 21:25
Парни помогите!!срочно нужно решить в течении пару часов..завтра зачет!Парни помогите! razorl1ner Паскаль, Turbo Pascal, PascalABC.NET 0 01.06.2009 00:02
Помогите решить пару задач! СРОЧНО!!! andrew_brest Помощь студентам 3 13.04.2009 22:16