今天用C语言写了一个贪吃蛇小游戏

不多说,直接写;

#include<stdio.h>
#include<conio.h>
#include<time.h>
#include<stdlib.h>
#include<graphics.h>
#include<mmsyscom.h>
#pragma comment(lib,"winmm.lib")

#define NUM 200
#define SIZE 10

enum Ch{ up = 72, down = 80, left = 75, right = 77 };

struct Coor
{
	int x;
	int y;
};
struct Snake
{
	int n;
	Ch ch;
	Coor szb[NUM];
};
struct Food
{
	int x;
	int y;
	bool iseat;
};

Snake snake;
Food food;

int speed = 100;
int jf = 0;

char t[10000] = { 0 };

void GameInit()
{
	srand((unsigned int)time(NULL));

	snake.n = 3;
	snake.ch = right;
	snake.szb[0].x = 100;
	snake.szb[0].y = 100;
	snake.szb[1].x = 90;
	snake.szb[1].y = 100;
	snake.szb[2].x = 80;
	snake.szb[2].y = 100;

	food.iseat = true;
}

void DrawGame()
{
	cleardevice();
	setfillcolor(RED);
	fillrectangle(snake.szb[0].x, snake.szb[0].y, snake.szb[0].x + SIZE, snake.szb[0].y + SIZE);
	for (int i = 0; i < snake.n; i++)
	{
		rectangle(snake.szb[i].x, snake.szb[i].y, snake.szb[i].x + SIZE, snake.szb[i].y + SIZE);
	}

	setfillcolor(GREEN);
	fillroundrect(food.x, food.y, food.x + SIZE, food.y + SIZE, 5, 5);

}

void SnakeMove()
{
	for (int i = snake.n - 1; i>0; i--)
	{
		snake.szb[i].x = snake.szb[i - 1].x;
		snake.szb[i].y = snake.szb[i - 1].y;
	}
	switch (snake.ch)
	{
	case up:
		snake.szb[0].y -= SIZE;
		break;
	case down:
		snake.szb[0].y += SIZE;
		break;
	case left:
		snake.szb[0].x -= SIZE;
		break;
	case right:
		snake.szb[0].x += SIZE;
		break;
	}
}

void ChangeCh()
{
	char key;
	key = getch();
	switch (key)
	{
	case up:
		if (snake.ch != down)
		{
			snake.ch = up;
		}
		break;
	case down:
		if (snake.ch != up)
		{
			snake.ch = down;
		}
		break;
	case left:
		if (snake.ch != right)
		{
			snake.ch = left;
		}
		break;
	case right:
		if (snake.ch != left)
		{
			snake.ch = right;
		}
		break;
	}
}

void CreatFood()
{
	bool  flag = false;
	if (food.iseat == true)
	{
		while (1)
		{
			food.x = rand() % 64 * 10;
			food.y = rand() % 48 * 10;
			for (int i = 0; i < snake.n; i++)
			{
				if (food.x == snake.szb[i].x&&food.y == snake.szb[i].y)
				{
					flag = true;
					break;
				}
			}
			if (!flag)
			{
				food.iseat = false;
				break;
		    }
		}
	}
}

void EatFood()
{
	if (snake.szb[0].x == food.x&&snake.szb[0].y == food.y)
	{
		food.iseat = true;
		snake.n++;
		jf++;
	}
}

void drawjf()
{
	setbkmode(0);
	sprintf(t, "当前分数:%d", jf);
	settextcolor(RED);
	outtextxy(520, 5, t);
}

int GameOver()
{
	if (snake.szb[0].x<0 || snake.szb[0].x>640 || snake.szb[0].y<0 || snake.szb[0].y>480)
	{
		return 1;
	}
	for (int i = 1; i < snake.n - 1; i++)
	{
		if (snake.szb[0].x == snake.szb[i].x&&snake.szb[0].y == snake.szb[i].y)
		{
			return 1;
		}
	}
	return 0;
}

int main()
{
	initgraph(640, 480);
	mciSendString("open 1.mp3", NULL, NULL, NULL);
	mciSendString("play 1.mp3 repeat", NULL, NULL, NULL);
	GameInit();
	int n = 0;
	while (1)
	{
		while (!kbhit())
		{
			SnakeMove();
			DrawGame();
			drawjf();
			CreatFood();
			EatFood();
			n = GameOver();
			if (n)
			{
				break;
			}
			Sleep(speed);
		}
		if (n)
		{
			break;
		}
		ChangeCh();
	}
	closegraph();
	return 0;
}

我用的是vs2013,多字节字符集。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值