Загрузка...

Помогите со змейкой

Тема в разделе C/C++ создана пользователем Hotako 6 окт 2022. (поднята 6 окт 2022) 195 просмотров

  1. Hotako
    Hotako Автор темы 6 окт 2022 746 3 дек 2017
    Кароче в шараге задание по видеоуроку змейку сделать, вроде все норм переписал, но при создании поля правая стенка вместо своего положения стоит вместе с левой, как фиксить? Стенки в q2 прописываются

    #include <iostream>
    #include <conio.h>
    #include <windows.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>

    using namespace std;


    const int width = 20;
    const int height = 20;

    const int size22 = width * height;


    int play_field[size22];


    int head_x;
    int head_y;
    int direction = 1;
    int lv=0;
    int snake_length = 3;
    int score = 0;


    bool game111;

    int d11;


    void q();
    void q2();
    void q3();
    void q4(int x, int y);
    void q5();
    void q6();
    char q7(int value);
    void q8();


    int main()
    {
    q8();


    }



    void q8() {
    setlocale(0, "");

    HKL keyboard = GetKeyboardLayout(0);

    int keyboard2 = LOWORD(keyboard);

    if (keyboard2 == 0x0419) {
    //cout << GetKeyboardLayout(0);
    cout << "Измените раскладку клавиатуры,для корректной работы игры";
    cout << endl;
    }




    cout << "Введите уровень сложности: " << endl << endl;
    cout << "1 - Легко" << endl;
    cout << "2 - Средне" << endl;
    cout << "3 - Сложно" << endl;
    cin >> d11;
    cout << endl;
    int c = 0;
    if (d11 == 1 || d11 == 2 || d11 == 3) {



    q();
    }



    else {

    while (true)
    {
    c = c + 1;

    if (c == 3) {
    d11 = 1;
    q();
    break;
    }
    else {

    cout << "Введите уровень сложности: " << endl << endl;
    cout << "1 - Легко" << endl;
    cout << "2 - Средне" << endl;
    cout << "3 - Сложно" << endl;
    cout << endl;

    cin >> d11;

    if (d11 == 1 || d11 == 2 || d11 == 3) {



    q();
    break;
    }
    }
    }
    }

    return ;
    }


    void q()
    {

    q3();
    game111 = true;
    while (game111)
    {

    if (_kbhit())
    {
    char key = _getch();
    switch (key) {
    case 'w':
    if (direction != 3) direction = 1;
    break;
    case 'd':
    if (direction != 4) direction = 2;
    break;
    case 's':
    if (direction != 1) direction = 3;
    break;
    case 'a':
    if (direction != 2) direction = 4;
    break;




    }


    }

    q5();
    system("cls");

    q2();
    switch (d11)
    {
    case 1: Sleep(500);
    break;
    case 2: Sleep(400);
    break;
    case 3: Sleep(200);
    break;
    }
    }


    cout << "!Вы проиграли!" << endl << "Количество очков: " << score;

    cout << endl;
    lv = lv + 1;
    cout <<"lv " <<lv;
    cout << endl;
    cin.ignore();

    int l;

    cin >> l;

    if (l == 0) {
    return;
    }
    else {
    q8();
    }

    }





    void q6() {
    int x = 0;
    int y = 0;
    do
    {

    srand(time(NULL));
    x = rand() % (width - 2) + 1;
    y = rand() % (height - 2) + 1;


    } while (play_field[x + y * width] != 0);


    play_field[x + y * width] = -2;
    }


    void q5()
    {

    switch (direction) {
    case 1: q4(-1, 0);
    break;
    case 2: q4(0, 1);
    break;
    case 3: q4(1, 0);
    break;
    case 4: q4(0, -1);
    break;
    }

    for (int i = 0; i < size22; i++)
    {
    if (play_field[i] > 0) play_field[i]--;
    }

    }





    void q4(int x, int y) {
    int x1 = head_x + x;
    int y1 = head_y + y;


    if (play_field[x1 + y1 * width] == -2) {



    snake_length = snake_length + 1;
    score = score + 1;
    q6();
    }





    else if (play_field[x1 + y1 * width] != 0) {
    game111 = false;
    }

    head_x = x1;
    head_y = y1;
    play_field[head_x + head_y * width] = snake_length + 1;


    }





    void q3()
    {

    head_x = width / 2;
    head_y = height / 2;
    play_field[head_x + head_y * height] = 1;


    for (int x = 0; x < width; x++)
    {
    play_field[x] = -1;
    play_field[x + (height - 1) * width] = -1;
    }

    //
    for (int y = 0; y < height; y++)
    {
    play_field[0 + y * height] = -1;
    play_field[(width - 1) + y * width] = -1;
    }


    q6();
    }


    void q2()
    {
    for (int x = 0; x < width; x++)
    {
    for (int y = 0; y < height; y++)
    {

    cout << q7(play_field[x + y * width]);
    }

    cout << endl;

    }
    }

    char q7(int value)
    {

    if (value > 0) return 'o';

    switch (value) {

    case -1: return 'O';

    case -2: return 'f';
    }
    }
     
  2. r3mb11k
    r3mb11k 6 окт 2022 куку 256 5 ноя 2019
    Код не смотрел, так как неформатированный код смотреть нет желания, но могу предположить, что вывод идет построчно, и после вывода очередной строки забыли поставить cout << endl;
     
    1. Посмотреть предыдущие комментарии (2)
    2. vtlstolyarov
      Hotako, в q7 доабавь в switch вывод пробела для пустого места:
      case 0: return ' ';
    3. Hotako Автор темы
  3. kageno
    kageno 7 окт 2022 1625 12 дек 2016
    Hotako, Ок, а что именно не работает? Дебажил?
     
    1. Hotako Автор темы
    2. Onlyinc
      kageno, Зачем если можно на форуме спросить
Top
Загрузка...