c++下午茶贪吃蛇-双端队列deque

本文介绍了一个使用双端队列实现的贪吃蛇游戏。作者详细描述了游戏的开发过程,包括地图创建、蛇和食物的随机生成、蛇的移动更新以及游戏的输出显示。代码采用C++编写,涉及随机数生成、屏幕刷新等技术。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 寒假集训,感觉今天闲来无事,就想写个贪吃蛇玩,花了一下午的时间写出来这个玩意算是能看了。

我用的是双端队列,感觉比其它方法好写一点(个人认为)。

思路:

         第一步先搞个地图,只要有了地图这个蛇才能跑起来,才能去吃东西嘛

         第二步把蛇和第一颗食物用随机数生成出来。蛇的关节我用‘*’表示,食物用‘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;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值