贪吃蛇小游戏

╭(╯^╰)╮不是自己写的,但是总会自己敲得

#include<stdio.h>
#include<stdlib.h>
#include<Windows.h>
#include<conio.h>
#include<time.h>
char gamemap[20][40];//游戏地图大小 20*40
int score = 0;//当前分数 
//记录蛇的结点
int x[800];//每个结点的行编号
int y[800];//每个结点的列编号
int len = 0;//蛇的长度

//记录水果信息 
int fx = 0;//食物的横坐标 
int fy = 0;//食物的纵坐标 
int fcount = 0;//食物的数目 

 //主要函数操作 
void createfood();//生成食物 
void PrintgameMap(int x[], int y[]);//画游戏地图 
void move(int x[], int y[]);//移动蛇 


int main()
{
	srand(time(NULL));
	//初始化蛇头和身体的位置,默认刚开始蛇长为2 
	x[len] = 9;
	y[len] = 9;
	len++;
	x[len] = 9;
	y[len] = 8;
	len++;

	createfood();
	PrintgameMap(x, y);
	move(x, y);
	system("pause");
	return 0;
}
void createfood(){
	if (0 == fcount)
	{
		int tfx = rand() % 18 + 1;
		int tfy = rand() % 38 + 1;
		int i, j;
		int have = 0;//为0表示食物不是食物的一部分 
		for (i = 0; i<len; i++){
			for (j = 0; j<len; j++){
				if (x[i] == fx&&y[j] == fy){
					have = 1;
					break;
				}
				else
					have = 0;
			}
			if (1 == have){  //若为蛇的一部分,执行下一次循环 
				continue;
			}
			else{   //否则生成新的水果 
				fcount++;
				fx = tfx;
				fy = tfy;
				break;
			}
		}
	}
}
//游戏地图
void PrintgameMap(int x[], int y[]){
	int snake = 0, food = 0;

	int i, j;
	//画游戏地图,并画出蛇的初始位置
	for (i = 0; i < 20; i++){
		for (j = 0; j < 40; j++){
			if (i == 0 && j >= 1 && j <= 38)
				gamemap[i][j] = '=';
			else if (i == 19 && j >= 1 && j <= 38)
				gamemap[i][j] = '=';
			else if (j == 0 || j == 39)
				gamemap[i][j] = '#';
			else
				gamemap[i][j] = ' ';
			//判断蛇是否在当前位置
			int k;
			for (k = 0; k < len; k++){
				if (i == x[k] && j == y[k]){
					snake = 1;
					break;
				}
				else
					snake = 0;
			}
			{
				if (fcount&&fx == i&&fy == j)
					food = 1;
				else
					food = 0;
			}
			//若蛇在当前位置
			if (1 == snake)
				printf("*");
			else if (1 == food)
				printf("f");
			//若蛇不在当前位置并且当前位置没有水果 
			else
				printf("%c", gamemap[i][j]);
		}
		printf("\n");
	}
	printf("score:%d", score);
}
//移动
void move(int x[], int y[]){
	char s;
	s = getch();
	int move = 0, beat = 0;
	while (1){

		int cx[800];
		int cy[800];
		memcpy(cx, x, sizeof(int)*len);
		memcpy(cy, y, sizeof(int)*len);
		//头

		if (s == 'w'){
			x[0]--;
			move = 1;
			if (x[0] <= 0){
				printf("Game over\n");
				break;
			}
		}
		else if (s == 's'){
			x[0]++;
			move = 1;
			if (x[0] >= 19){
				printf("Game over\n");
				break;
			}
		}
		else if (s == 'a'){
			y[0] --;
			move = 1;
			if (y[0] <= 0){
				printf("Game over\n");
				break;
			}
		}
		else if (s == 'd'){
			y[0]++;
			move = 1;
			if (y[0] >= 39){
				printf("Game over\n");
				break;
			}
		}

		//身体
		int i;
		for (i = 1; i < len; i++){

			x[i] = cx[i - 1];
			y[i] = cy[i - 1];

		}
		for (i = 1; i<len; i++){  //要是咬到了自己 
			if (x[0] == x[i] && y[0] == y[i])
				beat = 1;
			else
				beat = 0;
		}
		if (1 == beat){
			printf("Game over\n");
			break;
		}
		if (1 == move){
			if (fcount&&x[0] == fx&&y[0] == fy){//如果吃到了果子
				//拷贝当前蛇头地址到第二个结点 
				memcpy(x + 1, cx, sizeof(int)*len);
				memcpy(y + 1, cy, sizeof(int)*len);
				len++;
				fcount--;
				fx = 0;
				fy = 0;
				score++;
				createfood();
			}
			Sleep(70);
			system("cls");
			PrintgameMap(x, y);
		}
		else
			continue;
		if (kbhit()){ //判断是否按下按键 
			s = getch();
		}
	}
}



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值