c++实现超简单的贪吃蛇游戏实例介绍
设计思路
建议先将代码复制下来跑一遍再来看思路!!!
通俗易懂,请仔细看。
值得注意的是我给出的代码没有加墙体,如有需要自己添加。
也没有难度设计,同上。
地图大小(这里设计了墙体,代码中未实现)
设置一个整形数组map,其大小为1600,对应着地图的大小为1600,并初始化数组,令数组中的值全为0,0代表空地。
我们通过设定窗口的宽度为80,打印时每个map[i] 所对应的字符占两格位置即可实现每打印40个map[i]就换行的效果。
这样地图的长宽即为40x40.
2.墙体
墙体在地图的最外围,意味着当map[i]中的i为地图边界时,对应着墙体,使用if语句判断i的值,符合位于边界的条件打印墙体即可。
通过地图的大小我们了解到,当0<=i<=39时,map[i]对应着第一行,也就是地图的边界 ,同样的,地图左边界的i满足i%40==0,右边界的i满足(i+1)%40==0,,同理下边界。将上述符合的条件放入if语句中即可实现打印墙体的功能。
3.蛇
蛇是如何移动呢?并且保持一定长度。其实我们只需要一个蛇头就可以办到,因为蛇身只是旧蛇头的位置,所以我们一直只需更新蛇头坐标就能达到目的,如何保持长度呢?,因为我们更新新的蛇头,去掉旧的蛇尾是很显然的事了,在地图大小中我们提到,map[i] 如果等于0,就是空地,让蛇尾的值变成0就行了,因为蛇一直在移动,所以当前蛇尾的前一节蛇身会是下一刻的蛇尾,很自然的联想到了以1为公差的一组数1234,分别对应蛇身的值,如果我们想使蛇连续的动起来,新蛇头的值为4,在加入新蛇头前将蛇尾变为0,蛇尾前一节蛇身变为此刻蛇尾对应的值为1,使蛇整体减去1,此时的蛇的值为0123,加入蛇头4,01234,此刻原蛇尾变为空地,原蛇尾前一截蛇身变为此刻的蛇尾。贪吃蛇的持续移动便完成了。
4.食物
很自然的,在上面3节map[i]为0,正整数时都有了对应的含义,食物我们便使其 map[i] =-1.因为贪吃蛇游戏中食物的生成要求是随机的,但我们的c++课程中并没有提到,便在网上查找到了随机数生成的函数srand(上面的设定窗口大小也是如此),生成的随机数i可能超出数组大小,对i取1600的余数即可。食物只能生成在空地上,当map[i]等于0时,令map[i]=-1。新的食物便生成了。容易忽略的一点是,我们并没有给墙体map[i]的值,也就是所墙体的值在数组中对应的是空地,只不过通过i的位置来判断是否为墙体,在这里,同样也要加入墙体的位置到判断条件,以免食物生成在墙体内。新的食物在旧的食物被吃掉后立即生成。
5.死亡判定
我们通过新蛇头所对应的值来判断蛇是否死亡
(1)map[headx+heady*40]>0, 由3我们可以知道,蛇身所对应的map [i] 值大于0,新蛇头所对应的map值大于0也就意味着新蛇头在蛇身生成,按
照贪吃蛇的规则,游戏结束
(2)(headx+heady*40)满足墙体的打印条件时,意味着蛇头在墙体生成,游戏结束
实现代码
#include<bits/stdc++.h> #include<windows.h> #include<iostream> #include<conio.h> int main() { int headx = 0, heady = 0, len = 5, map[1600] = { 0 }, i = 0; char c = 'd', cl = 'd',body=3,head=2; /*随机数生成*/ srand((unsigned)time(0)); system("mode con:cols=80 lines=40"); map[rand() % 1600] = -1; while (true) { if (_kbhit())//判断键盘输入 { cl =_getch(); if (cl < 97) cl += 32; if (cl == 'a' && c != 'd' || cl == 'd' && c != 'a' ||cl == 'w' && c != 's' || cl == 's' && c != 'w')//判断输入方向是否与原方向冲突 c = cl; } /*改变蛇头坐标*/ if (c == 'a') headx--; if (c == 'd') headx++; if (c == 'w') heady--; if (c == 's') heady++; /*判断蛇头是否撞墙*/ if(headx==-1||headx==40||heady==-1||heady==40) break; /*判断蛇头是否为空地*/ if (map[heady * 40 + headx]) { if (map[heady * 40+headx] > 0) break; /*吃到食物,蛇身+1,并在空地生成新的食物*/ if (map[heady * 40 + headx] < 0) { len++; for (i = rand() % 1600; map[i] || !(map[i] = -1); i = rand() % 1600); } } /*是空地则蛇身值整体减1,蛇尾由1减为0变成空地*/ else for (i = 0; i < 1600; i++) { if (map[i] > 0) map[i] -= 1; } system("cls"); /*新蛇头赋值,遍历map,值大于0为蛇身,等于0为空地,小于0为食物*/ for (map[heady * 40 + headx] = len, i = 0; i < 1600; i++) { if (map[i] == len) { printf("%2d", map[i]); continue; } if (map[i] > 0) printf("%2d", map[i]); if (map[i] == 0) printf("%2d", map[i]); if (map[i] == -1) printf("%2d", map[i]);//打印 } Sleep(100); } }
效果
如果你仔细阅读了代码,将数字替换成你想要的符号(占两个字符大小如果是一个字符要加一个空格)是很简单的事情
如果你想要游戏循环进行,也是很容易办到的。
这只是个demo,你可以根据自己的需要任意的改写。
上一篇:C语言学好递归看这一篇就够了
栏 目:C代码
下一篇:C++实现的多重继承功能简单示例
本文标题:c++实现超简单的贪吃蛇游戏实例介绍
本文地址:http://www.codeinn.net/misctech/206056.html