用C语言编写贪吃蛇小游戏

实现功能

蛇最开始三节,向右移动。用户可以通过按上下左右来控制蛇的移动,食物随机产生,蛇吃到食物后蛇的身体会变长。蛇撞墙或者撞到自己身体后,游戏结束。
在这里插入图片描述

怎么实现

要实现一个贪吃蛇小游戏,首先要想清楚游戏里有什么,怎样实现功能。

很明显游戏中只有两样东西,蛇和食物。
所以要建立蛇和食物信息,然后将蛇和食物进行初始化,在将蛇和食物画出来。
实现的功能有:
 1. 蛇的移动
 2. 按键控制蛇的移动
 3. 食物的产生
 4. 蛇吃食物后蛇身体变长
 5. 游戏的结束

用结构体建立蛇和食物的信息

struct COOR{//位置,x,y坐标
	int x;
	int y;
};

struct SNAKE{//蛇的基础信息
	int size;//节数
	int speed;//运动速度
	char dir;//运动方向
	struct COOR xy[MAX];//位置
}snakes;

struct FOOD{//食物信息
	struct COOR fooddir;//食物位置
	int flag;//判断食物是否被吃掉,1未被吃掉,0被吃掉
}food;

实现功能的函数:
蛇:

void snakeInit(){//初始化蛇的信息
void drawSnake(){//画蛇
void moveSnake(){//蛇的移动
void coorSnake(){//按键控制蛇的运动方向

食物:

void initFood(){//初始化食物的信息
void drawFood(){//画食物

其它:

int gameOver(){//游戏结束情况
void gameInit(){//初始化窗口范围

代码

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<graphics.h>
#include<conio.h>
#include<Windows.h>

#define MAX 200
HWND hwnd = NULL;

enum DIR{//枚举移动方向
	UP,
	DOWN,
	LEFT,
	RIGHT,
};

struct COOR{//位置,x,y坐标
	int x;
	int y;
};

struct SNAKE{//蛇的基础信息
	int size;//节数
	int speed;//运动速度
	char dir;//运动方向
	struct COOR xy[MAX];//位置
}snakes;

struct FOOD{//食物信息
	struct COOR fooddir;//食物位置
	int flag;//判断食物是否被吃掉,1未被吃掉,0被吃掉
}food;

void snakeInit(){//初始化蛇的信息
	snakes.size = 3;//开始节数
	snakes.dir = RIGHT;//开始运动方向
	snakes.speed = 10;
	int i = 0;
	for (; i < snakes.size; i++){//每一节书的位置,注意将第一节作为头
		snakes.xy[i].x = 40 - 10 * i;
		snakes.xy[i].y = 10;
	}

}

void drawSnake(){//画蛇
	int i = 0;
	for (; i < snakes.size; i++){
	setlinecolor(BLACK);//画线的颜色
	setfillcolor(RED);//填充色
	//fillrectangle(snakes.xy[i].x, snakes.xy[i].y, snakes.xy[i].x + 10, snakes.xy[i].y+10);//矩形
	fillcircle(snakes.xy[i].x, snakes.xy[i].y, 5);//圆形
	}


}

void moveSnake(){//蛇的移动
	//snakes.xy[0].x++;

	int i = 0;
	for (i = snakes.size-1; i >0; i--){//蛇身跟着舌头运动
		snakes.xy[i].x = snakes.xy[i-1].x;
		snakes.xy[i].y = snakes.xy[i-1].y;
	}
	switch (snakes.dir){
	case UP:
		snakes.xy[0].y-=snakes.speed;
		break;
	case DOWN:
			snakes.xy[0].y+=snakes.speed;
		break;
	case LEFT:
			snakes.xy[0].x-=snakes.speed;
		break;
	case RIGHT:
			snakes.xy[0].x+=snakes.speed;
		break;
	default:
		break;
	}


}

void coorSnake(){//按键控制蛇的运动方向
	if (_kbhit()){ //等待获取按键
		char c = _getch();//获得按键
		switch (c){
		case 72:
		case'w':
			if (snakes.dir != DOWN){
				snakes.dir = UP;
			}
			break;
		case 80:
		case's':
			if (snakes.dir != UP){
				snakes.dir = DOWN;
			}
			break;
		case 75:
		case'a':
			if (snakes.dir != RIGHT){
				snakes.dir = LEFT;
			}
			break;
		case 77:
		case'd':
			if (snakes.dir != LEFT){
				snakes.dir = RIGHT;
			}
			break;
		default:
			break;
		}
	}
}
void initFood(){//初始化食物的信息
	food.flag = 1;
	while (1){
START:
		food.fooddir.x = rand() % 63 * 10;//食物位置随机
		food.fooddir.y = rand() % 47 * 10;
		for (int i = 0; i < snakes.size; i++){//防止食物生成在蛇身上。
			if (food.fooddir.x == snakes.xy[i].x&&food.fooddir.y == snakes.xy[i].y){
				goto START;
			}
			else{
				break;
			}
		}
		break;
	}
}

void drawFood(){//画食物
	//food.fooddir.x = 100;
	//food.fooddir.y = 200;
	setlinecolor(BLACK);
	setfillcolor(RED);
	fillcircle(food.fooddir.x, food.fooddir.y, 5);

}
void eatFood(){//蛇吃食物
	if (snakes.xy[0].x - food.fooddir.x <= 5 && snakes.xy[0].y - food.fooddir.y <= 5 \
		&& food.fooddir.x - snakes.xy[0].x <= 5 && food.fooddir.y - snakes.xy[0].y <= 5 && food.flag == 1){
		food.flag = 0;
		snakes.size++;
	}

}

int gameOver(){//游戏结束情况
	if (snakes.xy[0].x < 5 || snakes.xy[0].y <= 0 || snakes.xy[0].x > 635 || snakes.xy[0].y > 478){
		MessageBox(hwnd, "GAME OVER!","你撞墙了!", MB_OK);
		return 1;
	}
	for (int i = 1; i < snakes.size; i++){
		if (snakes.xy[0].x == snakes.xy[i].x&&snakes.xy[0].y == snakes.xy[i].y){
			MessageBox(hwnd, "GAME OVER!", "你撞了自己",MB_OK);
			return 1;
		}
	}
	return 0;
}



void gameInit(){
	hwnd=initgraph(640, 480);//设置窗口大小
	setbkcolor(GREEN);//设置窗口颜色
}


int main(){
	srand((unsigned long)time(NULL));//生成随机数
	gameInit();
	cleardevice();//刷新窗口
	snakeInit();
	initFood();
	while (1){
		cleardevice();
		if (food.flag == 0){
			initFood();
		}
		drawFood();
		drawSnake();
		coorSnake();
		eatFood();
		moveSnake();
		//eatFood();
		if (gameOver()){
			break;
		}
		//stopGame();
		Sleep(100);
	}
	getchar();//防止闪屏
	closegraph();
	system("pause");
	return 0;
}
  • 66
    点赞
  • 212
    收藏
    觉得还不错? 一键收藏
  • 26
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 26
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值