实现思路

本贪吃蛇主要运用C++和EasyX图形库进行开发。
详细的设计:
1.场景设计
运用了EasyX Graphics Library和Windows函数进行了对本游戏的图形化设计,我们的蛇采用若干个圆连接的形式组成,食物也采用圆的形式随机生成在地图上。
2.蛇和食物的储存结构
蛇和食物分别用一个类来储存,并且在该类中会储存相应的坐标、方向、速度、半径、等一些成员和成员函数。
3.蛇的移动
这里运用的kbhit()和getch()函数来接收用户的输入,并根据用户的输入来定蛇的方向。
4.蛇吃食物的判定
这里里的蛇吃食物的判定是根据蛇头和食物的距离来判定的,因游戏里的蛇头和食物都是一个圆构成的,所以我只需判定两个圆是否相交即可。
5.食物的生成,本游戏的食物是运用随机函数随机生成的。
6.蛇的死亡,这里的蛇是有2钟方式判定为死亡,一种是蛇头撞到墙和蛇头撞到身体,我们只需根据蛇头的坐标和蛇身的坐标来判定即可。
7.音乐的播放,运用Windows函数里的mciSendString()函数来播放音乐。

ps:这里的蛇的移动,是根据蛇头的方向移动而移动的,然后蛇身跟着前一节蛇身的位置而移动。

运行截图


源代码(附注释)

头文件(head.h)

#include <iostream>
#include <Windows.h>
#define WIGHT 800 //窗口的宽度
#define HEIGHT 600 //窗口的高度
#define Snake_Num 500 //蛇最大的节数
using namespace std; class food;
void Time_Out();
void Bgm();
void Begin();
double Distance(int x1, int y1, int x2, int y2);
enum dir //枚举类型,UP,DOWN...相当于0,1...
{UP, DOWN, LEFT, RIGHT
};class snake
{public:snake();bool Box();bool Is_dead();void GameDraw(food&);void SnakeMove();void KeyControl();void EatFood(food&);
private:int len; //蛇的节数int dir; //蛇的方向int r;int grade;int speed; //蛇的速度bool flag; //判断蛇是否死亡POINT coor[Snake_Num]; //蛇的坐标,<Windows.h>里封装的结构体
};class food
{public:food();void friend snake::GameDraw(food&);void friend snake::EatFood(food&);
private:int x, y;int r;bool flag;
};

源文件(snake.cpp)

#include "head.h";
#include <iostream>
#include <cmath>
#include <conio.h>
#include <stdlib.h>
#include <Windows.h>
#include <graphics.h>
#include <mmsystem.h>   //包含多媒体设备接口文件
#pragma comment(lib,"winmm.lib")   //加载静态库using namespace std;food::food()
{r = 5;x = rand() % (WIGHT - 2 * r) + r;y = rand() % (HEIGHT - 2 * r) + r;flag = true;
}snake::snake()
{len = 3;dir = RIGHT;r = 5;speed = 10;grade = 0;flag = true;for (int i = 0; i <= len - 1; i++) {coor[i].x = 10 * (len - 1 - i) + 20;coor[i].y = 10;}
}void snake::GameDraw(food &f)
{BeginBatchDraw(); //防止闪屏setbkcolor(RGB(56, 147, 186)); //设置填充颜色cleardevice();// 绘制蛇for (int i = 0; i < len; i++)solidcircle(coor[i].x, coor[i].y, r);//绘制食物if (f.flag)solidcircle(f.x, f.y, f.r);// 显示分数wchar_t s[20] = L""; // L的作用,给s中的字符分配2个字节,wchar_t:宽字符swprintf_s(s, L"分数:%d", grade); //把字符输入到s中outtextxy(700, 20, s); // outtextxy(x, y, s),(x, y) 为坐标,是为要打印的内容EndBatchDraw();
}void snake::KeyControl()
{// kbhit()和getch()都得在<conio.h>下才可以用if (_kbhit()) //检查当前是否有键盘输入,若有返回一个非0的值,否则返回0{switch (_getch()) //从控制台读取,不显示在屏幕上,即当用户按下某个字符时,无需按回车,函数自动读取{case 'w':case 'W':case 72:if (dir == DOWN) break; // 防止蛇调头dir = UP;break;case 's':case 'S':case 80:if (dir == UP) break;dir = DOWN;break;case 'a':case 'A':case 75:if (dir == RIGHT) break;dir = LEFT;break;case 'd':case 'D':case 77:if (dir == LEFT) break;dir = RIGHT;break;case ' ':Time_Out();while (_getch() == ' ') break;break;default:break;}}
}void snake::SnakeMove()
{// 每节都跟着前一节移动for (int i = len - 1; i > 0; i--){coor[i].x = coor[i - 1].x;coor[i].y = coor[i - 1].y;}// 蛇头移动switch (dir){case UP:coor[0].y -= speed;break;case DOWN:coor[0].y += speed;break;case LEFT:coor[0].x -= speed;break;case RIGHT:coor[0].x += speed;break;default:break;}//判断是否撞墙if (coor[0].x < r || coor[0].x > WIGHT - r)flag = false;if (coor[0].y < r || coor[0].y > HEIGHT - r)flag = false;// 判断是否撞到自己的身体for (int i = 1; i < len; i++){if (Distance(coor[0].x, coor[0].y, coor[i].x, coor[i].y) < 2 * r){flag = false;break;}}
}void snake::EatFood(food &f)
{if (f.flag && Distance(coor[0].x, coor[0].y, f.x, f.y) <= r + f.r){f.flag = false;len++;grade += 10;}if (!f.flag){f.r = 5;f.x = rand() % (WIGHT - 2 * f.r) + f.r;f.y = rand() % (HEIGHT - 2 * f.r) + f.r;f.flag = true;}
}double Distance(int x1, int y1, int x2, int y2)
{double t1 = x1 - x2;double t2 = y1 - y2;return sqrt(t1 * t1 + t2 * t2);
}bool snake::Box()
{wchar_t s[20] = L"";swprintf_s(s, L"你的分数为:%d\n是否再来一次", grade);HWND hWnd = GetHWnd(); // 获取窗口句柄int id = MessageBox(hWnd, s, L"snake", MB_YESNO); //设置消息框if (id == IDYES) return true;return false;
}bool snake::Is_dead()
{return flag;
}void Begin()
{IMAGE img;loadimage(&img, L"./snack.jpg", WIGHT, HEIGHT);putimage(0, 0, &img);
}void Bgm()
{mciSendString(L"open bgm.mp3", 0, 0, 0);mciSendString(L"play bgm.mp3", 0, 0, 0);
}void Time_Out()
{HWND hWnd = GetHWnd();MessageBox(hWnd, L"游戏暂停,按空格键继续", L"提示", MB_OKCANCEL);
}

主函数(main.cpp)

#include "head.h";
#include <iostream>
#include <cmath>
#include <stdlib.h>
#include <conio.h>
#include <Windows.h>
#include <graphics.h>
using namespace std;int main()
{Bgm();srand(GetTickCount()); //设置种子为开机时间initgraph(WIGHT, HEIGHT);while (1){Begin();if (_kbhit()) break;}snake s;food f;while (1){s.KeyControl();s.SnakeMove();s.EatFood(f);s.GameDraw(f);if (!s.Is_dead()){//重新开始if (s.Box()){snake ds; s = ds;food df; f = df;}else break;}Sleep(50);}return 0;
}

总结废话

总的来说这贪吃蛇做的并没有那么好,蛇和食物和背景都是非常的简陋,并且可玩性也不是非常的好,其实可以加速度选择,加关卡模式,还有界面的美化,甚至还可以和数据库进行链接,保存游戏的状态,但是作为一个课设,我觉得这样也够了,哈哈,懒是原罪。
好了,废话不多说了,如对大佬们有帮助,还请大佬们给个大拇指,哈哈

ps:这里在给大家一个打包教程:https://blog.csdn.net/qq_41506111/article/details/102777940
如果大家需要源码和课设报告,可以到这里下载:
https://download.csdn.net/download/weixin_52068218/85485458

贪吃蛇课设(C++)相关推荐

  1. 【源码+教程】Java课设项目_12款最热最新Java游戏项目_Java游戏开发_Java小游戏_飞翔的小鸟_王者荣耀_超级玛丽_推箱子_黄金矿工_贪吃蛇

    马上就要期末了,同学们课设做的如何了呢?本篇为大家带来了12款热门Java小游戏项目的源码和教程,助力大家顺利迎接暑假![源码+教程]Java课设项目_12款最热最新Java游戏项目_Java游戏开发 ...

  2. 蘑菇云「行空板Python入门教程」第六课:贪吃蛇小游戏

    在很久很久以前,手机屏幕都还是黑白的年代,有一款叫做"贪吃蛇"的游戏风靡了大街小巷,在那分辨率极低的屏幕上,几条扭扭曲曲的弧线似乎穿越了整个童年. 这节课上,就让我们用行空板来实现 ...

  3. 大一上课设——贪吃蛇(链表 + easyx)

    大一上课设--贪吃蛇(easyx + 链表 目录 0.素材准备 1.设计思路 2.创建开始界面 3.绘制游戏界面 4.初始化蛇身 6.键盘信息获取 7.蛇的移动 8.死亡判断 9.额外功能 1.加减速 ...

  4. 北理工汇编语言与接口技术结课实验,包括大数乘法,计算器,贪吃蛇三个项目

    1.项目介绍 2.项目图片 ①大数乘法: ②计算器: ③贪吃蛇: 3.下载地址 点我下载

  5. 再来一次的C语言贪吃蛇小游戏(一)

    0. 写在开头 学习编程也有两三年时间了,中间也玩(学校安排学习)过很多东西 ,从汇编到C到Java和python.用Java和Python也就图一快,真要体会编程乐趣还得看我C语言(开玩笑 ) 为什 ...

  6. java小游戏贪吃蛇

    开发工具 :eclips 运行主要代码截图 实现的功能: (1)播放bgm并且可以通过空格暂停 (2)空格实现游戏暂停,再次空格可以继续游戏 (3)头碰到尾巴会结束游戏 (4)右上角可以记录贪吃蛇的长 ...

  7. 大学期间所有课设及大作业源代码

    程序员练成记 出处:牟尼的专栏 http://blog.csdn.net/u012027907 记得刚上大一时,那时对这个专业(软件工程)很陌生,甚至对电脑都很陌生,有时还有点儿害怕,因为我在进入大学 ...

  8. html5小游戏 typescript,使用TypeScript和Canvas编写移动端贪吃蛇大作战游戏

    基本介绍 一款移动端贪吃蛇大作战游戏.(只支持移动端) 这是一个临近 deadline 的课设项目,为了方便地使用TS,我直接使用angular-cli生成了TypeScript的项目结构.如果你有好 ...

  9. Java毕业课设项目名称

    Java毕业课设项目名称 毕业设计题目 1 网上校友录设计 2 辅导员之家网站设计与开发 3 B/S结构下的OA流程可视化的研究与实现 4 B2C的电子商务系统(J2EE) 5 C/S架构的在线开始系 ...

最新文章

  1. 微框架spark--api开发利器
  2. 3万字细品数据倾斜(建议收藏)
  3. [转载]AxureRP 7.0部件详解(一)
  4. 《Cloudera hadoop大数据平台实战指南》此书2019年1月已上市
  5. 基于 Apache Hudi 构建流批一体系统实践
  6. 响应式设计PageAdmin个人博客系统源码v4.0.10
  7. Linux系统中安装软件的三种方法(一)
  8. Java构造函数执行顺序
  9. 完了!Oracle 被虐!MySQL 登顶 Top1!原来这么多人都在用
  10. 什么是whois? (whois的概念及应用)
  11. 93.接收上游的响应
  12. format函数_Python学习教程:Python3之字符串格式化format函数详解(上)
  13. 解决办法:configure: error: C compiler cannot create executables错误
  14. python Django项目汇总(毕设、课设、学习)
  15. Shader山下(六)镜面高光
  16. 爱了,这18个 Python 高效编程技巧真香
  17. android--图片透明
  18. 启动手机自带浏览器和手机拨号
  19. 关于抽象工厂模式的定义和实现
  20. T-SQL 基础学习 01

热门文章

  1. 智能盒子大比拼:Fire TV vs. Apple TV vs. Roku 3 vs. Chromecast
  2. 写一篇anytxt searcher软件的评测文章
  3. 用象棋的思维趣说IT人的职业发展和钱途
  4. 看不见硝烟的战场 人工智能如何运用到网络作战?
  5. webgl中加载模型要求以及优化方案
  6. Ordered Neurons: Integrating Tree Structures into Recurrent Neural Networks
  7. ug许可证服务器注册表删除,为什么我删了ug许可证后安装时一直显示我已经安装了许可证...
  8. Python接弹珠小游戏源代码
  9. 网络电话通信正在努力适应新发展环境
  10. 程序员必备PC维修法(硬件篇)