简易贪吃蛇
本文最后更新于 1421 天前,其中的信息可能已经有所发展或是发生改变。

学习自知乎:https://zhuanlan.zhihu.com/p/211062266

WASD控制移动,绿色为食物,每吃一次食物蛇移动速度加快,红色为减速道具

加了个分数统计

本地双人玩法还在研究(远程多人有生之年会研究XD

下载地址(39.5KB):https://shennoter.top/wp-content/uploads/2020/12/贪吃蛇.exe

未安装Visual Studio的电脑需安装Visual C++ Redistributable for Visual Studio 2015运行库(可能)

演示截图如下:

//需要安装easyx库
#include<graphics.h>
#include<conio.h>
#include<iostream>
#define BLOCK_SIZE 20
#define HEIGHT 40
#define WIDTH 40
int blocks[HEIGHT][WIDTH] = { 0 };//背景数组
char moveDirection;
int food_i, food_j,slow_i,slow_j;
int isFailure = 0;
int maxTime = 10;//蛇的速度
void moveSnake() {
	int i, j;//i为行,j为列
	for (i = 0; i < HEIGHT; i++) {//遍历数组,将蛇所在数组元素的数值全部+1
		for (j = 0; j < WIDTH; j++) {
			if (blocks[i][j] > 0) {
				blocks[i][j]++;
			}
		}
	}
	int oldTail_i, oldTail_j, oldHead_i, oldHead_j, max = 0;
	for (i = 0; i < HEIGHT; i++) {
		for (j = 0; j < WIDTH; j++) {
			if (max < blocks[i][j]) {//获取旧尾巴位置,头部为1,数值从头到尾巴递增,尾巴数值最大
				max = blocks[i][j];
				oldTail_i = i;
				oldTail_j = j;
			}
			if (blocks[i][j] == 2) {//全部元素+1后旧头部数值为2
				oldHead_i = i;
				oldHead_j = j;
			}
		}
	}
	int newHead_i = oldHead_i, newHead_j = oldHead_j;//得到新头部位置
	if (moveDirection == 'w'|| moveDirection == 'W') {
		newHead_i = oldHead_i - 1;
	}
	else if (moveDirection == 'a'|| moveDirection == 'A') {
		newHead_j = oldHead_j - 1;
	}
	else if (moveDirection == 's'|| moveDirection == 'S') {
		newHead_i = oldHead_i + 1;
	}
	else if (moveDirection == 'd'|| moveDirection == 'D') {
		newHead_j = oldHead_j + 1;
	}
	if (newHead_i >= HEIGHT || newHead_j >= WIDTH || newHead_i < 0 || newHead_j < 0 || blocks[newHead_i][newHead_j]>0) {//边界判定
		isFailure = 1;
		return;
	}
	blocks[newHead_i][newHead_j] = 1;
	if (newHead_i == food_i && newHead_j == food_j) {
		food_i = rand() % (HEIGHT - 5) + 2;
		food_j = rand() % (WIDTH - 5) + 2;//吃到食物后重新生成食物
		if (maxTime > 1) {//游戏速度加快
			maxTime--;
		}
	}
	else {
		blocks[oldTail_i][oldTail_j] = 0;
	}
	if (newHead_i == slow_i && newHead_j == slow_j) {
		slow_i = rand() % (HEIGHT - 5) + 2;
		slow_j = rand() % (WIDTH - 5) + 2;//重新生成减速道具
		if (maxTime < 15) {//游戏速度减慢
			maxTime++;
		}
	}
}
void initialize() {
	int i;
	blocks[HEIGHT / 2][WIDTH / 2] = 1;//初始化蛇头位置
	for (i = 1; i <= 4; i++) {
		blocks[HEIGHT / 2][WIDTH / 2 - i] = i + 1;//初始化蛇身位置
	}
	moveDirection = 'd';//设置初始方向为右
	food_i = rand() % (HEIGHT - 5) + 2;
	food_j = rand() % (WIDTH - 5) + 2;
	while (blocks[food_j][food_i] > 1) {
		food_i = rand() % (HEIGHT - 5) + 2;
		food_j = rand() % (WIDTH - 5) + 2;
	}
	slow_i = rand() % (HEIGHT - 5) + 2;
	slow_j = rand() % (WIDTH - 5) + 2;
	while (blocks[slow_j][slow_i] > 1) {
		slow_i = rand() % (HEIGHT - 5) + 2;
		slow_j = rand() % (WIDTH - 5) + 2;
	}
	initgraph(WIDTH * BLOCK_SIZE, HEIGHT * BLOCK_SIZE, NULL);//绘制地图
	setlinecolor(RGB(200, 200, 200));
	BeginBatchDraw();//开始绘制
}
void draw() {
	cleardevice();//清屏
	int i, j;
	for (i = 0; i < HEIGHT; i++) {
		for (j = 0; j < WIDTH; j++) {
			if (blocks[i][j] > 0) {
				setfillcolor(HSVtoRGB(30, 0.9, 1));//蛇身颜色
			}
			else {
				setfillcolor(RGB(150, 150, 150));//背景格子颜色
			}
			fillrectangle(j * BLOCK_SIZE, i * BLOCK_SIZE, (j + 1) * BLOCK_SIZE, (i + 1) * BLOCK_SIZE);
		}
		setfillcolor(RGB(0, 255, 0));//食物颜色,RGB 0 255 0为绿色
		fillrectangle(food_j * BLOCK_SIZE, food_i * BLOCK_SIZE, (food_j + 1) * BLOCK_SIZE, (food_i + 1) * BLOCK_SIZE);
		setfillcolor(RGB(255, 0, 0));//减速道具颜色
		fillrectangle(slow_j * BLOCK_SIZE, slow_i * BLOCK_SIZE, (slow_j + 1) * BLOCK_SIZE, (slow_i + 1) * BLOCK_SIZE);
	}
	int score = 0;
	if (isFailure) {//游戏结束提示
		for (i = 0; i < HEIGHT; i++) {//计算蛇长度
			for (j = 0; j < WIDTH; j++) {
				if (blocks[i][j] > 0) {
					score++;
				}
			}
		}
		TCHAR cscore[5];
		swprintf_s(cscore, _T("%d"), score-5);
		setbkmode(TRANSPARENT);
		settextcolor(RGB(255, 0, 0));
		settextstyle(80, 0, _T("微软雅黑"));
		outtextxy(240, 240, _T("YOU DIED"));
		outtextxy(240, 300, _T("SCORE:"));
		outtextxy(480, 300, cscore);
	}
	FlushBatchDraw();//批量绘制,将缓冲区里绘制好的图形全部打印到屏幕
}
void updateWithoutInput() {//无键盘输入时的屏幕更新
	if (isFailure)
		return;
	static int waitIndex = 1;
	waitIndex++;
	if (waitIndex == maxTime) {//设置游戏速度
		moveSnake();
		waitIndex = 1;
	}
}
void updateWithInput() {//有键盘输入时的屏幕更新
	if (_kbhit() && isFailure == 0) {
		char input = _getch();//获取按键
		if (input == 'a' || input == 's' || input == 'd' || input == 'w'|| input == 'W' || input == 'A' || input == 'S' || input == 'D') {
			moveDirection = input;
			moveSnake();
		}
	}
}
int main() {
	initialize();
	while (1) {//死循环,使游戏一直运行
		draw();
		updateWithoutInput();
		updateWithInput();
	}
	return 0;
}
-EOF-
这篇文章的作者Shennoter祝你心情愉快ღゝ◡╹)ノ♡♪(^∇^)
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇