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

1蛇形效果秀C语言初学者总是在主机上开发小游戏。因为没有界面(比如图片,音乐,他们也不会自己做程序),学起来很枯燥,很难坚持。所以我在这里教你用一个简单的图形工具——EasyX图形界面库来做一些好玩的,超级丝滑的蛇。2背景知识开发一个贪吃蛇游戏,让新手感受一下界面的...

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 ***0 //窗口宽高#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

好了,头文件部分完成了,接下来我们就去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测试文件***in.cpp

最后,我们一起来测试一下。

#include"snake.h"int ***in(){ //创建一个图形窗口 initgraph(WIN_WIDTH, WIN_HEIGHT); GameInit(); BeginBatchDraw();//① while (1) { if(Timer(10)) { SnakeMove(); } GameDraw(); FlushBatchDraw();//② EatFood(); KeyControl(); stop(); } EndBatchDraw();//③ ①②③为双缓冲绘图防止闪屏代码 //关闭图形窗口 closegraph(); return 0;}

本文来自傲娇小伙子投稿,不代表舒华文档立场,如若转载,请注明出处:https://www.chinashuhua.cn/24/558726.html

打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
() 0
上一篇 05-22
下一篇 05-22

相关推荐

  • 网页列表设计代码 网页制作经验分享

    有序列表经过前面对表格和形式的学习,再来学习列表是非常简单易懂的。学习是建立知识体系的过程。没有系统的学习再多的知识,也会支离破碎,也很难形成技能或者深度理解。所以,如果你是零基础的初学者,是第一次看我的教程。如果时间允许,请从目录中寻找第一个,循序渐进地

    2023-07-25 09:07:01
    767 0
  • steam错误代码-102解决方案

    改host就可以了 百度“steam118错误修复工具”选第一个3DM下载就可以了。建议你把电脑做成w10系统,不一定苹果电脑就要用苹果系统啊,w10还更好用。你是打开商城或者市场吧网站被污染了,你需要挂加速器,或者百度steam网站被污染,然后找到一个小程序,才能打开网站。1在桌面

    2023-07-23 04:39:01
    662 0
  • eclipse平台简介 java新手代码大全

    Eclipse workspace多平台使用u盘的解决方案(workroom空);在过去的Java编程中,Eclipse占据了绝大多数的位置。我们知道Java是一种跨平台的编程语言,所以我们有可能在不同的平台上编写Java代码。我们在学校机房的一个设备上写好Java代码后,回到宿舍还需要继续写。这时候我们

    2023-07-23 03:20:01
    502 0
  • html居中代码怎么写 网页制作文字居中代码

    这个问题好像是面试必问的!以前会时不时提问,给基本的分题。1.配置盒子的宽度和高度是已知的,位置:绝对;左:50%;top:50%;左边距:-自身宽度的一半;***rgin-top:-自身高度的一半;2.表格单元格布局父显示:表格单元;垂直对齐:居中;子边距:0自动;3.定位+改造;适用于宽度

    2023-07-23 03:11:01
    504 0

评论列表

联系我们

在线咨询: QQ交谈

邮件:admin@qq.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信