Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/4: Рейтинг темы: голосов - 4, средняя оценка - 4.50
0 / 0 / 0
Регистрация: 24.12.2022
Сообщений: 12

Исправить консольную змейку

28.12.2022, 00:09. Показов 822. Ответов 3

Студворк — интернет-сервис помощи студентам
Консольная змейка выдает ошибки( Помогите

КОД:

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
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <time.h>
 
#define WIDTH 16
#define HEIGHT 16
 
#define SNAKE_SYMBOL '*'
#define FOOD_SYMBOL '$'
#define WALL_SYMBOL '#'
#define EMPTY_SYMBOL ' '
 
#define LEFT 75
#define RIGHT 77
#define UP 72
#define DOWN 80
 
typedef struct SnakeCell {
    int x;
    int y;
    struct SnakeCell* next;
} SnakeCell;
 
int main() {
    int field[WIDTH][HEIGHT];
    SnakeCell* snake = NULL;
    SnakeCell* food = NULL;
 
    int direction = RIGHT;
    int snakeLength = 1;
    int gameOver = 0;
 
    // Инициализация поля
    for (int i = 0; i < WIDTH; i++) {
        for (int j = 0; j < HEIGHT; j++) {
            if (i == 0 || i == WIDTH - 1 || j == 0 || j == HEIGHT - 1) {
                field[i][j] = WALL_SYMBOL;
            } else {
                field[i][j] = EMPTY_SYMBOL;
            }
        }
    }
 
    // Инициализация змейки
    snake = malloc(sizeof(SnakeCell));
    snake->x = WIDTH / 2;
    snake->y = HEIGHT / 2;
    snake->next = NULL;
 
    // Инициализация еды
    food = malloc(sizeof(SnakeCell));
    food->x = rand() % (WIDTH - 2) + 1;
    food->y = rand() % (HEIGHT - 2) + 1;
    food->next = NULL;
 
    while (!gameOver) {
        // Очистка экрана
        system("cls");
 
        // Отрисовка поля
        for (int i = 0; i < WIDTH;)
         // Обновление направления
        if (_kbhit()) {
            int newDirection = _getch();
            if (newDirection == LEFT && direction != RIGHT) {
                direction = LEFT;
            } else if (newDirection == RIGHT && direction != LEFT) {
                direction = RIGHT;
            } else if (newDirection == UP && direction != DOWN) {
                direction = UP;
            } else if (newDirection == DOWN && direction != UP) {
                direction = DOWN;
            }
        }
 
        // Обновление змейки
        SnakeCell* current = snake;
        while (current->next != NULL) {
            current->x = current->next->x;
            current->y = current->next->y;
            current = current->next;
        }
        if (direction == LEFT) {
            current->x--;
        } else if (direction == RIGHT) {
            current->x++;
        } else if (direction == UP) {
            current->y--;
        } else if (direction == DOWN) {
            current->y++;
        }
 
        // Проверка столкновений
        if (current->x == 0 || current->x == WIDTH - 1 || current->y == 0 || current->y == HEIGHT - 1) {
            // Столкновение со стеной
            gameOver = 1;
        } else if (field[current->x][current->y] == SNAKE_SYMBOL) {
            // Столкновение со своим телом
            gameOver = 1;
        } else if (current->x == food->x && current->y == food->y) {
            // Съедение еды
            field[current->x][current->y] = SNAKE_SYMBOL;
            SnakeCell* newCell = malloc(sizeof(SnakeCell));
            newCell->x = current->x;
            newCell->y = current->y;
            newCell->next = snake;
            snake = newCell;
            snakeLength++;
            free(food);
            food = malloc(sizeof(SnakeCell));
            food->x = rand() % (WIDTH - 2) + 1;
            food->y = rand() % (HEIGHT - 2) + 1;
            food->next = NULL;
        } else {
            // Простое движение
            field[current->x][current->y] = S
             field[current->next->x][current->next->y] = EMPTY_SYMBOL;
        }
 
        // Отрисовка еды
        field[food->x][food->y] = FOOD_SYMBOL;
 
        // Вывод поля на экран
        for (int i = 0; i < WIDTH; i++) {
            for (int j = 0; j < HEIGHT; j++) {
                printf("%c", field[i][j]);
            }
            printf("\n");
        }
 
        // Задержка
        Sleep(200);
    }
 
    printf("Game Over! Score: %d\n", snakeLength - 1);
 
    return 0;
}

ОШИБКИ:

Code
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
main.cpp: In function ‘int main()’:
main.cpp:46:19: error: invalid conversion from ‘void*’ to ‘SnakeCell*’ [-fpermissive]
   46 |     snake = malloc(sizeof(SnakeCell));
      |             ~~~~~~^~~~~~~~~~~~~~~~~~~
      |                   |
      |                   void*
main.cpp:52:18: error: invalid conversion from ‘void*’ to ‘SnakeCell*’ [-fpermissive]
   52 |     food = malloc(sizeof(SnakeCell));
      |            ~~~~~~^~~~~~~~~~~~~~~~~~~
      |                  |
      |                  void*
main.cpp:64:13: error: ‘_kbhit’ was not declared in this scope
   64 |         if (_kbhit()) {
      |             ^~~~~~
main.cpp:65:32: error: ‘_getch’ was not declared in this scope; did you mean ‘getch’?
   65 |             int newDirection = _getch();
      |                                ^~~~~~
      |                                getch
main.cpp:104:40: error: invalid conversion from ‘void*’ to ‘SnakeCell*’ [-fpermissive]
  104 |             SnakeCell* newCell = malloc(sizeof(SnakeCell));
      |                                  ~~~~~~^~~~~~~~~~~~~~~~~~~
      |                                        |
      |                                        void*
main.cpp:111:26: error: invalid conversion from ‘void*’ to ‘SnakeCell*’ [-fpermissive]
  111 |             food = malloc(sizeof(SnakeCell));
      |                    ~~~~~~^~~~~~~~~~~~~~~~~~~
      |                          |
      |                          void*
main.cpp:117:45: error: ‘S’ was not declared in this scope
  117 |             field[current->x][current->y] = S
      |                                             ^
main.cpp:133:9: error: ‘Sleep’ was not declared in this scope
  133 |         Sleep(200);
      |         ^~~~~
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
28.12.2022, 00:09
Ответы с готовыми решениями:

Написать консольную змейку
Привет ! Хочу написать подобие змейки - только там за мной крипы будут гоняться (но не суть). Не совсем понимаю, как сделать так, чтобы...

Пишу консольную змейку, крашит при увеличении размера
Появилось желание сделать свою игру на С++, так как нужно начинать с простого, решил сделать простую змейку. Нашёл в интернете пример, и...

Исправить змейку
Чтобы шла слева на право &lt;script language=&quot;JavaScript&quot;&gt; x=-1; k=0; //window.prompt('Введите направление змейки 1 или...

3
фрилансер
 Аватар для Алексей1153
6431 / 5626 / 1126
Регистрация: 11.10.2019
Сообщений: 14,967
28.12.2022, 07:27
Wara1oni, для начала нужно использовать компилятор C вместо компилятора C++
0
0 / 0 / 0
Регистрация: 24.12.2022
Сообщений: 12
28.12.2022, 11:52  [ТС]
Помогите пожалуйста
Змейка не реагирует на действия(

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
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <time.h>
#include <conio.h>
 
#define WIDTH 16
#define HEIGHT 16
#define SNAKE_INIT_LEN 4
 
typedef struct Coord {
    int x;
    int y;
} Coord;
 
typedef struct Snake {
    int len;
    Coord body[WIDTH * HEIGHT];
} Snake;
 
void draw_board(const Snake* snake, const Coord* food) {
    system("cls");
    for (int y = 0; y < HEIGHT; y++) {
        for (int x = 0; x < WIDTH; x++) {
            bool is_snake = false;
            for (int i = 0; i < snake->len; i++) {
                if (snake->body[i].x == x && snake->body[i].y == y) {
                    is_snake = true;
                    break;
                }
            }
            if (is_snake) {
                putchar('#');
            } else if (food->x == x && food->y == y) {
                putchar('?');
            } else {
                putchar(' ');
            }
        }
        putchar('\n');
    }
}
 
void init_snake(Snake* snake) {
    snake->len = SNAKE_INIT_LEN;
    for (int i = 0; i < snake->len; i++) {
        snake->body[i].x = WIDTH / 2 - i;
        snake->body[i].y = HEIGHT / 2;
    }
}
 
void init_food(Coord* food) {
    food->x = rand() % WIDTH;
    food->y = rand() % HEIGHT;
}
 
bool move_snake(Snake* snake, const Coord* food, char dir) {
    Coord next_pos;
    switch (dir) {
        case 'w':
            next_pos.x = snake->body[0].x;
            next_pos.y = snake->body[0].y - 1;
            break;
        case 'a':
            next_pos.x = snake->body[0].x - 1;
            next_pos.y = snake->body[0].y;
            break;
        case 's':
            next_pos.x = snake->body[0].x;
            next_pos.y = snake->body[0].y + 1;
            break;
        case 'd':
            next_pos.x = snake->body[0].x + 1;
            next_pos.y = snake->body[0].y;
            break;
        default:
            return true;
    }
    if (next_pos.x < 0 || next_pos.x >= WIDTH || next_pos.y < 0 || next_pos.y >= HEIGHT) {
        return false;
    }
    for (int i = 1; i < snake->len; i++) {
        if (snake->body[i].x == next_pos.x && snake->body[i].y == next_pos.y) {
            return false;
        }
    }
    if (next_pos.x == food->x && next_pos.y == food->y) {
        snake->body[snake->len] = next_pos;
        snake->len++;
        init_food(food);
    } else {
        for (int i = snake->len - 1; i > 0; i--) {
            snake->body[i] = snake->body[i - 1];
        }
        snake->body[0] = next_pos;
    }
    return true;
}
    
 
int main() {
    srand(time(NULL));
    Snake snake;
    Coord food;
    init_snake(&snake);
    init_food(&food);
    char dir = 'd';
    while (true) {
        if (_kbhit()) {
            char ch = _getch();
            if (ch == 'w' && dir != 's') {
                dir = 'w';
            } else if (ch == 'a' && dir != 'd') {
                dir = 'a';
            } else if (ch == 's' && dir != 'w') {
                dir = 's';
            } else if (ch == 'd' && dir != 'a') {
                dir = 'd';
            }
        }
        if (!move_snake(&snake, &food, dir)) {
            break;
        }
        draw_board(&snake, &food);
        Sleep(100)
    }
    printf("Game Over!\n");
    return 0;
}
0
Лежебока
 Аватар для Donkix
328 / 244 / 95
Регистрация: 12.05.2021
Сообщений: 1,429
Записей в блоге: 2
28.12.2022, 12:30
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
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <time.h>
#include <conio.h>
#include <windows.h>
 
#define WIDTH 16
#define HEIGHT 16
#define SNAKE_INIT_LEN 4
 
typedef struct Coord {
int x;
int y;
} Coord;
 
typedef struct Snake {
int len;
Coord body[WIDTH * HEIGHT];
} Snake;
 
void draw_board(Snake* snake, Coord* food)
{
    system("cls");
    int x,y,i;
    for (y = 0; y < HEIGHT; y++)
    {
        for (x = 0; x < WIDTH; x++)
        {
            bool is_snake = false;
            for (i = 0; i < snake->len; i++)
            {
                if (snake->body[i].x == x && snake->body[i].y == y)
                {
                    is_snake = true;
                    break;
                }
            }
            if (is_snake) putchar('#');
            else if (food->x == x && food->y == y) putchar('?');
            else putchar(' ');
        }
        putchar('\n');
    }
}
 
void init_snake(Snake* snake)
{
    int i;
snake->len = SNAKE_INIT_LEN;
for (i = 0; i < snake->len; i++) {
snake->body[i].x = WIDTH / 2 - i;
snake->body[i].y = HEIGHT / 2;
}
}
 
void init_food(Coord food) {
food.x = rand() % WIDTH;
food.y = rand() % HEIGHT;
}
 
bool move_snake(Snake* snake, Coord* food, char dir)
{
    int i;
    Coord next_pos;
    switch (dir)
    {
        case 'w':
            next_pos.x = snake->body[0].x;
            next_pos.y = snake->body[0].y - 1;
            break;
        case 'a':
            next_pos.x = snake->body[0].x - 1;
            next_pos.y = snake->body[0].y;
            break;
        case 's':
            next_pos.x = snake->body[0].x;
            next_pos.y = snake->body[0].y + 1;
            break;
        case 'd':
            next_pos.x = snake->body[0].x + 1;
            next_pos.y = snake->body[0].y;
            break;
        default:
            return true;
    }
    if (next_pos.x < 0 || next_pos.x >= WIDTH || next_pos.y < 0 || next_pos.y >= HEIGHT) return false;
 
    for (i = 1; i < snake->len; i++)
        if (snake->body[i].x == next_pos.x && snake->body[i].y == next_pos.y)
            return false;
            
    if (next_pos.x == food->x && next_pos.y == food->y) 
    {
        snake->body[snake->len] = next_pos;
        snake->len++;
        init_food(next_pos);
    } 
    else
    {
        for (i = snake->len - 1; i > 0; i--)
            snake->body[i] = snake->body[i - 1];
        snake->body[0] = next_pos;
    }
    return true;
}
 
 
int main()
{
    srand(time(NULL));
    Snake snake;
    Coord food;
    init_snake(&snake);
    init_food(food);
    char dir = 'd';
    while (true)
    {
        if (_kbhit())
        {
            char ch = _getch();
            if (ch == 'w' && dir != 's') dir = 'w';
            else if (ch == 'a' && dir != 'd') dir = 'a';
            else if (ch == 's' && dir != 'w') dir = 's';
            else if (ch == 'd' && dir != 'a') dir = 'd';
        }
        
        if (!move_snake(&snake, &food, dir)) break;
        draw_board(&snake, &food);
        Sleep(100);
    }
    printf("Game Over!\n");
    return 0;
}
Внес небольшие корректировки

Добавлено через 41 секунду
Теперь работает, но еще лучше, если бы вы отрисовали поле, в котором двигается змейка
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
28.12.2022, 12:30
Помогаю со студенческими работами здесь

Исправить змейку
Помогите исправить змейку, дабы змейка находилась на поле #define _CRT_SECURE_NO_WARNINGS #include &lt;iostream&gt; #include...

изменить змейку
помогите пожалуйста убрать нолик который выскакивает если съесть фрукт в левом верхнем углу, чтобы можно было остановить змейку на месте,...

Рисуем змейку
Требуется разработать подпрограмму, рисующую двух змеек, вертикальную и горизонтальную, на основе заданных амплитуд и числа зигзагов ...

Доделать змейку
Помогите доделать змейку! program SNAKE; Uses CRT; Label R1,R2,R3,R4,R5; var xp,yp,xg,yg,xh,yh,xs,ys:integer; i,j:integer; ...

Игра в змейку С++
Добрый день. У меня есть готовый вариант игры змейки, нужно добавить в неё ИИ который определяет где находится яблоко и соответсвенно его...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
PowerShell Snippets
iNNOKENTIY21 11.11.2025
Модуль PowerShell 5. 1+ : Snippets. psm1 У меня модуль расположен в пользовательской папке модулей, по умолчанию: \Documents\WindowsPowerShell\Modules\Snippets\ А в самом низу файла-профиля. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru