c语言程序设计:贪吃蛇

主要的功能:1.上下左右方向键移动。

                      2.撞墙或者自杀有不同提示。

                      3.有分数显示。

                      4.空格暂停。


注意事项:要在vs上运行,且要含easyx。


话不多说见代码:

#undef UNICODE
#undef _UNICODE//为了使用outtextxy函数
#define _CRT_SECURE_NO_WARNINGS//为了使用sprintf函数
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#include<time.h>//随机函数头文件
#include<graphics.h>//easyx里的头文件
/*********************
* 坐标属性
* 蛇属性
* 食物属性
**********************/
typedef struct pointXY//坐标属性
{
	int x;
	int y;
}MYPOINT;
struct Snake
{
	int num;//节数
	MYPOINT xy[100];//蛇最多100节
	char postion;//方向
}snake;
struct Food
{
	MYPOINT fdxy;//食物的x,y坐标
	int eatgrade;
	int flag;
}food;
HWND hwnd = NULL;//表示主窗口
enum movPostion
{
	UP = 72,
	DOWN = 80,
	LEFT = 75,
	RIGHT = 77
};
/*****************************/
void initSnake();//初始化蛇
void drawSnake();//画蛇
void moveSnake();//移动蛇
void keyDown();//按键处理
void initFood();
void drawFood();
void eatFood();
void showGrade();//展示分数
int snakeDie();//蛇死掉
void pauseMoment();//暂停函数
/*****************************/
int main()
{
	srand((unsigned int)time(NULL));//随机函数种子
	hwnd = initgraph(640, 480);
	setbkcolor(WHITE);//设置窗口颜色
	initSnake();
	while (1)
	{
		cleardevice();//刷新
		if (food.flag == 0)
		{
			initFood();
		}
		drawFood();
		drawSnake();
		if (snakeDie())
		{
			break;
		}
		eatFood();
		showGrade();
		moveSnake();
		while (_kbhit())
		{
			pauseMoment();
			keyDown();
		}
		Sleep(100);//多少ms移动一单位
	}


	getchar();//防止闪退
	closegraph();
	return 0;
}
void initSnake()
{
	snake.xy[2].x = 0;
	snake.xy[2].y = 0;
	snake.xy[1].x = 10;
	snake.xy[1].y = 0;
	snake.xy[0].x = 20;
	snake.xy[0].y = 0;
	snake.num = 3;
	snake.postion = RIGHT;
	food.flag = 0;
	food.eatgrade = 0;
}

void drawSnake()
{
	for (int i = 0; i < snake.num; i++)
	{
		setlinecolor(BLACK);//矩形边框颜色黑色
		setfillcolor(RGB(rand() % 255, rand() % 255, rand() % 255));//炫彩蛇
		fillrectangle(snake.xy[i].x, snake.xy[i].y, snake.xy[i].x + 10, snake.xy[i].y + 10);
		//画矩,写形左上与右下的坐标
	}



}

void moveSnake()
{
	//除了第一节,后的每一节都是前面的坐标
	for (int i = snake.num - 1; i > 0; i--)
	{
		snake.xy[i].x = snake.xy[i - 1].x;
		snake.xy[i].y = snake.xy[i - 1].y;
	}
	//第一节处理
	switch (snake.postion)

	{
	case RIGHT:
		snake.xy[0].x += 10;
		break;
	case LEFT:
		snake.xy[0].x -= 10;
		break;
	case DOWN:
		snake.xy[0].y += 10;
		break;
	case UP:
		snake.xy[0].y -= 10;
		break;
	default:
		break;
	}

}

void keyDown()
{
	char userkey = 0;
	userkey = _getch();
	switch (userkey)
	{
	case RIGHT:
		if (snake.postion != LEFT)
			snake.postion = RIGHT;
		break;
	case LEFT:
		if (snake.postion != RIGHT)
			snake.postion = LEFT;
		break;

	case DOWN:
		if (snake.postion != UP)
			snake.postion = DOWN;
		break;
	case UP:
		if (snake.postion != DOWN)
			snake.postion = UP;
		break;

	}


}

void initFood()//食物的设计
{
	food.fdxy.x = rand() % 65 * 10;//产生食物坐标为10的倍数
	food.fdxy.y = rand() % 48 * 10;
	food.flag = 1;//食物存在
	//如果食物出现在蛇身上,食物重新生成
	for(int i = 0; i > snake.num; i++)
	{
		if (food.fdxy.x == snake.xy[i].x && food.fdxy.y == snake.xy[i].y)
		{
			food.fdxy.x = rand() % 65 * 10;
			food.fdxy.y = rand() % 48 * 10;
		}
	}
}
void drawFood()
{
	setlinecolor(BLACK);
	setfillcolor(RGB(rand() % 255, rand() % 255, rand() % 255));
	fillrectangle(food.fdxy.x, food.fdxy.y, food.fdxy.x + 10, food.fdxy.y + 10);

}
void eatFood()
{
	//蛇边长,分数增加,食物重新生成
	if (snake.xy[0].x == food.fdxy.x && snake.xy[0].y == food.fdxy.y)
	{
		snake.num++;
		food.eatgrade += 10;
		food.flag = 0;
	}

}
int snakeDie()
{
	if (snake.xy[0].x > 640 || snake.xy[0].x < 0 || snake.xy[0].y>480 || snake.xy[0].y < 0)
	{
		outtextxy(200, 200, "你撞墙了");
		MessageBox(hwnd, "Gameover!", "撞墙警告", MB_OK);
		return 1;//返回1结束
	}
	for (int i = 1; i < snake.num; i++)
	{
		if (snake.xy[0].x == snake.xy[i].x && snake.xy[0].y == snake.xy[i].y)
		{
			outtextxy(200, 200, "你撞自己了");
			MessageBox(hwnd, "Gameover!", "自杀警告", MB_OK);
			return 1;
		}
	}
	return 0;
}
void showGrade()
{
	char grade[100] = "0";
	sprintf(grade, "%d", food.eatgrade);//将整形转化为字符串
	setbkmode(TRANSPARENT);//设置为透明的方式
	settextcolor(LIGHTBLUE);//颜色为青蓝
	outtextxy(560, 20, "分数:");
	outtextxy(580 + 30, 20, grade);
}
void pauseMoment()
{
	if (_getch() == 32)//空格暂停
	{
		while (_getch() != 32);
	}
}

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值