百摩网
当前位置: 首页 生活百科

贪吃蛇c++代码详解(最浪漫的编程代码)

时间:2023-06-01 作者: 小编 阅读量: 11 栏目名: 生活百科

所以我在这里就教大家使用简单的图形化工具——easyx图形界面库,做一些好玩的,超丝滑的贪吃蛇2背景知识开发贪吃蛇小游戏,让初学者也能感受界面的魅力。3错误及决绝方案此程序使用Vs209+easyx开发。刚开始学习C语言或者没接触过easyx的伙伴,拿到代码之后肯定有很多的错误,这就是所谓的给了源码也不能运行,所以配置环境和查看报错也是作为编程学习者,必须要掌握的技能。

1 贪吃蛇效果展示

前言:C语言初学者都是在控制台上开发一些小游戏什么,由于没有界面(比如图片、音乐,不能做出拥有自己风格的程序)学起来比较乏味,很难坚持下去。所以我在这里就教大家使用简单的图形化工具——easyx图形界面库,做一些好玩的,超丝滑的贪吃蛇

2 背景知识

开发贪吃蛇小游戏,让初学者也能感受界面的魅力。做的不是很完善,希望大家可以自己动手完善它表白程序设计原理:

第一步,我们需要一张地图,图形库初始化的窗口是自带坐标的(左上角为0,0)。

第二步,我们需要一条蛇,这条蛇由蛇头和蛇身组成(这里我们初始化三节蛇)。

第三步,我们需要食物,并且在蛇吃掉食物之后将蛇的身体变长,而且重新生成一个食物。

第四步,蛇需要移动,这应该是最难实现的(实现蛇身坐标的传值,除蛇头以外,每一节蛇的坐标都是上节蛇的上一次运动之前的坐标,有点绕~)。

第五步,我们需要能用键盘控制蛇的运动方向,这个会和蛇的移动有一些联系。

第六步,蛇撞到墙或者撞到自己的身体就会死亡(判断坐标是否重合就可以)。

3 错误及决绝方案

此程序使用Vs209+easyx开发。刚开始学习C语言或者没接触过easyx的伙伴,拿到代码之后肯定有很多的错误,这就是所谓的给了源码也不能运行,所以配置环境和查看报错也是作为编程学习者,必须要掌握的技能。相关知识的基础讲解可观看专栏教程:

4. 话不多说上代码

4.1 头文件snake.h

我们把一些函数的声明,和结构体的定义放在头文件中:

#ifndef _SNAKE_H_#define _SNAKE_H_#include<graphics.h>#include<conio.h>#include<stdio.h>#include<time.h>#define WIN_WIDTH 640 //窗口宽高#define WIN_HEIGHT 480#define MAX_SNAKE 10000 //蛇的最大节数enum DIR //蛇的方向{ UP, DOWN, LEFT, RIGHT,};//每一节蛇的位置信息typedef struct _Pos{ int x; int y; DWORD color;}Pos;typedef struct Snake_tlg //蛇的结构体{ int num; int dir;//蛇的方向 int score;//分数 int size;//蛇的宽度和高度 int speed;//移动速度 Pos coor[MAX_SNAKE];}Snake;typedef struct Food_tlg{ int x; int y; int r; int flag; DWORD color;}Food;//画眼睛函数void DrawEye(int x, int y);//初始化数据void GameInit();//游戏的绘制void GameDraw();//蛇的移动void SnakeMove();//控制方向void KeyControl();//吃食物void EatFood();//暂停游戏 按空格暂停和继续void stop();//定时器bool Timer(clock_t ms);#endif

4.2 实现文件snake.cpp

OK,头文件部分完毕,接下来进入snake.cpp代码编写环节。

#include"snake.h"Snake snake;Food food;//画眼睛函数void DrawEye(int x, int y){ setfillcolor(WHITE); solidcircle(x, y, 3); setfillcolor(BLACK); solidcircle(x, y, 2);}void GameInit(){ srand(GetTickCount()); //初始化蛇 snake.num = 10; snake.dir = RIGHT; snake.score = 0; snake.size = 10; snake.speed = 1; snake.coor[0].x = 20; snake.coor[0].y = 10; for (int i = 0; i < snake.num; i++) {snake.coor[i].color = GREEN; } //初始化食物 food.x = rand() % (WIN_WIDTH - 10); food.y = rand() % (WIN_HEIGHT - 10); food.flag = 1; food.r = rand() % 3 + 2; food.color = RGB(rand() % 256, rand() % 256, rand() % 256);}void GameDraw(){ //设置背景颜色 setbkcolor(RGB(191, 215, 215)); cleardevice(); //画蛇for (int i = 0; i < snake.num; i++) {setfillcolor(snake.coor[i].color);solidcircle(snake.coor[i].x, snake.coor[i].y, snake.size / 2); } //画眼睛 int eyewidth = 5; switch (snake.dir) { case UP: case DOWN:DrawEye(snake.coor[0].x - eyewidth, snake.coor[0].y);DrawEye(snake.coor[0].x + eyewidth, snake.coor[0].y);break; case LEFT: case RIGHT:DrawEye(snake.coor[0].x, snake.coor[0].y - eyewidth);DrawEye(snake.coor[0].x, snake.coor[0].y + eyewidth);break; } //画食物 if (food.flag == 1) {setfillcolor(food.color);solidcircle(food.x, food.y, food.r); } //显示分数 char temp[20] = "; sprintf(temp, "分数:%d", snake.score); setbkmode(TRANSPARENT); outtextxy(20, 20, temp);}void SnakeMove(){ for (int i = snake.num - 1; i > 0; i--)//从最后一节蛇开始,每一节蛇都等于前一节蛇的上一次坐标 {snake.coor[i].x = snake.coor[i - 1].x;snake.coor[i].y = snake.coor[i - 1].y; } //根据方向移动 switch (snake.dir) { case UP:snake.coor[0].y -= snake.speed;if (snake.coor[0].y + 10 <= 0){snake.coor[0].y = WIN_HEIGHT;}break; case DOWN:snake.coor[0].y += snake.speed;if (snake.coor[0].y - 10 >= WIN_HEIGHT){snake.coor[0].y = 0;}break; case LEFT:snake.coor[0].x -= snake.speed;if (snake.coor[0].x + 10 <= 0){snake.coor[0].x = WIN_WIDTH;}break; case RIGHT:snake.coor[0].x += snake.speed;if (snake.coor[0].x - 10 >= WIN_WIDTH){snake.coor[0].x = 0;}break; }}void KeyControl(){ //使用win32API获取键盘消息 if (GetAsyncKeyState(VK_UP) && snake.dir != DOWN) {snake.dir = UP; } if (GetAsyncKeyState(VK_DOWN) && snake.dir != UP) {snake.dir = DOWN; } if (GetAsyncKeyState(VK_LEFT) && snake.dir != RIGHT) {snake.dir = LEFT; } if (GetAsyncKeyState(VK_RIGHT) && snake.dir != LEFT) {snake.dir = RIGHT; } //按A键加速,不按回复初始状态 if (GetAsyncKeyState('A') && snake.speed == 1) {snake.speed = 5; } else if (snake.speed == 5) {snake.speed = 1; }}void EatFood(){ if (snake.coor[0].x >= food.x - food.r && snake.coor[0].x <= food.x + food.r &&snake.coor[0].y >= food.y - food.r && snake.coor[0].y <= food.y + food.r &&food.flag == 1) {snake.num += 5;snake.score += 10;food.flag = 0;//每一节的颜色都要初始化for (int i = snake.num - 5; i < snake.num; i++){snake.coor[i].color = food.color;} } if (food.flag == 0) {food.x = rand() % (WIN_WIDTH - 10);food.y = rand() % (WIN_HEIGHT - 10);food.flag = 1;food.r = rand() % 10 + 3;food.color = RGB(rand() % 256, rand() % 256, rand() % 256); }}void stop(){ if (_kbhit() && _getch() == 32) {while (getch() != 32); }}bool Timer(clock_t ms){ static clock_t t = clock(); if (clock() - t > ms) {t = clock();return true; } return false;}

4.3 测试文件main.cpp

最后我们一起来测试一下吧

#include"snake.h"int main(){ //创建一个图形窗口 initgraph(WIN_WIDTH, WIN_HEIGHT); GameInit(); BeginBatchDraw();//① while (1) {if(Timer(10)){SnakeMove();}GameDraw();FlushBatchDraw();//②EatFood();KeyControl();stop(); } EndBatchDraw();//③①②③为双缓冲绘图防止闪屏代码 //关闭图形窗口 closegraph(); return 0;}
    推荐阅读
  • 地骷髅的功效与作用及药用价值 地骷颅作用

    地骷髅还能止咳化痰,它对人类的肺热咳嗽和气管炎也有出色治疗作用,治疗时可以把它煎汤以后直接服用。

  • 为什么会有黑眼圈怎么去掉(有黑眼圈是代表睡眠不足吗)

    因为和眼睛和鼻泪管相通,如果鼻子细菌的感染引起过敏性鼻炎,通过鼻泪管蔓延到眼睛,引起眼睛发红,流泪,严重还会引起眼袋。一些老年人由于细胞的活动能力下降,导致皮肤衰老松弛,有些皮肤组织聚集在一起,会造成肤色比较深的现象。少吃高油,高盐,辛辣生冷的有刺激性的食物。

  • 黄宗泽未来感情分析(黄宗泽自曝不着急结婚的原因)

    日前胡杏儿官宣怀有三胎的消息,立即引起了很多人的关注,四年抱仨,这速度真的是让人佩服。早前在内地播出的剧集《非凡三侠》在近日于翡翠台热播,作为主角之一的黄宗泽再次受到关注。12月28号据港媒消息称,日前黄宗泽接受了采访,除了谈及到拍摄《非凡三侠》的感受之外,亦是罕有剖析了自己的个人感情。不过今年因为疫情致使他的生蚝店出现了亏损。不过黄宗泽却说到自己并不急于成家立室,但始终相信缘分。

  • 义不容辞的辞什么意思(义不容辞造句)

    以下内容希望对你有帮助!义不容辞的辞什么意思义不容辞的辞释义:躲避,推托的意思。义不容辞,汉语成语,读音为yìbùróngcí,意思是指道义上不允许推辞,出自《醒世恒言》。每次同学有困难请求他帮忙的时候,他总是不假思索的答应了,义不容辞。兴国安邦是我们每个中国人义不容辞的责任。毕竟大家朋友一场,这样的小忙我肯定也是义不容辞的。

  • 辣椒炒蛋怎么做好吃详细教程(学会辣椒炒蛋解锁正宗味儿)

    学会辣椒炒蛋解锁正宗味儿准备好辣椒、鸡蛋辣椒切小段、葱切葱花、大蒜切末、姜切末油下锅,放入姜末、大蒜末、翻炒至香炒香姜蒜末,放入辣椒小段,适量的盐、鸡精、翻炒均匀辣椒翻炒十秒左右,放入葱花、就可以打入鸡蛋(鸡蛋不需要提前打散。

  • 刚刚开始戴牙套要戴什么(需要戴牙套或者正在戴牙套的你)

    ③牙刷是清洁第一道防护,间隙刷是第二道防护,那么第三道防护就是电动牙刷,因为有一些细小的,肉眼无法看到的残渣留存在牙齿的表面和间隙,这就需要用到电动牙刷。电动牙刷通过声波振动,把牙齿间隙的残渣清理出来。另外,电动牙刷部分起到洗牙功能,如果牙龈出现肿痛,甚至导致出血,那么在使用电动牙刷按摩牙龈之后,可以起到缓解肿痛或出血的效果。

  • 北京好玩的水上乐园排名前十(北京十大水上乐园全攻略)

    每到夏天,最拉动公园人气的非水上世界莫属,这难得的露天戏水乐园每年仅有3个月的开放时间,常引得不少市民大老远赶来。朝阳公园水上乐园北京城内寸土寸金,可以找到的戏水场所不但有限也小得可怜。朝阳公园2000平方米的儿童戏水池和两个蘑菇池及大面积的休闲区,成为北京市内最大的露天戏水乐园,实在是难能可贵!游乐设施有大喇叭、大浪摆、滑板冲浪、水上过山车,面积达1500平米、包含数十项儿童戏水设施的儿童超炫戏水区。

  • 新鲜松茸可以放冰箱冷冻吗(新鲜松茸能放冰箱冷冻吗)

    做法:1、将松茸菌洗干净,用300毫升水浸泡半小时。

  • 树皮的主要成分是纤维素吗(树皮的主要成分是否是纤维素的解析)

    跟着小编一起来看一看吧!树皮的主要成分是纤维素吗树皮的主要成分是纤维素。还有半纤维素以及木质素,可能还有少量的果胶和蜡质。树皮,广义的概念指茎(老树干)维管形成层以外的所有组织,是树干外围的保护结构,即木材采伐或加工生产时能从树干上剥下来的树皮。由内到外包括韧皮部、皮层和多次形成累积的周皮以及木栓层以外的一切死组织。

  • 孩子最失败的教育方式(最失败的教育孩子不努力)

    孩子最失败的教育方式?以下内容希望对你有帮助!孩子最失败的教育方式暑期孩子们撒欢放飞自我了,都说在教育孩子方面”十个成功的妈妈不如一个成功的爸爸”,今天我目睹了一位爸爸对孩子的教育。你放假回来这这是第几次惹她哭了,你还知道吗?只有好好学习你脑袋里的知识就是你的价值。孩子听了,沉默不语不再顶嘴,不停的点头赞成爸爸说的道理,我们为这位爸爸这番话点赞。