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

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

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

所以我在这里就教大家使用简单的图形化工具——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;}
    推荐阅读
  • 女主渣三观不正的现言小说(女主是妖艳心机女)

    亲们,今天来推一波女主智商在线耍心机,把有权有势的男人玩弄于股掌之间的言情小说。两人强强对抗,最终双双失心相互认输步入婚姻殿堂的故事。男主以为女主是他的木偶,他操纵着她思维与举动。却没想到自己反而被女主诱惑,并因她的一举一动喜怒无常。男主性格好评,又萌又忠诚,女主冷静大气。这本小说男主巨甜,解锁各处喂粉丝狗粮技能。

  • 拼多多上面的待发货是什么意思(拼多多上面的待发货的意思介绍)

    “待发货”是指属于商品处于在待发货状态也就是卖家还没有发货的,还没有寄出快递,目前正在等待卖家发货,拼多多商城您参团并成功后除特殊商品外,商家将在48小时内发货,今天小编就来聊一聊关于拼多多上面的待发货是什么意思?拼多多上面的待发货是什么意思“待发货”是指属于商品处于在待发货状态。如果你是卖家的话,那赶紧安排仓库给买家发货,不然延迟发货或未安时发货,拼多多平台会作出处理的。

  • 丈夫心态变态了怎么办(我老公心里变态很严重该怎么办)

    十分提议你来寻找你的公公婆婆及其亲朋好友们的协助,或是还可以找妇女联合会甚至是110来协商。心态变态你即然早已诉讼离婚,提议你将这种状况往上体现,如果有录像笔这类的直接证据更强,由于这早已牵涉到吓唬及其恶意中伤了。话说堵塞,那么就多方面寻找支援,亲朋好友启动起來,有标准还可以请律师或是资询法律热线。

  • 白鳝和鳗鱼的区别 白鳝和鳗鱼是一种鱼吗

    又称鳝,是一种外观类似长条蛇形的鱼类,具有鱼的基本特征。鳗鱼属鱼类,似蛇,但无鳞,一般产于咸淡水交界海域。鳗是富含钙质的水产品,经常食用,能使血钙值有所增加,使身体强壮。鳗的肝脏含有丰富的维生素A,是夜盲人的优良食品。

  • 万物皆可原创(原创万物复苏)

    大美植物园,一处一景点。姹紫嫣红齐出梢,万物都争俏。顽童三两堆,情侣四五对。花前草边留娇影,同是好心情。春雨缠绵呢喃,欲把万物乐翻。杨柳沐浴毕,娇媚靓姿舒展。惊叹,惊叹,恰似绿洲一片。杨柳舞蹁跹,碧水映苍穹。漫步岸堤何如是?

  • 2022青海省成人高考报名时间(2022青海省成人高考报名时间及考试)

    凡隐瞒或谎报旅居史、接触史、健康状况等疫情防控重点信息的承担相应法律责任。

  • 王者荣耀出装设置在哪里(出装设置修改主要有三个步骤)

    接下来我们就一起去了解一下吧!王者荣耀出装设置在哪里在主界面点击“局内消息”,就可以给英雄设置调整装备了。打开局内消息,点击更换,在英雄头像下面点击更换,可以选择想要改的英雄。确定英雄后,点击修改,装备方案变成了可编辑模式,可以删除装备,再填入想要装备进行替换。

  • 有你才有家主题曲(有你才有家主题曲是什么)

    下面希望有你要的答案,我们一起来看看吧!有你才有家主题曲《有你才有家》主题曲:《风中的柳丁》,演唱者:张赫宣。张赫宣声线中特有的沧桑感勾人心弦,起伏的声线游刃有余的把控着歌曲整体的情感走向,如一缕时光中的暖流。柳丁鲜艳的颜色,象征着甜蜜的恋人。树梢随风飘动的柳丁,也体现出了歌曲特有的年代感。

  • 饥荒手游最近新版(丧尸题材的饥荒你玩过吗)

    丧尸题材的饥荒你玩过吗往上看,关注我( ̄︶ ̄)↗喜欢生存类游戏的玩家老爷们一定对《饥荒》非常熟悉吧,距离《饥荒》PC版上市也已经过去4年多了,热度依然不减,足以见得生存类游戏的独特魅力如果将《饥荒》换一个舞台背景,你还会感。

  • 被关到300多层到最后出狱的故事(与昔日狱友干一票大的)

    经审查查明,犯罪嫌疑人王某成曾在1996年因犯盗窃罪被判刑,于2012年刑满释放。两人经事先预谋后,在绍兴某地对被害人陈某实施抢劫,王某成对其涉嫌的犯罪事实供认不讳。8月5日,拱墅区人民检察院以抢劫罪对犯罪嫌疑人王某成提起公诉。检察官说法犯罪嫌疑人王某成的行为已触犯《中华人民共和国刑法》第二百六十三条、第二十五条,涉嫌抢劫罪,系共同犯罪。