Qt项目简单贪吃蛇代码

article/2025/10/21 13:39:09

目录

第一个界面

第二个界面


第一个界面

在.pro文件里添加sql

QT       += core gui sql

点击.ui文件添加组件

 

类和对象如图所示,右键MianWindow->改变样式表,在编辑样式表里添加代码改变按钮样式

QPushButton{border:2px solid #7b7b7b;  //按钮边框样式border-radius:15px;        //圆角background-color:#b6b6b6;  //颜色
}QPushButton:hover{             //鼠标移动样式background-color:#cacaca;
}QPushButton:pressed{           //鼠标点击样式background-color:#e1e1e1;
}

 login.h

#ifndef SQLITELOGIN_H
#define SQLITELOGIN_H#include "snake.h"#include <QMainWindow>
#include <QString>
#include <QDebug>
#include <QEvent>namespace Ui {
class SqliteLogin;
}class SqliteLogin : public QMainWindow
{Q_OBJECTpublic:explicit SqliteLogin(QWidget *parent = 0);~SqliteLogin();Snake snake;private slots:void on_longinBt_clicked();void on_registBt_clicked();private:Ui::SqliteLogin *ui;
};#endif // SQLITELOGIN_H

login.cpp

#include "sqlitelogin.h"
#include "ui_sqlitelogin.h"#include "snake.h"#include <QMessageBox>
#include <QSqlQuery>
#include <QSqlTableModel>SqliteLogin::SqliteLogin(QWidget *parent) :QMainWindow(parent),ui(new Ui::SqliteLogin)
{ui->setupUi(this);setWindowTitle("登录注册界面");
}SqliteLogin::~SqliteLogin()
{delete ui;
}void SqliteLogin::on_longinBt_clicked()
{QString username = ui->userEdit->text();QString password = ui->passEdit->text();//查询数据库验证QSqlTableModel *model = new QSqlTableModel;model->setTable("userinfo");model->setFilter(QString("username='%1' and password='%2'").arg(username).arg(password));model->select();//检查是否查询到数据int row = model->rowCount();if (row > 0){//QMessageBox::information(this, "登录提示", "登录成功");QMessageBox *msgbox = new QMessageBox(this);msgbox->information(this, "登录提示", "登录成功");snake.show();this->hide();//隐藏界面}else{QMessageBox::information(this, "登录提示", "登录失败");}delete model;
}void SqliteLogin::on_registBt_clicked()
{QString username = ui->userEdit->text();QString password = ui->passEdit->text();QString cmd = QString ("insert into userinfo values('%1', '%2')").arg(username).arg(password);QSqlQuery query;if(query.exec(cmd)){QMessageBox::information(this, "注册提示", "注册成功");}else{QMessageBox::information(this, "注册提示", "注册失败");}
}

main.cpp

#include "sqlitelogin.h"
#include <QApplication>#include <QSqlDatabase>
#include <QSqlQuery>int main(int argc, char *argv[])
{//1创建数据库---QSqlDatabase db = QSqlDatabase::addDatabase ("QSQLITE");//设置数据库名db.setDatabaseName("pwd.db");//打开数据if(db.open()){qDebug ()<<"open database success";}else{qDebug ( )<<"open database fail";}//创建一个存储用户名密码的数据库表QString cmd="create table if not exists userinfo (username varchar(64), password varchar(64))";QSqlQuery query;if (query.exec(cmd)){qDebug ()<<"exec success";}QApplication a(argc, argv);SqliteLogin w;w.show();return a.exec();
}

第二个界面

右键项目文件->添加新文件->选择Qt设计师界面类->选择界面模板->Widget->修改类名snake

 snake.h

#ifndef SNAKE_H
#define SNAKE_H#include <QWidget>
#include <QKeyEvent>
#include <QTimer>
#include <QPainter>
#include <QPalette>
#include <QPen>
#include <QBrush>
#include <QFont>
#include <QString>
#include <QColorDialog>QT_BEGIN_NAMESPACE
namespace Ui {
class Snake;
}
QT_END_NAMESPACEtypedef enum Direct{DIR_LEFT,DIR_RIGHT,DIR_UP,DIR_DOWM
}dir_t;class Snake : public QWidget
{Q_OBJECTpublic:explicit Snake(QWidget *parent = nullptr);~Snake();protected:void keyPressEvent(QKeyEvent *event);void addTop();void addDowm();void addLeft();void addRight();void paintEvent(QPaintEvent *event);void deleteLast();void addNewReword();bool checkContact();private:Ui::Snake *ui;int moveFlag = DIR_UP;bool gameStart = false;QTimer *timer;int time =150;   //蛇的移动速度QList <QRectF> snake;QRectF rewardNode;int nodeWidth = 20;int nodeHeight = 20;protected slots:void timeout();
};#endif // SNAKE_H

snake.cpp

#include "snake.h"
#include "ui_snake.h"Snake::Snake(QWidget *parent) :QWidget(parent),ui(new Ui::Snake)
{ui->setupUi(this);setWindowTitle("贪吃蛇");timer = new QTimer();//定时器connect(timer, SIGNAL(timeout()), this, SLOT(timeout()));resize(600, 368);//窗口大小//画蛇QRectF rect(300, 180, nodeWidth, nodeHeight);//蛇头snake.append(rect);addTop();addTop();addNewReword();//食物
}Snake::~Snake()
{delete ui;
}void Snake::keyPressEvent(QKeyEvent *event)//键盘事件
{switch (event->key()) {case Qt::Key_Up:if(moveFlag != DIR_DOWM){moveFlag = DIR_UP;}break;case Qt::Key_Down:if(moveFlag != DIR_UP){moveFlag = DIR_DOWM;}break;case Qt::Key_Left:if(moveFlag != DIR_RIGHT){moveFlag = DIR_LEFT;}break;case Qt::Key_Right:if(moveFlag != DIR_LEFT){moveFlag = DIR_RIGHT;}break;case Qt::Key_Space:if(gameStart == false){gameStart = true;timer->start(time);}else{gameStart = false;timer->stop();}break;default:break;}
}void Snake::timeout()//超时处理
{//判定蛇头与食物重叠int count = 1;if(snake[0].intersects(rewardNode)){count++;addNewReword();}while (count--){switch (moveFlag) {case DIR_UP:addTop();break;case DIR_DOWM:addDowm();break;case DIR_LEFT:addLeft();break;case DIR_RIGHT:addRight();break;default:break;}}deleteLast();update();
}void Snake::addTop()//上移
{QPointF leftTop;QPointF rightBottom;if (snake[0].y() - nodeHeight < 0){leftTop = QPoint(snake[0].x(), this->height() - nodeHeight);rightBottom = QPointF(snake[0].x() + nodeWidth, this->height());}else{leftTop = QPointF(snake[0].x(), snake[0].y() - nodeHeight);rightBottom = snake[0].topRight();}snake.insert(0,QRectF(leftTop, rightBottom));
}void Snake::addDowm()//下移
{QPointF leftTop;QPointF rightBottom;if (snake[0].y() + nodeHeight*2 > this->height()){leftTop = QPointF(snake[0].x(), 0);rightBottom = QPointF(snake[0].x()+nodeWidth, nodeHeight);}else{leftTop = snake[0].bottomLeft();rightBottom = snake[0].bottomRight() + QPointF(0, nodeHeight);}snake.insert(0,QRectF(leftTop, rightBottom));
}void Snake::addLeft()//左移
{QPointF leftTop;QPointF rightBottom;if (snake[0].x() - nodeWidth < 0){leftTop = QPointF(this->width()-nodeWidth, snake[0].y());}else{leftTop = snake[0].topLeft() - QPointF(nodeWidth, 0);}rightBottom = leftTop + QPointF(nodeWidth, nodeHeight);snake.insert(0,QRectF(leftTop, rightBottom));
}void Snake::addRight()//右移
{QPointF leftTop;QPointF rightBottom;if (snake[0].x() + nodeWidth*2 > this->width()){leftTop = QPointF(0, snake[0].y());}else{leftTop = snake[0].topRight();}rightBottom = leftTop + QPointF(nodeWidth, nodeHeight);snake.insert(0,QRectF(leftTop, rightBottom));
}void Snake::paintEvent(QPaintEvent *event)//重写绘图事件处理器
{QPainter painter(this);//画家QPen pen;//画笔QBrush brush(QColor(Qt::gray));//背景颜色QPixmap pix;painter.drawPixmap(0, 0, 600, 368, pix);//蛇pen.setColor(Qt::black);brush.setColor(Qt::yellow);brush.setStyle(Qt::SolidPattern);painter.setPen(pen);painter.setBrush(brush);for(int i=0; i<snake.length(); i++){painter.drawRect(snake[i]);}//食物pen.setColor(Qt::red);brush.setColor(Qt::red);brush.setStyle(Qt::SolidPattern);painter.setPen(pen);painter.setBrush(brush);painter.drawEllipse(rewardNode);//显示分数QFont font("微软雅黑", 12, QFont::ExtraLight);pen.setColor(Qt::black);painter.setPen(pen);painter.setFont(font);painter.drawText(20,20,QString("当前得分:")+QString("%1").arg(snake.length()-3));//结束提示if (checkContact()){QFont font("微软雅黑", 30, QFont::ExtraLight, false);pen.setColor(Qt::red);painter.setPen(pen);painter.setFont(font);painter.drawText((this->width() -300)/2,(this->height() -30)/2,QString("GAME OVER!"));timer->stop();}QWidget::paintEvent(event);
}void Snake::deleteLast()//删除最后一格
{snake.removeLast();
}void Snake::addNewReword()//添加食物
{rewardNode = QRectF(qrand()%(this->width()/20) *20,qrand()%(this->height()/20)*20,nodeWidth,nodeHeight);
}bool Snake::checkContact()//判断蛇与食物碰撞
{for (int i=0; i<snake.length(); i++){for (int j=i+1; j<snake.length(); j++){if(snake[i] ==snake[j]){return true;}}}return false;
}

最终效果

 


http://chatgpt.dhexx.cn/article/7Av4YwhQ.shtml

相关文章

贪吃蛇php代码下载,C语言贪吃蛇代码

C语言编写贪吃蛇源代码&#xff0c;简单易懂&#xff0c;文件为VC源代码&#xff0c;附txt代码和源代码程序。 相关软件软件大小版本说明下载地址 c语言编写贪吃蛇源代码&#xff0c;简单易懂&#xff0c;文件为VC源代码。如果你正在学习c语言&#xff0c;就来下载吧。很经典的…

Html/Javascript snake game 贪吃蛇游戏(附全部代码)

以前用pyhton 做了贪吃蛇游戏&#xff0c; 这里发表的是html/javascript 版本。难度差不多&#xff0c; 区别是python 主要用class, 而javascript 主要用function &#xff0c; 他们的功能很相似&#xff0c; 写法稍微有些不同。内容大致是&#xff1a; 1. 蛇由蛇头&#xff0…

实验二.贪吃蛇的设计

目录 一.实验内容&#xff1a; 二.贪吃蛇的代码实现 &#xff08;1&#xff09;类的声明 &#xff08;2&#xff09;初始化界面 &#xff08;3&#xff09;游戏界面 &#xff08;4&#xff09;蛇的位置 &#xff08;5&#xff09;键盘监听 &#xff08;6&#xff09;更…

Python贪吃蛇 (完整代码+详细注释+粘贴即食)

文章目录 代码运行截图笔记补充参考博客&#xff08;阿里嘎多&#xff01;&#xff09; 代码 #!/usr/bin/env python # -*- coding: utf-8 -*- # author&#xff1a;Wangdali time:2021年1月20日16:08:44 #python实现&#xff1a;贪吃蛇游戏玩法&#xff1a;回车开始游戏&am…

k-means聚类算法及matlab实现(简单实现)

k-means简介 k-means算法也称k均值算法&#xff0c;是一种常用的聚类算法。聚类算法是研究最多、应用最广的一种无监督学习算法。   聚类试图将数据集中的样本划分为若干个通常是不相交的子集&#xff0c;每个子集称为一个“簇”。通过这样的划分&#xff0c;每个簇里的样本可…

matlab 层次聚类

MATLAB的统计工具箱中的多元统计分析中提供了聚类分析的两种方法&#xff1a; 1.层次聚类 hierarchical clustering 2.k-means聚类 这里用最简单的实例说明以下层次聚类原理和应用发法。 层次聚类是基于距离的聚类方法&#xff0c;MATLAB中通过pdist、linkage、dendrogram、…

K-means聚类算法及其MATLAB实现

参考&#xff1a; http://www.csdn.net/article/2012-07-03/2807073-k-means http://www.cnblogs.com/zhzhang/p/5437778.html http://blog.csdn.net/qll125596718/article/details/8243404/ K-means属于无监督学习方法 K表示类别数&#xff0c;Means表示均值&#xff0c;K…

基于MATLAB的K-means聚类算法

实验数据说明 Iris也称鸢尾花卉数据集&#xff0c;是一类多重变量分析的数据集。通过花萼长度&#xff0c;花萼宽度&#xff0c;花瓣长度&#xff0c;花瓣宽度4个属性预测鸢尾花卉属于&#xff08;Setosa(山鸢尾)&#xff0c;Versicolour(杂色鸢尾)&#xff0c;Virginica(维吉尼…

k-means聚类算法(matlab实现)

k-means聚类算法 文章目录 k-means聚类算法前言一、k-means聚类算法简介二、k-means聚类算法步骤三、代码实现总结 前言 k-means聚类算法是硬聚类算法的一种&#xff0c;即在n纬欧几里得空间把n个样本数据分为k类。首先根据用户要确定聚类的数目k,随机性的选取k个样本&#xf…

Kmeans聚类算法——Matlab

聚类算法 原理步骤代码绘图选取四个迭代步骤进行可视化&#xff08;散点图&#xff0c;条形图&#xff09;聚类结果可视化&#xff08;散点图&#xff09; 原理 聚类算法的基本思想是&#xff1a;以空间中k个点为中心进行聚类&#xff0c;对距离他们最近的对象进行归类。通过迭…

matlab实现聚类算法

simulate2020625数据集 clear;clc load simulate2020625;kmax(subcluster(:,3));%设置聚类数目 data subcluster(:,1:2); cata subcluster; [m,n]size(data); c1subcluster(:,3); c1c1;%% 实际聚类图 figure(1); plot(cata(cata(:,3)1,1),cata(cata(:,3)1,2),r*) hold on pl…

K-means++聚类算法(matlab实现)

K-means聚类算法 文章目录 K-means聚类算法前言一、算法简介二、K-means算法步骤三、K-means算法matlab实现总结 前言 K-means算法&#xff1a;K-means算法是K-means算法的改进版&#xff0c;其在选择初始质心时采用了一种更加聪明的方法&#xff0c;能够有效地避免局部最优解…

MATLAB聚类分析(Cluster Analysis)

使用环境&#xff1a;MATLAB2016a、MATLAB2010a 聚类分析是一种无监督式学习&#xff0c;不像回归分析等需要Inputs 和 Targets &#xff0c;聚类分析是只通过提供一组数据实现分类的算法。下面给出本人在学习聚类分析的MATLAB程序 x15*[randn(500,1)5,randn(500,1)5]; x25*[…

matlab统计与机器学习工具箱中的7种聚类算法

1. matlab中自带聚类算法概述 本文简要概述了matlab统计和机器学习工具箱中可用的聚类方法&#xff0c;并给出了其聚类函数。在使用过程中&#xff0c;直接调用该函数即可&#xff0c;十分方便&#xff0c;不得不感慨matlab的强大。 聚类分析&#xff0c;又称分割分析或分类分…

K-mean(多维度)聚类算法(matlab代码)

申明: 仅个人小记。 Email: officeforcsdn163.com 目录 效果演示二维度三维度 k-mean 算法思想简要说明代码分析二维度k-mean代码三维度k-mean代码多维度k-mean代码功能使用示范后期函数接口改造 (借助matlab中cell结构实现)新的函数接口使用范例 小结 效果演示 二维度 (1) K…

k-Means——经典聚类算法实验(Matlab实现)

聚类算法—k-Means实验 k-平均&#xff08;k-Means&#xff09;&#xff0c;也被称为k-均值&#xff0c;是一种得到最广泛使用的聚类算法[1]. k-Means算法以k为参数&#xff0c;把n个对象分为k个簇&#xff0c;使得簇内具有较高的相似度。 实验目的 了解常用聚类算法及其优缺…

MATLAB K-means聚类的介绍与使用

K-means算法是硬聚类算法 &#xff0c;是典型的基于原型的目标函数 聚类方法的代表&#xff0c;它是数据点到原型的某种距离作为优化的目标函数&#xff0c;利用函数求极值的方法得到迭代运算的调整规则。K-means算法以偶是距离 作为相似度测度&#xff0c;它是求对应某一初…

MatLab Kmeans聚类

机器学习以及人工智能的学习需要扎实的数学功底才能走的更远&#xff0c;爬的更高&#xff0c;所以打好数学基础是关键&#xff0c;但无论工作学习都没有充足的时间去拿着书本一个字一个字的去学习了&#xff0c;这里我建议大家找几个比较靠谱入门的机器学习或者人工智能学习平…

聚类分析(二)k-means及matlab程序

1.介绍 k-means是一种常见的基于划分的聚类算法。划分方法的基本思想是&#xff1a;给定一个有N个元组或者记录的数据集&#xff0c;将数据集依据样本之间的距离进行迭代分裂&#xff0c;划分为K个簇&#xff0c;其中每个簇至少包含一条实验数据。 2.k-means原理分析 2.1工作原…

数据挖掘实验(七)Matlab实现聚类算法【clusterdata / kmeans】

本文代码均已在 MATLAB R2019b 测试通过&#xff0c;如有错误&#xff0c;欢迎指正。 另外&#xff0c;这次实验都是调用Matlab现成的函数&#xff0c;没什么技术含量。 &#xff08;一&#xff09;聚类分析的原理 聚类是将数据分类到不同的类或者簇这样的一个过程&#xff…