Russian Qt Forum
Ноябрь 22, 2024, 21:43 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Змейка.  (Прочитано 2888 раз)
alexu007
Чайник
*
Offline Offline

Сообщений: 58


Просмотр профиля
« : Май 19, 2022, 19:00 »

Код:
#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QTime>
#include <QTimer>


QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();

    QTimer *timer;

    struct segm
    {
        int pos_x;
        int pos_y;
        int clr;
    };

    int table_row;
    int table_col;

    int pole[30][50];

    QList<segm> zmeyka;

    void make_zmeyka();
    void print_zmeyka();
    bool move_zmeyka(int);


private:
    Ui::Widget *ui;


public slots:
    void press_pbtn_01();

    void onTimer();

};
#endif // WIDGET_H

Код:
#include "widget.h"
#include "ui_widget.h"


Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);

    // инициализация ГСЧ
    qsrand(QTime(0,0,0).secsTo(QTime::currentTime()));

    timer = new QTimer();

    table_row = ui->tableWidget->rowCount();        // 30
    table_col = ui->tableWidget->columnCount();     // 50

    for(int row = 0; row < table_row; row++)
        for(int col = 0; col < table_col; col++)
        {
            pole[row][col] = 0;

            QTableWidgetItem *it = new QTableWidgetItem;
            it->setTextAlignment(Qt::AlignCenter);
            ui->tableWidget->setItem(row, col, it);
        }


    // лабиринт
    for(int i = 0; i < 3; i++)
        for(int j = 5; j < 15; j++)
        {
            pole[j][i+10] = 1;
            pole[j+10][i+10] = 1;

            ui->tableWidget->item(j, i+10)->setBackgroundColor(Qt::gray);
            ui->tableWidget->item(j+10, i+10)->setBackgroundColor(Qt::gray);

            pole[j][i+37] = 1;
            pole[j+10][i+37] = 1;

            ui->tableWidget->item(j, i+37)->setBackgroundColor(Qt::gray);
            ui->tableWidget->item(j+10, i+37)->setBackgroundColor(Qt::gray);
        }


    make_zmeyka();
    print_zmeyka();

    QObject::connect(ui->pbtn_01, SIGNAL(clicked()), this, SLOT(press_pbtn_01()));
    connect(timer,SIGNAL(timeout()),this,SLOT(onTimer()));
}




Widget::~Widget()
{
    delete ui;
}




void Widget::press_pbtn_01()
{
    timer->start(60);

}




bool Widget::move_zmeyka(int k)
{

    QList<segm> sg;

    int lng = zmeyka.length();

    for(int i = 0; i < lng; i++)
    {
        sg << zmeyka.at(i);
    }

    int x = sg.at(0).pos_x;
    int y = sg.at(0).pos_y;

    if(k == 1) sg[0].pos_y--;
    if(k == 2 )sg[0].pos_x--;
    if(k == 3 )sg[0].pos_y++;
    if(k == 4 )sg[0].pos_x++;


    if((sg[0].pos_x < 0) ||
            (sg[0].pos_y < 0) ||
                (sg[0].pos_x > table_row-1) ||
                    (sg[0].pos_y > table_col-1))
                        return true;

    // обход препятствий
    if(pole[sg[0].pos_x][sg[0].pos_y]) return true;


    sg[0].clr = 2;
    zmeyka[0] = sg.at(0);

    sg[0].pos_x = x;
    sg[0].pos_y = y;

    sg[0].clr = 1;


    for(int i = 1; i < lng; i++)
    {
        sg[i] = zmeyka.at(i);

        // последний сегмент белого цвета стирает след змейки
        if(i == lng-1) sg[i-1].clr = 0;

        zmeyka[i] = sg.at(i-1);
    }

    print_zmeyka();
    return false;
}




void Widget::make_zmeyka()
{
    segm sg;

    // длина змейки
    for(int i = 20; i < 30; i++)
    {
        sg.pos_x = 15;
        sg.pos_y = i;

        sg.clr = 1;
        if(i == 20) sg.clr = 2;
        if(i == 29) sg.clr = 0;

        zmeyka << sg;
    }
}




void Widget::print_zmeyka()
{
    segm sg;
    QColor sclr;

    sg = zmeyka.at(zmeyka.size()-1);
    ui->tableWidget->item(sg.pos_x, sg.pos_y)->setBackgroundColor(Qt::white);


    for(int i = 0; i < zmeyka.size(); i++)
    {
        sg = zmeyka.at(i);

        if(sg.clr == 0) sclr = Qt::white;
        if(sg.clr == 1) sclr = Qt::green;
        if(sg.clr == 2) sclr = Qt::red;

        ui->tableWidget->item(sg.pos_x, sg.pos_y)->setBackgroundColor(sclr);
    }
}




void Widget::onTimer()
{
    static int cx = 0;
    static int napr = 3;
    static int oldnapr = 1;

    if(!(cx % 7))
    {
    met_10:

        napr = (qrand() % 4) + 1;

        // запрет возврата в саму себя
        if(napr == 2 && oldnapr == 4)  goto met_10;
        if(napr == 4 && oldnapr == 2)  goto met_10;
        if(napr == 1 && oldnapr == 3)  goto met_10;
        if(napr == 3 && oldnapr == 1)  goto met_10;
    }

    // обход препятствий
    if(move_zmeyka(napr)) goto met_10;

    oldnapr = napr;
    cx++;
}
« Последнее редактирование: Май 20, 2022, 00:09 от alexu007 » Записан
qtkoder777
Частый гость
***
Offline Offline

Сообщений: 245


Просмотр профиля
« Ответ #1 : Май 19, 2022, 20:56 »

У меня в мобиле змейка умирает при самопересечении. Поддерживается ли это?
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #2 : Май 19, 2022, 23:03 »

змейка на QTableWidget — это сильно Улыбающийся
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
alexu007
Чайник
*
Offline Offline

Сообщений: 58


Просмотр профиля
« Ответ #3 : Май 20, 2022, 00:02 »

У меня в мобиле змейка умирает при самопересечении. Поддерживается ли это?
Нет. Она не самопересекается.
Записан
alexu007
Чайник
*
Offline Offline

Сообщений: 58


Просмотр профиля
« Ответ #4 : Май 20, 2022, 00:07 »

змейка на QTableWidget — это сильно Улыбающийся
Почему нет? Таблицу для многого приспособить можно - все игры, где есть сетка, и не требуется большого быстродействия. Морской бой, например. Шахматы. И т.п.

Записан
qtkoder777
Частый гость
***
Offline Offline

Сообщений: 245


Просмотр профиля
« Ответ #5 : Май 20, 2022, 11:02 »

Какая-то насмешка над легендарной игрой.

Играть в змейку нельзя. Только смотреть.

Змейка должна есть предметы в ячейках и увеличивать длину.

Ввод в ячейки стоит заблокировать.

Запуск стоит сделать с клавиатуры.

« Последнее редактирование: Май 20, 2022, 11:04 от qtkoder777 » Записан
alexu007
Чайник
*
Offline Offline

Сообщений: 58


Просмотр профиля
« Ответ #6 : Май 20, 2022, 12:18 »

Да это не игра. Это просто реализация самой змейки.
Записан
tux
Global Moderator
Бывалый
*****
Offline Offline

Сообщений: 404



Просмотр профиля
« Ответ #7 : Май 20, 2022, 20:10 »

Ну, люди в своё время в Excel картины рисовали. Одна ячейка - одна точка. Вроде как даже продали одну из таких картин. Веселый
Так что змейка в QTableWidget - вполне себе. Голову размять.
Записан

qtkoder777
Частый гость
***
Offline Offline

Сообщений: 245


Просмотр профиля
« Ответ #8 : Май 23, 2022, 17:22 »

Голова вовсе не разминается. Написав алгоритм змейки переделка на QTableWidget делается автозаменой по тексту операции закраски.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.08 секунд. Запросов: 23.