2021-04-17

c语言贪吃蛇数组实现

头文件

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<windows.h>
#include <string.h>
void menu();
void my_printback();
void initsnake();
void snackmove();
void drawsnack();
void playermove();
int judge();
void creatfood();
void eatfood();
void prscore();

主函数

#include"game.h"

int main(void) {
	menu();//打印菜单
	char input;
	input = _getch();//从键盘获取一个输入,不用回车
	initsnake();//初始化蛇
	while (input==' ') {
		system("cls");//刷新控制台
		creatfood();//创造食物		
		if (judge() == 0) {//判断蛇是不是死亡,蛇头触碰边界或者身体
			printf(" snack death\n");
			break;
		}
		playermove();//玩家移动  必须玩家先移动,在蛇动,通过玩家移动改变蛇动
		snackmove();//蛇动起来	,如果先蛇动的话,
		//打印的是玩家没改变的坐标(假如打印蛇已经挨着边界了,即使玩家移动,此时并不会改变蛇的坐标
		//,蛇会向前继续移动一次,打印的是蛇两个身体,蛇头此时挨着边界,再次判断会死亡)
		eatfood();//蛇吃食物
		drawsnack();//将蛇的坐标赋给背景		
		my_printback();//打印背景	
		prscore();
		Sleep(1000);//延迟1000毫秒
		
	}
	printf("已退出游戏\n");
	return 0;
}

游戏函数

#include"game.h"

char background[20][48] = {//注意一个方块占两个字节
	"■■■■■■■■■■■■■■■■■■■■■■■\n",//一行用了47个字节
	"■                                          ■\n",
	"■                                          ■\n",
	"■                                          ■\n",
	"■                                          ■\n",
	"■                                          ■\n",
	"■                                          ■\n",
	"■                                          ■\n",
	"■                                          ■\n",
	"■                                          ■\n",
	"■                                          ■\n",
	"■                                          ■\n",
	"■                                          ■\n",
	"■                                          ■\n",
	"■                                          ■\n",
	"■                                          ■\n",
	"■                                          ■\n",
	"■                                          ■\n",
	"■                                          ■\n",
	"■■■■■■■■■■■■■■■■■■■■■■■\n",
};
enum { north = -1, south = 1, east = 2, west = -2 };
int food = 1,score=0;
snacklen = 2;//蛇的长度,从0开始
snackboard[20][3] = { 0 };//设置蛇的数组一共20节,每个节点存放x坐标,y坐标,蛇的方向
void menu(){	
	printf("\n\n\n\n\n\n");
	printf("\t\t\t\t\t <<贪吃蛇游戏>>\n");
	printf("\t\t\t\t\t<<空格开始游戏>>\n");
	printf("\t\t\t\t\t <<0 退出游戏>>\n");
}
void my_printback() {
	int i;
	for (i = 0; i < 20; i++) {
		printf("%s", background[i]);
	}
}
void initsnake() {
	srand((unsigned int)time(NULL));//这是初始化蛇头坐标
	int x = rand() % 18 + 1;//上下边界1-18范围,边框不能取
	int y = rand() % 17+ 3;//左右边界3-20,3是为了好的游戏体验,20是右边界,后面还有两个蛇身体
	snackboard[0][0] = x;
	snackboard[0][1] = y*2;
	snackboard[0][2] = west;//设置蛇头,假设都往左边移动
	snackboard[1][0] = x;
	snackboard[1][1] = y * 2+2;
	snackboard[1][2] = west;
	snackboard[2][0] = x;
	snackboard[2][1] = y * 2+4;
	snackboard[2][2] = west;
	
}
void drawsnack() {
	int i;
	for (i = 0; snackboard[i][0] != 0; i++) {//当蛇坐标为0时不赋值
		strncpy(&background[snackboard[i][0]][snackboard[i][1]], "■", 2);
		//将蛇的坐标赋给背景并给改坐标赋方块
	}
}
void snackmove() {
	for (int j = 0;snackboard[j][0]!=0; j++) {//每次把上一次的蛇清空
		strncpy(&background[snackboard[j][0]][snackboard[j][1]], "  ", 2);
	}
	int i=19;
	while (snackboard[i][0] == 0) {//确定蛇的最后一个节点
		i--;
	}
	i--;//确定蛇的倒数第二个节点
	for (; i >= 0; i--) {
		snackboard[i + 1][0] = snackboard[i][0];
		snackboard[i + 1][1] = snackboard[i][1];
		snackboard[i + 1][2] = snackboard[i][2];
	}
	
	if (snackboard[0][2] == west || snackboard[0][2] == east) {//对蛇头位置发生改变,注意在蛇头方向不同需要分情况
		snackboard[0][1] += snackboard[0][2];
	}
		if (snackboard[0][2] == north || snackboard[0][2] == south) {
			snackboard[0][0] += snackboard[0][2];
		}
	
}
void playermove(){
	if (GetAsyncKeyState('W')) //从键盘获取值,注意必须大写
		{
		snackboard[0][2] = north;
	
		}
	if (GetAsyncKeyState('S')) //从键盘获取值,注意必须大写
		{
		snackboard[0][2] = south;
		
		}
	if (GetAsyncKeyState('A')) //从键盘获取值,注意必须大写
		{
		snackboard[0][2] = west;
	
		}
	if (GetAsyncKeyState('D')) //从键盘获取值,注意必须大写
		{
		snackboard[0][2] = east;
	
		}

}
int judge() {
	if (snackboard[0][0] == 0 || snackboard[0][0] ==19|| snackboard[0][1] == 44 || snackboard[0][1] == 0) {
		//判断蛇头坐标是不是等于边界坐标
		return 0;
	}
	for (int i = 1; snackboard[i][0] != 0; i++) {//对蛇身体进行遍历,与蛇头坐标相同就死亡
		if (snackboard[0][0] == snackboard[i][0] && (snackboard[0][1] == snackboard[i][1])) {
			return 0;
		}
	}
	 return 1;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值