C语言与C++基础编写贪吃蛇项目1

C语言与C++基础编写贪吃蛇项目1
第一阶段:
简单的移动的贪吃蛇编写。
小白编写,勿喷。
一.总体项目功能:
1.添加背景音乐或者动作音效
2.有欢迎界面,游戏选项等界面
3.地图范围内有障碍物,可随机生成食物,随机障碍物
4.蛇可以在地图范围内随意移动 (添加了蛇的抑制反方向功能)
5.游戏可暂停,可中途退出
6.具有简单的计分功能
7.撞上障碍物后会结束本局游戏 (自己撞上自己也会结束游戏)
8. 判断碰撞,区分边界,障碍物以及食物
9.有专门的自定义地图编辑功能,可以让玩家自定义地图
10.游戏状态可存档,读档 (单人游戏,双人游戏)
11.多种食物:◆(紫色)为普通食物:分数上涨,蛇身加一。(并且吃到一定数量,也会增长速度)
●(黄色) 为有毒食物:分数虽然会上涨,但蛇身减一。
★(红色)为稀有食物,分数上涨更多,蛇身增长,速度增加。
12. 双人游戏:当一方撞上另一方时或者,一方撞墙时,或者一方撞上自己的蛇身时,判定对方获胜。
13. 设置冰面,草坪:
冰面:当通过冰面时,蛇会突然加速一段距离。
草坪:当蛇通过草坪时,在草坪的部分会转化为草坪,达到视觉隐身的效果。
二.项目重要函数:
2.1 在控制台上定点移动光标功能(隐藏光标):
在这里插入图片描述
该函数可以初步用于在编写贪吃蛇界面时,将界面选项居中使其达到美观的效果。
2.2 在控制台上定点绘制不同颜色符号函数(隐藏光标):
在这里插入图片描述
该函数用于在控制台上对指定坐标进行指定绘制指定颜色的特殊符号,后续用于绘制食物,地图,以及蛇的形体。
其中:GetStdHandle该函数用于取得指定的标准,设备的句柄(标准输入,标准输出或标准错误)。
而STD_OUTPUT_HANDLE则为标准输出句柄。
SetConsoleCursorPosition为设置控制台光标位置函数,由于控制台坐标,x轴与y轴的坐标长度为1:2,因此在设置时,应该主动将x*2,当然不这样的话,后续画出来的贪吃蛇会在y轴上行走的时候的形体比在x轴上行走的形体长一倍(你要这样的话,也可以当做是贪吃蛇的特色。。。)
2.3 无回显接受用户键盘输入(用于后续设置贪吃蛇的操作函数)
在这里插入图片描述

包含头文件<conio.h>
在这里:_getch()为无回显接收输入。_kbhit()为检查键盘输入的控制台。(这里也不再细说,有兴趣可以在vs中F1查看一下)
三.贪吃蛇构架
当重要函数了解之后,我们就可以对其进行贪吃蛇蛇体的搭建以及对其移动函数进行编写:
对蛇,我们采用类的思想,将其整体放在一个类中(当然,操作函数可以单拎出来,我没有这样做,因为我傻。。。。)
3.1 初始化数据的构建

在这里插入图片描述

以上是蛇类构建时需要设置的基本参数和函数,当然草坪,冰面规则函数以及相关参数是根据自己兴趣进行编写的(你也可以不用添加)。
其中要说明的是:vector是一种容器,你也可以理解成一种可以无限延伸的数组,它与数组的区别就是,他可以随着程序的运行,主动的去改变这个容器的容量。(具体如何操作,可以在csdn上搜索vector,我感觉讲的蛮详细的)。
其次,COORD是一个结构体,它包含了x坐标与y坐标,在这里使用COORD正好合适,因为我们需要一个点的坐标才能对其进行绘制,当然你单独设置变量也可以但是太麻烦。
3.2 贪吃蛇形体的构建:
3.2.1贪吃蛇初始化函数
在这里插入图片描述

这里就要用到刚刚说的Writechar()函数对指定位置进行指定绘制。
这里的push_back,以及size()都是vector所包含的函数,具体意思不再解释,同上去csdn上搜一下vector就可以了。
3.2.2贪吃蛇移动控制函数
说到贪吃蛇的移动逻辑以及移动规则,首先我们要建立一个思路,他并不是真正的在移动,也就是说他并不一直是最开始的那几个蛇身在移动。我们要换一个思路:当贪吃蛇向某个方向移动一格时,他的蛇头增加了一个,而蛇尾则被删除了,也就是说,它在不停的增加,删除。就如下图:
在这里插入图片描述

具体呢,蛇的移动原理就是这样,然后就是函数的编写,将原理放在一个循环里,这样蛇就能动起来了。
函数如下:这里用到了Sleep()函数,这个函数的功能是控制循环一次的延时,也就是我们所看到的贪吃蛇移动的速度,数值越小,速度越快。当然,在这里,对于操作函数的编写,我用了一个CDIr去接受无回显输入,为的就是初始化蛇的方向,不可能贪吃蛇一开始就在原地不动吧,所以我给他初始化了一个默认方向。对于case’ ‘的用处,则是按下空格键就暂停,它的原理就是,当按下空格键后,会无回显接受一个用户输入,当输入一个字符后,再继续接下来的循环。
当然,这里我用了一个抑制蛇的反方向操作,如果贪吃蛇反方向走,应该会很不合理吧。逻辑也就不细盘了,你们看看应该就会懂吧。QAQ。(就是设置一个抑制方向的参数,然后与你的输入方向想对比。)
在这里插入图片描述
在这里插入图片描述

做到这里,就可以构建出一个简单的贪吃蛇了,虽然蛇的身体有点短。。。但是,好歹做出来了。大致图像就是这样,当然如果你的蛇头想和蛇尾设置的不一样,你可以在循环输出 也就是这,加一个判定条件,也就如下图:(当然,我就是换了个颜色,哈哈,小编偷懒了)
在这里插入图片描述

接下来就是贪吃蛇最原始的运行图啦,先运行下看看成就感:
下面是主函数和运行效果:

在这里插入图片描述
在这里插入图片描述

啥也没有,但是你可以控制这条2个长度的蛇到处移动了。
哦对了,在这里,我建了个功能文件Function.h,用于存放Writechar()函数和接受键盘输入函数的,这样方便调用。另外,对于Header.h头文件则是用于等等,注意哈,对于一些函数要用的头文件,我会放在最后,当然你也可以F1搜寻下下。
以上就是最简单的蛇移动程序啦,后续,我会编写地图类,以及吃到食物增加蛇的长度的函数,还有多功能食物等等。当然还有关键的存储档函数,以及单线程双蛇(感觉这个就比较简单,你单蛇会了,这个就是一个简单的复制拷贝,复制两份,再改下操作函数就行了。)

Header.h如下:(就是一个单纯的头文件,主要以后调用起来好看!!!!)
在这里插入图片描述

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在DevC++编写C语言贪吃蛇的示例代码如下: ```c #include <stdio.h> #include <conio.h> #include <windows.h> #define WIDTH 20 #define HEIGHT 20 int score; int gameover; int x, y, fruitX, fruitY, flag; int tailX[100], tailY[100]; int nTail; void Setup() { gameover = 0; x = WIDTH / 2; y = HEIGHT / 2; fruitX = rand() % WIDTH; fruitY = rand() % HEIGHT; score = 0; } void Draw() { int i, j, k; system("cls"); for (i = 0; i < WIDTH + 2; i++) printf("#"); printf("\n"); for (i = 0; i < HEIGHT; i++) { for (j = 0; j < WIDTH; j++) { if (j == 0) printf("#"); if (i == y && j == x) printf("O"); else if (i == fruitY && j == fruitX) printf("F"); else { int printTail = 0; for (k = 0; k < nTail; k++) { if (tailX[k] == j && tailY[k] == i) { printf("o"); printTail = 1; } } if (!printTail) printf(" "); } if (j == WIDTH - 1) printf("#"); } printf("\n"); } for (i = 0; i < WIDTH + 2; i++) printf("#"); printf("\n"); printf("Score: %d\n", score); printf("Press X to quit the game"); } void Input() { if (_kbhit()) { switch (_getch()) { case 'a': flag = 1; break; case 'd': flag = 2; break; case 'w': flag = 3; break; case 's': flag = 4; break; case 'x': gameover = 1; break; } } } void Logic() { int i; int prevX = tailX[0]; int prevY = tailY[0]; int prev2X, prev2Y; tailX[0] = x; tailY[0] = y; for (i = 1; i < nTail; i++) { prev2X = tailX[i]; prev2Y = tailY[i]; tailX[i] = prevX; tailY[i] = prevY; prevX = prev2X; prevY = prev2Y; } switch (flag) { case 1: x--; break; case 2: x++; break; case 3: y--; break; case 4: y++; break; } if (x < 0 || x >= WIDTH || y < 0 || y >= HEIGHT) gameover = 1; for (i = 0; i < nTail; i++) { if (tailX[i] == x && tailY[i] == y) gameover = 1; } if (x == fruitX && y == fruitY) { score += 10; fruitX = rand() % WIDTH; fruitY = rand() % HEIGHT; nTail++; } } int main() { char c; do { Setup(); while (!gameover) { Draw(); Input(); Logic(); Sleep(10); } printf("Game over!\n"); printf("Do you want to play again? (Y/N) "); c = getchar(); } while (c == 'y' || c == 'Y'); return 0; } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值