寒假集训,感觉今天闲来无事,就想写个贪吃蛇玩,花了一下午的时间写出来这个玩意算是能看了。
我用的是双端队列,感觉比其它方法好写一点(个人认为)。
思路:
第一步先搞个地图,只要有了地图这个蛇才能跑起来,才能去吃东西嘛
第二步把蛇和第一颗食物用随机数生成出来。蛇的关节我用‘*’表示,食物用‘o’来表示
第三步现在肯定就要让这个蛇在地图上面跑起来了晒,所以我们现在用自定义函数update来更新这条蛇
最后一步肯定就是输出了,每次输出的时候都要把屏幕更新一遍,这样就会出现蛇在往前跑的感觉了
下面是代码
#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include<windows.h>
#include<deque>
#include<ctime>
#include<algorithm>
#include<string.h>
using namespace std;
char Map[100][100];
int k1, k2,state=-1;//k1,k2是食物的坐标,state是当前蛇的移动方向
deque<pair<int, int>>s;
int xy[4][2] = { {-1,0},{0,1},{1,0},{0,-1} };
int Rand(int L, int R)
{
return rand() % (L + R + 1) + 1;
}
void init_map() {
srand((unsigned)time(NULL));
for (int i = 0; i < 50; i++)
Map[0][i] = '#',Map[24][i]='#';
for (int i = 0; i < 25; i++)
Map[i][0] = '#', Map[i][49] = '#';
k1 = Rand(1, 20), k2 = Rand(1, 40);
int k3, k4;
while (1) {
k3 = Rand(5, 15), k4 = Rand(5, 40);
if (k3 != k1 && k4 != k2) {
break;
}
}
//初始化一条小蛇
int k = Rand(0, 3);
switch (k) {
case 0:s.push_back(make_pair(k3, k4)); s.push_back(make_pair(k3 + 1, k4)); state = 0; break;//上
case 1:s.push_back(make_pair(k3, k4)); s.push_back(make_pair(k3, k4 - 1)); state = 1; break;//右
case 2:s.push_back(make_pair(k3, k4)); s.push_back(make_pair(k3 - 1, k4)); state = 2; break;//下
case 3:s.push_back(make_pair(k3, k4)); s.push_back(make_pair(k3, k4 + 1)); state = 3; break;//左
}
}
void print() {
system("Cls");//刷新屏幕
for (int i = 1; i < 24; i++) {
for (int j = 1; j < 49; j++)
Map[i][j] = ' ';
}
Map[k1][k2] = 'o';
for (int i = 0; i < s.size(); i++) {
Map[s.at(i).first][s.at(i).second] = '*';
}//更新地图
for (int i = 0; i < 25; i++) {
puts(Map[i]);
}
}
void update() {
int x = s.at(0).first + xy[state][0];
int y = s.at(0).second + xy[state][1];
if(Map[x][y]=='#'||Map[x][y]=='*')
{
cout<<"Game over!"<<endl;
exit(0);
}//撞墙或者撞自己小蛇就死掉
s.push_front(make_pair(x, y));
if (Map[x][y] == 'o') {
s.push_front(make_pair(x + xy[state][0], y + xy[state][1]));
k1 = Rand(1, 20), k2 = Rand(1, 40);
}
s.pop_back();
}
int main()
{
init_map(); //地图
while (1)
{
print();
int t = 10;
while (t--) {
if (GetKeyState('W') < 0 && state!=2)
state = 0;
if (GetKeyState('D') < 0 && state!=3)
state = 1;
if (GetKeyState('S') < 0 && state!=0)
state = 2;
if (GetKeyState('A') < 0 && state!=1)
state = 3;
Sleep(15);
} //获取一个按钮事件
update();
}
return 0;
}