C语言实现超简单贪吃蛇(代码是抄的),我做一下讲解

C语言实现超简单贪吃蛇(代码是抄的),我做一下讲解首先声明,代码是抄的,代码是抄的,代码是抄的,重要的事情说三遍。。如果有侵权请联系我删除。。贴原作者的视频。在b站看的,视频找不到了,我等下会贴代码。。先分析一下游戏的数据结构:1.游戏地图用一个数组bk[20][20]存储,有四种状态。0表示没东西;1表示墙;2表示果实;3表示蛇。2.用xy[2]来存放蛇前进的坐标,xy[0]表示横坐标,xy[1]表示纵坐标。。3.move[20][20]表示蛇…

大家好,又见面了,我是你们的朋友全栈君。

首先声明,代码是抄的,代码是抄的,代码是抄的,重要的事情说三遍。。

如果有侵权请联系我删除。。

贴原作者的视频。

在b站看的,视频找不到了,我等下会贴代码。。

先分析一下游戏的数据结构:

1.游戏地图用一个数组bk[20][20]存储,有四种状态。0表示没东西;1表示墙;2表示果实;3表示蛇。

2.用xy[2]来存放蛇前进的坐标,xy[0]表示横坐标,xy[1]表示纵坐标。。

3.move[20][20]表示蛇的运动轨迹。也是在和地图一样的格子上,其中move[0][0]记录当前的步数.这个主要是用来刷新蛇使用。

3.look[4]用来记录游戏的各种数据,look[0]为朝向,look[1]为蛇的长度,look[2]为失败判定,look[3]为分数

接下来分析游戏的刷新策略:

1.一开始初始化地图,随机生成果实位置,蛇固定出现在 8,8坐标处。

2.接下来接收移动命令之后进行蛇头位置的刷新。

3.根据move数组的值和蛇的长度进行蛇尾的刷新(实际上每次移动蛇只需要将蛇尾变成地图就行了),这是关键,一定要理解.

举个栗子:

C语言实现超简单贪吃蛇(代码是抄的),我做一下讲解

对于这种情况,格子里记录的是轨迹数,一开始在1的位置,刷新一次之后就在2的位置了,加入此时蛇的长度为1,那么1 == 2 -1,那么判定蛇尾已经不在1的位置而跑到2的位置了。(可以自行将2替换成x+1,1替换成x,这样有普遍意义)

分析完了,接下啦贴代码:

#include "stdafx.h"
#include <stdio.h>
#include <windows.h>
#include <time.h>
#include <conio.h>
#include <stdlib.h>
//方向键的ASCLL值:上72,左75,右77,下80
//背景颜色的代码: 0=黑色  1蓝色 2 绿色 3湖蓝色 4红色 5紫色 6黄色 7白色 8灰色 9淡蓝色 
//**改变当前光标方块的背景颜色和字体颜色**//
void BackGround(unsigned int ForeColor = 7, unsigned int BackGroundColor = 0) {
	HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);  //获取控制台的句柄
	SetConsoleTextAttribute(handle, ForeColor + BackGroundColor * 0x10);//改变当前光标的背景和字体颜色
}

//**改变光标的位置**//
void gotoxy(int x, int y) {
	HANDLE handle;
	COORD coord;   //获取坐标轴结构体
	coord.X = x;
	coord.Y = y;
	handle = GetStdHandle(STD_OUTPUT_HANDLE);  //获取控制台句柄,值为-11
	SetConsoleCursorPosition(handle, coord);   //移动光标到x,y处
}

//**初始化地图数据**//
void restart(int bk[20][20], int look[4], int move[20][20]) {
	//bk为总的地图数据记录整个地图,为1时表示墙体,为2时表示果实,为3时表示蛇
	//look记录数据,为0时表示朝向,为1时表示长度,为3时表示胜负情况,为4表示分数
	//move记录蛇走过的路程,用来打印蛇时判断用
	int pp, qq;  //用来记录获取的随机坐标
	//接下来要初始化整个地图//
	for(int i=0;i<=16;i++)
		for (int j = 0; j <= 16; j++) {
			if (i == 0 || i == 16 || j == 0 || j == 16)  bk[i][j] = 1;//1表示墙体
			else bk[i][j] = 0; //0表示什么都没有
			move[i][j] = 0;    //该数组用来记录蛇移动的轨迹
		}
	//将蛇初始化在8,8坐标上
	bk[8][8] = 3;
	move[8][8] = 1;//则此时8,8,上的轨迹就应该记录为1
	move[0][0] = 1;//用此来记录步数
	pp = rand() % 15 + 1;//范围是1-15
	qq = rand() % 15 + 1;
	bk[pp][qq] = 2;//表示这个位置有果实了
	look[0] = 1;//表示朝向,向上
	look[1] = 1;//表示长度
	look[2] = 0;//当为1是表示失败
	look[3] = 0;//记录得分
	//接下来要绘制地图//
	for(int i=0;i<=16;i++)
		for (int j = 0; j <= 16; j++) {
			gotoxy(i * 2, j);//光标移动,每个光标都是矩形
			switch (bk[i][j]) {
			case 0:
				BackGround(0, 0);
				break;//如果没有东西打印黑色
			case 1:
				BackGround(0, 1);
				break;//墙打印蓝色
			case 2:
				BackGround(0, 2);
				break;//果实打印绿色
			case 3:
				BackGround(0, 3);
				break;//蛇打印湖蓝色
			default:
				break;
			}
			printf("  ");//地图中直接就是涂空格符
		}
	//接下来要显示积分//
	gotoxy(35, 0);
	BackGround(7, 0);//用白字黑底打印
	printf("现在得分是:%d,请再接再厉!^_^", look[2]);
}


//**运动主体**//
void map(int bk[20][20], int look[4], int xy[2], int move[20][20]) {
	//bk是地图信息,look作数据记录,xy记录坐标,move记录蛇的运动轨迹
	int b[10], qq=0, pp=0;//b用来吸收输入,qq和pp用来随机初始化果实坐标
	if (kbhit()) {//记录按下的是哪个方向键
		b[0] = getch();//用b来记录
		if (b[0] == 224)  b[0] = getch();//如果为224表示为方向键,但是要再一次获取才行
		if (b[0] == 72 && look[0] != 2)
			//如果输入的为上并且朝向不为下
			look[0] = 1;
		if (b[0] == 80 && look[0] != 1)
			look[0] = 2;
		if (b[0] == 75 && look[0] != 4)
			look[0] = 3;
		if (b[0] == 77 && look[0] != 3)
			look[0] = 4;
	}
	switch (look[0]) {
	case 1:
		//往上走
		xy[1]--;
		break;
	case 2:
		//往下走
		xy[1]++;
		break;
	case 3:
		//往左走
		xy[0]--;
		break;
	case 4:
		//往右走
		xy[0]++;
		break;
	}
	//接下来蛇就开始走动了//
	move[0][0]++;//蛇的步数加一
	move[xy[0]][xy[1]] = move[0][0];//记录当前格子中蛇的轨迹
	gotoxy(35, 2);
	BackGround(7, 0);
	printf("横坐标:%d,纵坐标:%d", xy[0],xy[1]);
	gotoxy(xy[0] * 2, xy[1]);//这里蛇头就往前移动了
	BackGround(0, 3);//与蛇体一个颜色
	printf("  ");

	//如果吃了果实//
	if (bk[xy[0]][xy[1]] == 2) {
		look[2]++;//分数加一
		look[1]++;//长度加一
		//更新分数
		gotoxy(35, 0);
		BackGround(7, 0);
		printf("现在得分是:%d,请再接再厉!^_^", look[2]);
		while (bk[pp][qq] != 0) {
			pp = rand() % 15 + 1;
			qq = rand() % 15 + 1;
		}
		bk[pp][qq] = 2;//将这个地方变为果实
		gotoxy(pp * 2, qq);
		BackGround(0, 2);
		printf("  ");
	}

	//如果撞了墙或者自己//
	if (bk[xy[0]][xy[1]] == 1 || bk[xy[0]][xy[1]] == 3) {
		look[3] = 1;//表示已经输了
		gotoxy(6, 6);
		BackGround(7, 0);
		printf("你输了,最后得分:%d", look[2]);
	}

	bk[xy[0]][xy[1]] = 3;//使这个位置变成蛇
	//接下来要检测蛇然后刷新蛇的位置//
	for(int i=0;i<=16;i++)
		for (int j = 0; j <= 16; j++) {
			if (move[i][j] == move[xy[0]][xy[1]] - look[1]){
				//如果符合这个条件,则表示蛇已经移动出这个位置了
				//要删除这个位置的蛇尾巴
				//一次只有一个方块会符合要求吧?
				bk[i][j] = 0;
				gotoxy(i * 2, j);
				BackGround(0, 0);
				printf("  ");
				break;//一次只找一个
			}
		}
	end:;
}
int main() {
	int bk[20][20], xy[2], move[20][20], look[4];
	xy[1] = xy[0] = 8;
	srand((unsigned) time(NULL));//初始化随机种子
	system("pause");
	restart(bk, look, move);
	while (look[3] == 0) {
		Sleep(200);//休眠400ms一次
		map(bk, look, xy, move);
	}
	system("pause");
	printf("游戏结束,谢谢游玩!^_^");
	return 0;
}

下面是运行界面:

C语言实现超简单贪吃蛇(代码是抄的),我做一下讲解

没有对界面进行美化,小伙伴们可以自行进行美化,如果想要让这个界面处于屏幕中间的话,只要定义一个很大的坐标系,然后去中间的坐标点就行了。。

关于FPS显示的想法:

我认为可以在while循环里面进行Fps显示,首先定义一个帧数计数器count,然后进行计时,每当一秒钟的时候,count在屏幕上刷新一次,然后重置为0,每当运行一次map的时候count++。。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/141377.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • 数据库:实体关系图(ER图)「建议收藏」

    数据库:实体关系图(ER图)「建议收藏」1,组成元素元素 描述 表示形似 实体 客观存在并可以相互区别的事物 用矩形框,矩形框内写明实体名 属性 实体所具有的一个属性 用椭圆型表示,并用无向边将其与相应的实体连接起来 关系 实体和实体之间以及实体内部的关系 用菱形表示,菱形框内写明联系名,并用无向边分别与有关实体连接起来, 同时在无向边旁边标上联系的类型 2,关系详解一,一对一一对一关系是指对于实体集A与实体集B,A中的每一个实体至多与B中

  • kernel dma protection_系统感知进程的唯一实体是

    kernel dma protection_系统感知进程的唯一实体是为BCG界面库的记忆特性所晕倒同事使用BCGControlBarPro处理界面,今天在修改菜单资源时却发生一件很奇怪的事情:无论怎么修改,程序运行后始终显示的还是改动以前的菜单,多次清空临时文件、生成文件以及重新编译也无济于事。同事为此折腾了一个上午,郁闷得不行。我用UltraEdit搜索了一下整个工程,并没有发现以前的字符串资源,因此排除了是编译器的问题。不是编译器的问题,那么就只能是BCG的问题了,我怀疑是BCG对资源进行了“记忆”处理,为了验证这一想法,我让同事将新生成的程序拷贝到一台没有使用过该程序

  • docker快速安装fastdfs服务springboot访问

    docker快速安装fastdfs服务springboot访问拉取镜像dockerpullmorunchang/fastdfs运行tracker跟踪器dockerrun-d–nametracker–net=hostmorunchang/fastdfsshtracker.sh运行storage存储器【注意:修改IP为自己的IP端口不变】dockerrun-d–namestorage–net=host-eTRACKER_IP=192.168.61.200:22122-eGROUP_NAME=gr

  • 1.零基础如何学习Web安全渗透测试?[通俗易懂]

    1.零基础如何学习Web安全渗透测试?[通俗易懂]零基础如何学习Web安全渗透测试?这可能是史上最详细的自学路线图!转载于拼客学院陈鑫杰拼客院长陈鑫杰(若有侵权,请联系邮件751493745@qq.com,我会及时删除)(转载链接:https://mp.weixin.qq.com/s/SlG_tWSEXapMeOezfBrnww)…

    2022年10月31日
  • vs2013产品密钥(所有版本)「建议收藏」

    vs2013产品密钥(所有版本)「建议收藏」https://blog.csdn.net/asd051377305/article/details/80714859

  • Linux(centos7)离现安装kubernetes1.19.2和docker——组件部分

    Linux(centos7)离现安装kubernetes1.19.2和docker——组件部分

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号