使用QT制作贪吃蛇小游戏(含登录注册界面)

这篇具有很好参考价值的文章主要介绍了使用QT制作贪吃蛇小游戏(含登录注册界面)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

代码:

login.h

#ifndef LOGIN_H
#define LOGIN_H

#include <QDialog>
#include <QMessageBox>
#include <QAbstractButton>
#include <QVector>
#include "widget.h"
#include "register.h"
#include "userlist.h"
#include "user.h"

namespace Ui {
class Login;
}

class Login : public QDialog
{
    Q_OBJECT

public:
    explicit Login(QWidget *parent = nullptr);
    ~Login();

private slots:
    void on_btn_login_clicked();
    void on_btn_register_clicked();
    void register_success_slot(UserList &l);

public:


private:
    Ui::Login *ui;

    Widget w;
    Register r;
    //UserList list;
};


#endif // LOGIN_H

register.h

#ifndef REGISTER_H
#define REGISTER_H

#include <QDialog>
#include <QMessageBox>
#include <QAbstractButton>
#include "user.h"
#include "userlist.h"

namespace Ui {
class Register;
}

class Register : public QDialog
{
    Q_OBJECT

public:
    explicit Register(QWidget *parent = nullptr);
    ~Register();
signals:
    void register_success(UserList &list);

private slots:
    void on_btn_register_clicked();

    void on_btn_quit_clicked();

private:
    Ui::Register *ui;
    QMessageBox msgBox;
    //UserList list;
};

#endif // REGISTER_H

user.h

#ifndef USER_H
#define USER_H

#include <QObject>

class User
{
public:
    User();
    ~User();

public:
    QString getName();
    void setName(QString name);
    QString getUser_accout();
    void setUser_account(QString user_account);
    QString getPwd();
    void setPwd(QString pwd);
private:
    QString name;
    QString user_account;
    QString pwd;
};

#endif // USER_H

userlist.h

#ifndef USERLIST_H
#define USERLIST_H

#include <QObject>
#include <QVector>
#include "user.h"

class UserList
{
public:
    UserList();
    ~UserList();

public:
    void userlist_insert(User &user);
    void userlist_delete();
    void userlist_locate(QString user_account);
    void userlist_update();
    bool isExist(QString user_account);
    bool account_judge(QString &user, QString &pwd);

private:
    QVector<User> userlist;
};

#endif // USERLIST_H

widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QTime>
#include <QTimer>
#include <QPen>
#include <QPainter>
#include <QPaintEvent>
#include <QRect>
#include <QPoint>
#include <QBrush>
#include <QLabel>
#include <QMessageBox>
#include <QApplication>
#include <QDir>
#include <QProcess>

static const int RETCODE_RESTART = 773;

namespace Ui {
class Widget;
}

class Widget : public QWidget
{
    Q_OBJECT

public:
    explicit Widget(QWidget *parent = 0);
    ~Widget();

public:
    void Init();

public:
      QTimer *m_Timer;
      bool time_flag=false;
      int  base_time=0,time_s=0;
      bool flag_times=false;


private slots:
      void dida_time();
      void star_time();
      void stop_time();
      void restar_time();

public:
       int x,y,base;
       int save[625][2]={{2,0},{1,0},{0,0}};
       int length=3;
       int mark=0;
       int now_head_x,now_head_y;
       int head_x=2,head_y=0;
       int food_x=6,food_y=6;
       bool food_flag=true;
       char head_direction=4;
       bool head_eat=false;
       bool move_flag=false;
       void reboot();
protected:
       void paintEvent(QPaintEvent *);

protected:
         void keyPressEvent(QKeyEvent *event);
         void keyReleaseEvent(QKeyEvent *event);

private:
    Ui::Widget *ui;
};

#endif // WIDGET_H

login.cpp

#include "login.h"
#include "ui_login.h"

UserList list;

Login::Login(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::Login)
{
    ui->setupUi(this);
    ui->lineEdit_pwd->setEchoMode(QLineEdit::Password);
    connect(&r, SIGNAL(register_success(UserList&)), this, SLOT(register_success_slot(UserList &)));
}

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

void Login::on_btn_login_clicked()
{
    //获取用户输入的用户名和密码
    QString user = ui->lineEdit_user->text();
    QString pwd = ui->lineEdit_pwd->text();

    //判断用户是否存在
    if(list.isExist(user) == false)
    {
        QMessageBox::warning(this, "提示", "用户不存在!");
    }

    //判断用户名或者密码是否正确
    if(list.account_judge(user, pwd) == false)
    {
        QMessageBox::warning(this, "提示", "用户名或密码错误!");
    }
    else
    {
        this->hide();
        w.show();
    }
}

void Login::on_btn_register_clicked()
{
    this->close();
    r.show();
}

//注册界面发来注册成功信号,登陆界面显示
void Login::register_success_slot(UserList &l)
{
    this->show();
    list = l;
}

main.cpp

#include "widget.h"
#include "login.h"
#include <QApplication>


int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    //Widget w;
    //w.show();
    Login login;
    login.show();


    return a.exec();
}

register.cpp

#include "register.h"
#include "ui_register.h"
#include <QDebug>

extern UserList list;

Register::Register(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::Register)
{
    ui->setupUi(this);
    ui->label_title->setFont(QFont("宋体", 20, QFont::Bold));
    ui->lineEdit_user->setPlaceholderText("请输入用户名");
    ui->lineEdit_pwd->setPlaceholderText("请输入密码");
    ui->lineEdit_pwd->setEchoMode(QLineEdit::Password);
    ui->lineEdit_pwd_2->setPlaceholderText("请再次确认密码");
    ui->lineEdit_pwd_2->setEchoMode(QLineEdit::Password);

}

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

void Register::on_btn_register_clicked()
{
    QString user = ui->lineEdit_user->text();
    QString pwd = ui->lineEdit_pwd->text();
    QString pwd_2 = ui->lineEdit_pwd_2->text();

    //用户名和密码不能为空
    if(user.isEmpty() || pwd.isEmpty() || pwd_2.isEmpty())
    {
           QMessageBox::warning(this, "提示", "用户名或密码不符合要求!");
           return ;
    }

    //判断两次用户名是否相同
    if(pwd.compare(pwd_2, Qt::CaseInsensitive) != 0)
    {
        QMessageBox::warning(this, "提示", "两次键入的密码不同,请重新输入!");
    }
    //判断用户是否存在,若存在则注册失败,不存在则注册
    if(list.isExist(user))
    {
        QMessageBox::warning(this, "提示", "失败,注册用户已存在!");
    }
    else
    {
        User newUser;
        newUser.setUser_account(user);
        newUser.setPwd(pwd);
        list.userlist_insert(newUser);

        msgBox.about(this, "提示", "注册成功!");
    }
}

//注册成功,跳转到登陆界面的槽函数,发送注册成功信号
void Register::on_btn_quit_clicked()
{
    this->hide();
    emit register_success(list);
}

user.cpp

#include "user.h"

User::User()
{

}
User::~User()
{

}

QString User::getName()
{
    return this->name;
}
void User::setName(QString name)
{
    this->name = name;
}
QString User::getUser_accout()
{
    return this->user_account;
}
void User::setUser_account(QString user_account)
{
    this->user_account = user_account;
}
QString User::getPwd()
{
    return this->pwd;
}
void User::setPwd(QString pwd)
{
    this->pwd = pwd;
}

userlist.cpp

#include "userlist.h"
#include <QDebug>

UserList::UserList()
{

}
UserList::~UserList()
{

}

void UserList::userlist_insert(User &user)
{
    userlist.push_front(user);
}
void UserList::userlist_delete()
{

}

void UserList::userlist_locate(QString user_account)
{

}
//查找用户名是否存在,存在返回true,不存在返回false
bool UserList::isExist(QString user_account)
{
    for(int i = 0; i < userlist.length(); i++)
    {
        User user_temp = userlist.at(i);
        if(user_temp.getUser_accout().compare(user_account, Qt::CaseInsensitive) == 0)
        {
            return true;
        }
    }
    return false;
}

bool UserList::account_judge(QString &user, QString &pwd)
{
    for(int i = 0; i < userlist.length(); i++)
    {
        User user_temp = userlist.at(i);
        //用户存在并且账户密码都正确,返回true,否则返回false
        if(user_temp.getUser_accout().compare(user, Qt::CaseInsensitive) == 0 && user_temp.getPwd().compare(pwd, Qt::CaseSensitive) == 0)
        {
            qDebug() << "账户:" << user_temp.getUser_accout();
            qDebug() << "密码:" << user_temp.getPwd();
            return true;
            //break;
        }
    }
    return false;
}

void UserList::userlist_update()
{

}

widget.cpp

#include "widget.h"
#include "ui_widget.h"

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

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

void Widget::Init()
{

  ui->lcd_mark->display(0);
  ui->lcd_time->display(0);

  connect(ui->btn_star,SIGNAL(clicked()),this,SLOT(star_time()));
  connect(ui->btn_stop,SIGNAL(clicked()),this,SLOT(stop_time()));
  connect(ui->btn_restar,SIGNAL(clicked()),this,SLOT(restar_time()));
}

void Widget::star_time()
{
    m_Timer = new QTimer(this);
    m_Timer->start(100);
    connect(m_Timer,SIGNAL(timeout()),this,SLOT(dida_time()));
    qsrand(QTime(0,0,0).secsTo(QTime::currentTime()));
    time_flag=true;
}

void Widget::stop_time()
{
    if(time_flag==true)
 { disconnect(m_Timer,SIGNAL(timeout()),this,SLOT(dida_time())); time_flag=false; }
}

void Widget::restar_time()
{
  reboot();
}

void Widget::dida_time()
{
   base_time++;
   time_s=base_time/10;
   ui->lcd_time->display(time_s);

   {

       if(head_x==food_x && head_y==food_y)
       {
            head_eat=true;
            mark++;
            length++;
            ui->lcd_mark->display(mark);
       }

         if(head_eat==false)
         {

         }
         else
         {

             food_x=qrand()%25;
             food_y=qrand()%25;

             for(int i=1;i<length; i++)
             {
                 if(food_x==save[i][0] && food_y==save[i][1])
                 {
                     food_x=qrand()%25;
                     food_y=qrand()%25;
                     i=1;
                 }
             }

             head_eat=false;
         }

    now_head_x=head_x;
    now_head_y=head_y;

    switch(head_direction)
    {
      case 1: head_y--;  break;
      case 2: head_y++;  break;
      case 3: head_x--;  break;
      case 4: head_x++;  break;
    }

    for(int i=1;i<length; i++)
    {
        if(head_x==save[i][0] && head_y==save[i][1])
          {
            disconnect(m_Timer,SIGNAL(timeout()),this,SLOT(dida_time()));
             QMessageBox message(QMessageBox::NoIcon, "挑战失败", "the game is over!");
               message.exec();
                reboot();
           }
         if(head_x>24 || head_y>24 ||head_x<0 || head_y<0)
         {
             disconnect(m_Timer,SIGNAL(timeout()),this,SLOT(dida_time()));
              QMessageBox message(QMessageBox::NoIcon, "挑战失败", "the game is over!");
                message.exec();
                   reboot();
         }
    }

   for(int i=1;i<length; i++)
   {
       save[length-i][0]=save[length-i-1][0];
       save[length-i][1]=save[length-i-1][1];
   }

     save[0][0]=head_x;
     save[0][1]=head_y;

     update();
   }

}

void Widget::paintEvent(QPaintEvent *)
{

   QPainter painter(this);

   painter.setPen(QPen(Qt::blue,2));
   painter.setBrush(Qt::gray);
   base=20;
   for(x=0;x<32;x++)for(y=0;y<40;y++)
   painter.drawRect(x*base,y*base,base,base);

  painter.setPen(QPen(Qt::yellow,2));
  painter.setBrush(Qt::green);
  for(int num=0;num<length;num++)
    {
       painter.drawRect(save[num][0]*base,save[num][1]*base,base,base);
    }

    painter.setPen(QPen(Qt::white,2));
    painter.setBrush(Qt::red);
    painter.drawRect(food_x*base,food_y*base,base,base);
}

void Widget::keyPressEvent(QKeyEvent *event)
    {
    switch (event->key())
    {
      case Qt::Key_W:
           qDebug("I get up!");   if(head_direction!=2) head_direction=1;   break;
      case Qt::Key_S:
           qDebug("I get down!"); if(head_direction!=1) head_direction=2;   break;
      case Qt::Key_A:
           qDebug("I get left!"); if(head_direction!=4) head_direction=3;   break;
      case Qt::Key_D:
           qDebug("I get right!");if(head_direction!=3) head_direction=4;   break;
      case Qt::Key_Space:
           qDebug("I get Space!"); break;
      default: QWidget::keyPressEvent(event);  break;
    }
    update();
}
void Widget::keyReleaseEvent(QKeyEvent *)
{

}
void Widget::reboot()
{
    QString program = QApplication::applicationFilePath();
    QStringList arguments = QApplication::arguments();
    QString workingDirectory = QDir::currentPath();
    QProcess::startDetached(program, arguments, workingDirectory);
    QApplication::exit();
    exit(0);
}

布局文件(.ui结尾)

login.ui

贪吃蛇设计登录界面,qt,ui,开发语言

register.ui

贪吃蛇设计登录界面,qt,ui,开发语言

widget.ui

贪吃蛇设计登录界面,qt,ui,开发语言文章来源地址https://www.toymoban.com/news/detail-548297.html

到了这里,关于使用QT制作贪吃蛇小游戏(含登录注册界面)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 使用TypeScript实现贪吃蛇小游戏(网页版)

    本项目使用webpack+ts所编写 下边是项目的文件目录 /src下边的index.html页面是入口文件 index.ts是引入所有的ts文件 /modules文件夹是用来存放所有类的 index.html index.ts  /style/less /modules/Food.ts /modules/GameControl.ts /modules/ScorePanel.ts /modules/Snake.ts

    2024年02月13日
    浏览(42)
  • 使用Java实现一个简单的贪吃蛇小游戏

    基于java实现贪吃蛇小游戏,主要通过绘制不同的图片并以一定速度一帧一帧地在窗体上进行展示。 开发工具:eclipse java工具包:jdk1.8 代码地址:https://gitee.com/jay_musu/games-and-tools.git 创建一个新的项目,并命名。创建一个名为images的文件夹用来存放游戏相关图片。然后再在项

    2024年02月11日
    浏览(56)
  • 【贪吃蛇小游戏】宝塔面板快速搭建贪吃蛇小游戏Web网站 - 无需云服务器

    转载自远程内网穿透的文章:Linux使用宝塔面板搭建网站,并内网穿透实现公网访问 宝塔面板作为简单好用的服务器运维管理面板,它支持Linux/Windows系统,我们可用它来一键配置LAMP/LNMP环境、网站、数据库、FTP等,通过Web端轻松管理服务器。 以下教程,我们将演示使用宝塔

    2024年02月05日
    浏览(67)
  • 小游戏实战丨基于PyGame的贪吃蛇小游戏

    本期内容:基于pygame的贪吃蛇小游戏 下载地址:https://download.csdn.net/download/m0_68111267/88700188 实验环境 python3.11及以上 pycharm pygame 安装pygame的命令: pygame是一个开源的Python模块,专门用于编写电子游戏。它使用简单、功能强大,因此非常适合初学者入门。pygame的主要特点包括图

    2024年02月03日
    浏览(63)
  • Javase | 贪吃蛇小游戏

    * 1:设计游戏图纸 * 2:设计游戏窗体 * 3:在窗体上添加面板 * 4:在面板上添加画笔方法(paintComponent方法) *5 用super调用父类的paintComponent (来每一次刷新界面) * 6:在面板上添加标题:用ImageIcon导入图片类来导入图片,然后调用有关方法 * 7:在面板上添加黑色游戏区框(

    2024年02月04日
    浏览(49)
  • Java小游戏—贪吃蛇

    摘 要 近年来,java作为一种新的编程语言,以其简单性、可移植性和平台无关性等优点,得到了各个国家广泛地认可。本文基于java技术和Eclipse开发环境,设计并实现了一个操作简单、界面美观的“贪吃蛇”游戏。“贪吃蛇”游戏是一个经典的游戏,它因操作简单、娱乐性强

    2024年02月03日
    浏览(48)
  • 贪吃蛇小游戏(C++)

    首先我们需要下载EasyX(具体的方法在EasyX专栏中有提到) easyX下载和绘制简单基本图形_小梁今天敲代码了吗的博客-CSDN博客 贪吃蛇这个游戏我们一定都玩过,玩家使用方向键操控一条“蛇”,蛇会朝着一个方向不断移动,玩家可以通过上下左右键改变其运动方向。同时屏幕

    2023年04月27日
    浏览(40)
  • Python贪吃蛇小游戏

    Python贪吃蛇小游戏 若程序错误,请去终端下载random, turtle, freegames pip install random pip install turtle pip install freegames from random import randrange from turtle import * from freegames import square, vector food = vector(0, 0) snake = [vector(10, 0)] aim = vector(0, -10) def change(x, y):     \\\"\\\"\\\"Change snake direction.\\\"\\\"\\\"    

    2024年02月03日
    浏览(55)
  • 小游戏:人生中写的第一个小游戏——贪吃蛇(C语言)

            小编开了一个关于游戏的专栏,主要是运用easyx图形库进行的。        第一章:人生中写的第一个小游戏——贪吃蛇(C语言)         这个游戏的代码我在gitee上发布了,大家如果不嫌弃,可以进入这个网址进行查看和复制:https://gitee.com/rising-sun-1。      

    2024年02月09日
    浏览(61)
  • 【C语言小游戏】贪吃蛇

      使⽤C语⾔在Windows环境的控制台中模拟实现经典⼩游戏贪吃蛇 实现基本的功能: 贪吃蛇地图绘制 蛇吃⻝物的功能 (上、下、左、右⽅向键控制蛇的动作) 蛇撞墙死亡 蛇撞⾃⾝死亡 计算得分 蛇⾝加速、减速 暂停游戏 游戏指引页面 游戏页面 指针; 动态内存; 结构体;

    2024年01月19日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包