C语言实现贪吃蛇--1.1.1

本文详细介绍了如何使用C语言实现贪吃蛇游戏。通过设置循环处理游戏事件,利用Windows API绘制界面,使用结构体数组存储蛇的信息,并通过特定方法实现蛇的移动、食物生成以及吃到食物后的身体增长效果。文章提供了两种实现方法,推荐使用第一种方法,通过保存蛇尾信息来处理蛇身增长。
摘要由CSDN通过智能技术生成

C语言实现贪吃蛇–1.1.1

实现思路

  1. 设置一个循环
  2. 在循环中进行游戏事件的判断和响应

难点解决(以本程序为例)

问:如何实现绘制游戏界面?

答:在Windows下进行贪吃蛇的编写,可以调用Windows提供的一些API和结构

/**********获取句柄**********/
HANDLE Output = GetStdHandle(STD_OUTPUT_HANDLE);
/*将光标移动到指定位置*/
void getPosition(int x, int y) {
   
    COORD coord;
    coord.X = x;
    coord.Y = y;
    SetConsoleCursorPosition(Output, coord);
}

问:如何存储蛇的信息?

答:自定义一个结构体数组

/*定义一个蛇类型*/
typedef struct sn {
   
    int length;
    point position[N];
} sn;

问:如何实现蛇的移动?

答:要实现蛇的移动,可以向蛇的移动方向绘制一个新的蛇头。然后在蛇尾打印空格(如果没有这一步,蛇身会不断变长)

问:如何生成随机食物?

答:可以使用C提供的随机数生成,随机生成食物的坐标,然后打印食物

/*产生食物,食物必须满足特定条件,即不能在蛇身上,也不能在墙壁上*/
void creatFood(){
   
	srand(time(NULL));
	while(1){
   
		int flag=1;
		food.x=rand()%width;
	food.y=rand()%height;
	for(int i=0;i<snake.length;i++)
		if(food.x==snake.position[i].x&&snake.position[i].y==food.y){
   
			flag=0;
			break;
		}
	if(food.x%2!=0||food.y==0||food.x==0)
		flag=0;	
		if(flag)
		break;
	}	
	getPosition(food.x,food.y);
	printf("■");
} 

问:如何实现蛇吃到食物后身体增长的效果?

答:当蛇吃到食物,不清除蛇尾,可以达到蛇身增长的效果

实现

注意:

以下两种方法只是判定食物被吃后,蛇身如何变化的实现不同

实现方法一(设置 last 保存蛇尾信息)

#include <stdio.h>
#include <stdlib.h>
#include <Windows.h>//windows编程头文件
#include <time.h>
#include <conio.h>//控制台输入输出头文件

/*定义蛇的最大长度*/
#define N 20

/**********获取句柄**********/
HANDLE Output = GetStdHandle(STD_OUTPUT_HANDLE);

/*设置蛇运动范围的宽、高*/
const int width = 40, height = 24;

/*设置蛇初始运动方向*/
char key = 'w';

/*定义一个点类型,x、y表示坐标*/
typedef struct point {
   
    int x;
    int y;
} point;

/*定义一个蛇类型*/
typedef struct sn {
   
    int length;
    point position[N];
} sn;

sn snake;

point food;

/*last保存蛇的最后一节身体信息*/
point last;

/*将光标移动到指定位置*/
void getPosition(int x, int y) {
   
    COORD coord;
    coord.X = x;
    coord.Y = y;
    SetConsoleCursorPosition(Output, coord);
}

/*隐藏光标*/
void hideHandle() {
   
    CONSOLE_CURSOR_INFO cci;
    cci.dwSize = 1; /*设置光标大小*/
    cci.bVisible = 0;/*置光标不可见*/
    SetConsoleCursorInfo(Output, &cci); /*设置(应用)光标信息*/
}

/*打印地图*/
void printMap() {
   
    getPosition(0, 0);
    for (int i = 0; i <= width; i += 2)/*上*/
        printf("■");

    getPosition(0, height);
    for (int i = 0; i <= width; i += 2)/*下*/
        printf("■");

    for (int i = 0; i < height; i++) {
   
        getPosition(0, i);/*左*/
        printf("■");
    }

    for (int i = 0; i < height; i++) {
   
        getPosition(width, i);/*右*/
        printf("■");
    }

}

/*判断蛇是否吃了食物,如果吃了,返回 1 */
int eatFood(){
   
	for(int i=0;i<snake.length;i++){
   
		if
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值