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

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

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 19.04.2022, 11:40   #1
NewYork3
Новичок
Джуниор
 
Регистрация: 19.04.2022
Сообщений: 1
По умолчанию Почему мячик не двигается отталкиваясь об ракетку?

Код:
//Подключаем модули
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>
#include <windows.h>
 
#pragma warning (disable: 4996)
 
//Задаем константы для игрового поля
#define width 65
#define height 25
//Логика шарика
char vec, vec1;
//Создаём структуру ракетки
typedef struct {
    int x, y; //Положение ракетки
    int w;    //Ширина ракетки
} TRacket;
 
//Создаём структуру шарика
typedef struct {
    int x, y;
} TBall;
 
//Создаём массив который будет хранить игровое поле
char mas[height][width + 1];
//Помещение ракетки на экран
TRacket racket;
TBall ball;
 
void initRacket()
{
    racket.w = 7; //Ставим ракетку в центр
    racket.x = (width - racket.w) / 2;
    racket.y = height - 1; //Ставим ракетку в центр
}
 
void PutRacket()
{
    for (int i = racket.x; i < racket.x + racket.w; i++)
        mas[racket.y][i] = '@';
}
 
 
void putBall()
{
    mas[ball.y][ball.x] = '3';
}
 
void moveBall(int x, int y)
{
    ball.x = x;
    ball.y = y;
}
 
void initBall()
{
    ball.x = 2;
    ball.y = 2;
}
 
 
 
//1.Создаём функцию для заполнения игрового поля решетками
void init()   //1.1.Ширина
{
    for (int i = 0; i < width; i++)
        mas[0][i] = '#';
    mas[0][width] = '\0';
    //Оставляем решётки только слева, справа, вверху, внизу на игровом поле
 
    strncpy(mas[1], mas[0], width + 1);
    for (int i = 1; i < width - 1; i++)
        mas[1][i] = ' ';
 
    for (int i = 2; i < height; i++)   //1.2Длинна
        strncpy(mas[i], mas[1], width + 1);
}
 
//Вывод на экран массива (игрового поля)
void show()
{
    for (int i = 0; i < height; i++)
    {
        printf("%s", mas[i]);
        if (i < height - 1)
            printf("\n");
    }
}
 
 
//Чтобы ракетка не выходила за решётки
void moveRacket(int x)
{
    racket.x = x;
    if (racket.x < 1)
        racket.x = 1;
    if (racket.x + racket.w >= width)
        racket.x = width - 1 - racket.w;
}
 
//Убираем мигание
void setcur(int x, int y)
{
    COORD coord;
    coord.X = x;
    coord.Y = y;
    SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
}
 
//Движение шарика
void LogicBall()
{
    if (ball.x - 1 == 0) vec = 'l';
    if (ball.x + 1 == width) vec = 'r';
    //================================
    if (ball.y - 1 == 0) vec1 = 't';
    if (ball.y + 1 == racket.y)
    {
        for (int i = racket.x; i < racket.x + racket.w; i++) 
        {
            if (ball.x == i) vec1 = 'd';
        }
    }
    //================================
    if (vec1 == 't')
    {
        if (vec == 'r')
        {
            ball.x--;
            ball.y++;
        }
        if (vec == 'l')
        {
            ball.x++;
            ball.y++;
        }
    }
    else if (vec1 == 'd')
    {
        if (vec == 'r')
        {
            ball.x--;
            ball.y--;
        }
        if (vec == 'l')
        {
            ball.x++;
            ball.y--;
        }
    }
}
 
int main()
{
    //Вывод счётчика ширины и высоты на экран, а также ракетки
    char c;
    initRacket();
    initBall();
    moveBall(racket.x + racket.w / 2, racket.y - 1);
    do
    {
        setcur(0, 0);
        init();
        PutRacket();
        putBall();
        show();
 
        //Движение ракетки
        if (GetKeyState('A') < 0) moveRacket(racket.x - 1);
        if (GetKeyState('D') < 0) moveRacket(racket.x + 1);
        LogicBall();
        Sleep(10);
    } while (GetKeyState(VK_ESCAPE) >= 0);
    return 0;
}
Почему мячик не двигается отталкиваясь об ракетку? В движении шарика указал его поведение. Не работает, помогите...Спасибо

Последний раз редактировалось BDA; 20.04.2022 в 10:38.
NewYork3 вне форума Ответить с цитированием
Старый 19.04.2022, 12:03   #2
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

скорее всего потому что
1. при столкновении он отскакивает назад(немножко на один такт), НО
сохраняет исходное направление движения.
2. сохраняя направление он вновь соприкасается с ракеткой и ... (см. п.1.)
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Pygame Почему стрела при повторном нажатии не двигается Roma1233 Python 0 07.02.2020 22:06
мячик во сне Amandida C# (си шарп) 8 20.05.2013 23:09
Мини-игра в мячик в Delphi Map4eJIo Помощь студентам 3 25.02.2009 20:44