在我的博客浏览效果更佳哦(qwq)

经历了几个月对C和C++的学习,已经懂得基本原理的我准备自己写一个小项目了
先来look look成果吧!
最后成品
一下操作均在VS2019中,VS低版本无碍,其他编译器可能有出入

Code

想写一个功能较为完备的贪吃蛇应该把它作为一个项目去写,而不仅仅是把所有代码写在一个文件里,这应该是程序员最基本的意识了

首先要创建一个结构体,因为我们要用到图形化编程,而图形界面是由一个个点组成的

坐标(头文件)

#ifndef MYPOINT_H
#define MYPOINT_H
//描述点的结构
struct myPoint {int x;int y;
};
#endif

接下来我们需要创建一个窗口,还是一样窗口的尺寸同样是一个常用的参量,我们也可以把它单独写在一个头文件里

窗口尺寸(头文件)

#pragma once      //这里pragma once 和上面的ifndef __  define __ 是一样的
#define width 450
#define length 750

做贪吃蛇首先要明白贪吃蛇分几部分,第一蛇本身,第二就是食物,所以我们就分两部分来做

这里需要说明的是graphics.h这个头文件编译器不是默认安装的,需要自己下载,下载地址点击我,密码:awr0

蛇 (头文件)

//做蛇
#ifndef _SNAKE_H
#define _SNAKE_H
#include <graphics.h>         //图形化函数
#include <conio.h>                    //按键函数
#include "Mypoint.h"              //自己写的点的坐标
class snake {
public:snake();                     //构造函数void drawSnake();             //画蛇void moveSnake();               //移动蛇void keyDown();                    //按键控制蛇//类的封装性int& getSnakeSize();          //用来修改蛇的长度接口myPoint getSnakePos(int pos);   //获取蛇的pos节坐标int judge();                    //判断蛇是否死亡
protected://属性myPoint snakePos[100];            //蛇最多节数int snakeSize;                   //当前节数char position;                    //方向//把方向枚举出来enum snakePosition{right,left,down, up};
};
#endif

在蛇的头文件里面我们创建了一个类,写了关于蛇的一系列操作函数,接下来我们要一一实现这些函数,千万不要害怕,其实特别简单,除了一些图形处理的函数可能你不知道以外,其他的只要学过C语言一般就能理解

蛇函数的实现(cpp)

#include "Snake.h"
#include "window.h"
snake::snake() {snakeSize = 3;//初始化蛇for (int i = snakeSize - 1; i >= 0; i--) {snakePos[i].x = 10 * (2 - i);snakePos[i].y = 0;}position = right;  //初始化方向:右面
}
void snake::drawSnake()//画蛇
{//画地图setcolor(BLACK);line(0, 0, length, 0);//画蛇for (int i = 0; i < snakeSize; i++) {setfillcolor(RGB(rand() % 255, rand() % 255, rand() % 255));fillrectangle(snakePos[i].x, snakePos[i].y, snakePos[i].x + 10, snakePos[i].y + 10);}
}
void snake::moveSnake()//移动蛇
{//处理除了蛇头以外的for (int i = snakeSize - 1; i > 0; i--) {snakePos[i].x = snakePos[i - 1].x;snakePos[i].y = snakePos[i - 1].y;}//处理蛇头switch (position) {case right:snakePos[0].x += 10;break;case left:snakePos[0].x -= 10;break;case down:snakePos[0].y += 10;break;case up:snakePos[0].y -= 10;break;}
}
void snake::keyDown()//按键控制蛇
{//按键控制,72,75,77,80是小键盘的上下左右char useKey = 0;useKey = _getch();     //conion.hswitch (useKey) {case 'w':case 'W':case 72:if (position != down) {position = up;}break;case 'A':case 'a':case 75:if (position != right) {position = left;}break;case 's':case 'S':case 80:if (position != up) {position = down;}break;case 'D':case 'd':case 77:if (position != left) {position = right;}break;case 32:char ch;while ( ch = _getch()) {  //空格暂停if (ch == 32) break;}break;}
}
int& snake::getSnakeSize()//用来修改蛇的长度接口
{return snakeSize;
}
myPoint snake::getSnakePos(int pos)//获取蛇的pos节坐标
{return snakePos[pos];
}
int snake::judge()
{//蛇撞墙if (snakePos[0].x < 0 || snakePos[0].x>(length-10) || snakePos[0].y < 0 || snakePos[0].y > (width-10) ){return 0;}//蛇咬住自己for (int i = 1; i < snakeSize; i++){if (snakePos[i].x == snakePos[0].x && snakePos[i].y == snakePos[0].y){return 0;}}return 1;
}

实现了蛇,就该写食物了,与蛇类似,先写头文件创建类

食物(头文件)

#ifndef _FOOD_H
#define _FOOD_H
#include <graphics.h>
#include "Mypoint.h"
class food{
public:food();void drawFood();void setFoodPos();int& getFlag();myPoint getFoodPos(); protected:myPoint foodPos;int foodFlag;
};
#endif

食物实现(cpp)

#include "food.h"
#include "window.h"
food::food() {foodPos.x = rand() % (length / 10) * 10; //食物放在以10为倍数的位置防止吃不到foodPos.y = rand() % (width / 10) * 10;foodFlag = 1;                  //食物存在
}
void food::drawFood() {setfillcolor(BLACK);fillrectangle(foodPos.x, foodPos.y, foodPos.x + 10, foodPos.y + 10);
}
void food::setFoodPos() {//食物可能生成在蛇的身上foodPos.x = rand() % (length/10) * 10;   //食物放在以10为倍数的位置防止吃不到foodPos.y = rand() % (width/10) * 10;foodFlag = 1;                    //食物存在
}
int& food::getFlag() {return foodFlag;//改变标记
}
myPoint food::getFoodPos() {return foodPos;
}

这就做完了,最后只需要调用这些函数就行了

主函数(cpp)

#define _CRT_SECURE_NO_WARNINGS   //使用outtextxy()需要这一句
#pragma comment(lib, "winmm.lib") //添加背景音乐需要添加这一句
#include <iostream>
#include <easyx.h>   //outtextxy函数内容
#include <math.h>
#include "Snake.h"   //记住包含进来我们写的头文件
#include "food.h"
#include "window.h"using namespace std;
HWND hwnd = NULL;          //windows 编程的知识,句柄
int Speed = 180;           //蛇的速度
int score = 0;             //分数
int r = 1;             //等级
char grade[100] = { 0 };   //分数
char Rank[10] = { 0 };     //等级
//交互处理,写在这里
void eatFood(snake *pSnake,food *pFood) {//当蛇头坐标和食物坐标相等就可以吃//类外访问保护if (pSnake->getSnakePos(0).x == pFood->getFoodPos().x &&pSnake->getSnakePos(0).y == pFood->getFoodPos().y) {//游戏引擎score += 10;             //增加分数if (score % 50 == 0) {sprintf(Rank, "%d", r++);Speed -= (int)sqrt(300 - score);setbkmode(TRANSPARENT);     //设置模式为透明settextcolor(BLACK);           //设置颜色为黑色outtextxy((length / 2), (width / 2), "UP-等级提升-当前等级:");//输出到指定位置outtextxy((length / 2)+20, (width / 2) + 20, Rank);Sleep(3000);cleardevice();}cleardevice();pSnake->getSnakeSize()++;   //蛇长度加一pFood->getFlag() = 0;        //食物标志变0}
}
void ptscore(int score) {//更新分数sprintf(grade, "%d", score); //将score转换到字符串中setbkmode(TRANSPARENT);        //设置模式为透明settextcolor(RED);         //设置颜色为红色outtextxy((length-40), 20, "分数:");//输出到指定位置outtextxy((length-40), 40, grade);    //输出分数
}
void Up(int rank) {if (score % 50 == 0) {sprintf(Rank, "%d", rank++);Speed -= (int)sqrt(300-score);setbkmode(TRANSPARENT);       //设置模式为透明settextcolor(BLACK);           //设置颜色为黑色outtextxy((length/2),(width/2) , "UP-等级提升");//输出到指定位置outtextxy((length/2), (width/2)+20, Rank);Sleep(3000);cleardevice();}
}
int main()
{hwnd=initgraph(length, width);            //初始化长度和宽度窗口setbkcolor(GREEN);                      //设置背景颜色//cleardevice();PlaySound("C:\\Users\\86155\\Desktop\\学习\\C语言\\VS2019\\贪吃蛇\\背景音乐\\Ari Pulkkinen - Title Theme.wav", NULL, SND_FILENAME | SND_ASYNC | SND_LOOP);snake *pSnake = new snake;food *pFood = new food;pSnake->drawSnake();//画蛇while (1) {cleardevice();if (pFood->getFlag() == 0) {       //当食物没有时//指针指向运算符,访问结构体pFood->setFoodPos();           //设置食物位置}pSnake->drawSnake();                //画蛇if (pSnake->judge()==0) {MessageBox(hwnd, "游戏结束", "Game Over!!!", 0);break;                            //退出主循环}pSnake->moveSnake();             //移动蛇pFood->drawFood();                  //画食物ptscore(score);                        //打印分数eatFood(pSnake, pFood);               //吃食物做判断//只有存在按键才做处理if (_kbhit()) {                     //存在按键返回1,不存在返回0pSnake->keyDown();}Sleep(Speed);                      //速度}closegraph();return 0;
}

上面的playground()函数是用来播放背景音乐的,第一个参数是音乐在电脑的路径,音乐必须是wav格式的

到这里一个贪吃蛇程序就做好了,原理非常简单,难的就是图形化处理很多函数不知道为此我给大家一个学习图形化处理函数的博客地址:点击我

贪吃蛇小程序(功能完善)相关推荐

  1. 软件保障与测试课程实践记录:贪吃蛇小程序

    对象:贪吃蛇小程序 (原代码见 https://blog.csdn.net/leslie5205912/article/details/78980006) 测试过程: 程序改动部分: 1.bug修复 ...

  2. 基于51单片机的贪吃蛇小程序(8*8LED点阵实现)by_jy

    ** 基于51单片机的贪吃蛇小程序(8*8LED点阵实现)by_jy ** 一直很想写一个贪吃蛇的小程序,这两天终于抽空完成了,这里把我的思路分享给大家,仅供参考! 代码如下: 先放段主函数压压惊 v ...

  3. 贪吃蛇小程序·C/C++

    Hello,大家好,这里是"大千小熊",一个又会MMD,又会C++的正派角色.Bilibili同步更新,期待你的关注. 程序效果: 开始游戏的欢迎界面: 字符画(1) 开发商的Lo ...

  4. 使用VS开发桌面程序--贪吃蛇小程序

    为了更好的理解Windows程序的运行机制,笔者当年尝试写了第一个程序--贪吃蛇,逐渐从事公司部分Windows开发工作(当然主业还是嵌入式开发啦) 前期准备: 开发环境:Visual Studio ...

  5. 【笔记】用vs2017 c语言写 贪吃蛇 小游戏

    目录 文章目录 前言 一.贪吃蛇游戏 设计逻辑 二.详细介绍 1.设置界面(界面大小,背景颜色) 2.设置贪吃蛇的身体并显示 3.使之能够移动并能够穿墙 4.添加食物并让蛇吃掉 5.设置背景音乐 完整 ...

  6. C语言实现贪吃蛇小游戏!(超简单详细)详细思路+源码分享

    贪吃蛇(也叫做贪食蛇)游戏是一款休闲益智类游戏,有PC和手机等多平台版本.既简单又耐玩.该游戏通过控制蛇头方向吃蛋,从而使得蛇变得越来越长. 我们的今天的目标就是:用C语言来实现一个贪吃蛇项目,也不用 ...

  7. 贪吃蛇c++程序(A*算法自动追踪功能)

    需要源程序的可以关注评论我 我会给大家邮箱的形式发送~ 目录 一.摘要 二.概述 三.方法论证和比较 1.方案一:深度学习算法 2.方案二:广度优先搜索算法 3.方案三:A*算法 四.理论分析即代码 ...

  8. python100行代码程序-100行python代码,轻松完成贪吃蛇小游戏

    大家小时候都玩过贪吃蛇吧?小编小时候可喜欢拿爸妈的手机玩了,厉害着呢!今天,小编就来用100行代码实现一个简易版的贪吃蛇.在网上,贪吃蛇教程蛮多的,但要安装蛮多库的,而且也不够清晰,今天的代码比较短, ...

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

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

  10. JAVA版贪吃蛇小游戏

    这是一篇关于JAVA的贪吃蛇游戏,源代码的部分在下面正文中介绍,图片和音频的部分都放在百度云盘,需要的自行下载. 文章目录 开发环境 一.下载方法 二.运行效果展示 三.项目结构以及主程序入口 1.项 ...

最新文章

  1. HTML中DIV与SPAN的区别
  2. KubeVela 正式开源:一个高可扩展的云原生应用平台与核心引擎
  3. mysql的partition分区
  4. 【SPOJ2666】QTree4【链分治】
  5. python 学习资源收集汇总
  6. 使用python实现对于chineseocr的API调用
  7. 论文浅尝 | 基于平行新闻的Bootstrapping关系抽取
  8. 设计模式之不简单的工厂模式(一)
  9. 树状数组入门(有被精简的树状数组所震撼到)
  10. 【图文并茂】通过实例理解word2vec之Skip-gram
  11. tf之 MessageFilter 与 tf::MessageFilter理解与应用
  12. 极大似然估计与贝叶斯估计的比较
  13. 通信原理 | 信道特性及其数学模型
  14. 基因组变异类型详解及区分
  15. POJ 2112 Optimal Milking 最优挤奶方案 Floyd算法+二分查找+最大流
  16. Mobile - 小米手机如何开通应用分身?应用多开?
  17. [0893]《兽医外科学》
  18. Android 自定义apk名称
  19. 大数据 MapReduce使用
  20. 网上看到的一个好文章,自勉

热门文章

  1. java时间轮定时器_基于时间轮的定时器
  2. UA PHYS515A 电磁学II 静电学问题8 球坐标系中的Laplace方程与球谐函数
  3. 国内电波钟和石英钟表相比有何优势?
  4. 国内著名高校飞跃手册整理
  5. RPA机器人自动调用U盾方案
  6. ccs加载out文件,TI CCS3.3 out文件转bin文件说明
  7. linux 好看 字体下载,字体下载大宝库:30款好看的免费英文字体
  8. EMD 加 时频分析
  9. 天黑时间跟经度还是纬度有关_经纬度和时间气候
  10. 多因子选股模型python_多因子选股模型在实际中如何构建?