C语言程序简单实现贪吃蛇小游戏—不需要graphics.h头文件

        最近学习了一些数据结构的知识,然后试着用链表实现一个小游戏(贪吃蛇),在网上看了一些别人写的代码,然后自己重新改写(以前是一个主函数,现在分成了几个小函数方便查看功能,加了内存释放函数)了。在这里发表自己的 第一篇技术博客,希望大家一起讨论、学习,如果有错误,大家积极指出,这样才会有进步!
        开发平台是:win7(32位)+vs2008。
snake.h 头文件

#ifndef _SNAKE_H_H_H
#define _SNAKE_H_H_H

//调节游戏界面大小,这里设置为15*15
int const COL = 15;
int const ROW = 15;

//蛇节点
typedef struct Node
{
	int x;
	int y;
	struct Node *pre;
	struct Node *next;
}NODE, *pNODE;

//食物
typedef struct Food
{
	int x;
	int y;
	char c;
}FOOD, *pFOOD;

//初始化,创建蛇的第一节
pNODE InitSnake(void);

//初始化食物成员
FOOD InitFood(void);

//蛇运动函数
int MoveSnake(pNODE pHead, char c);

//检查键盘按键
char KbHit(char orient);

//蛇吃到食物处理函数
pNODE SnakeEatFood(pNODE pHead, pFOOD pFood);

//打印游戏界面函数
void Print(pNODE pHead, FOOD food);

//游戏结束,释放内存函数
void FreeMemory(pNODE *ppHead);

#endif





snake.c  源文件
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <conio.h>
#include <Windows.h>
#include  "snake.h"
//主函数
int main(void)
{
	char orien = 'a', get_char;
	int game_over = 0;

	FOOD food = InitFood();
	pNODE head = InitSnake();

	while (1)
	{
		head = SnakeEatFood(head, &food);
		get_char = KbHit(orien);
		if (27 == get_char)
		{
			game_over = 1;
			break;
		}
		else
			orien = get_char;	
		game_over = MoveSnake(head, orien);
		if (game_over)
			break;
		
		system("cls");
		Print(head, food);
		Sleep(200); //ms级,刷屏间隔时间
	}
	if (game_over)
	{
		printf("游戏结束!\n");

		FreeMemory(&head);
		if (NULL == head)
			printf("内存释放成功!\n");
		else
			printf("内存释放失败!\n");
	}
	getch();
	return 0;
}
//初始化,创建蛇的第一节
pNODE InitSnake(void)
{
	pNODE pHead = (pNODE)malloc(sizeof(NODE));
	srand((unsigned)(time(NULL)+1));

	if (NULL == pHead)
	{
		printf("内存分配失败!\n");
		exit(-1);
	}
	
	pHead->x = rand() % ROW;
	pHead->y = rand() % COL;
	pHead->next = NULL;
	pHead->pre = NULL;

	return pHead;
}
//初始化食物成员
FOOD InitFood(void)
{
	FOOD food;
	srand((unsigned)time(NULL));

	food.x = rand() % ROW;
	food.y = rand() % COL;
	food.c = 65 + rand()%26;

	return food;
}
//蛇吃到食物处理函数
pNODE SnakeEatFood(pNODE pHead, pFOOD pFood)
{
	pNODE p_add = NULL, pt = NULL, rear = NULL;
	
	if (pFood->x == pHead->x && pFood->y == pHead->y)
	{
		p_add = (pNODE)malloc(sizeof(NODE));
		if (NULL == p_add)
		{
			printf("内存分配失败!\n");
			exit(-1);
		}

		pt = pHead;
		while (pt->next != NULL)
		{
			pt = pt->next;
		}
		p_add->pre = pt;
		p_add->next = NULL;
		pt->next = p_add;

		*pFood = InitFood();
		//不让食物出现在蛇的位置上
		pt = pHead;
		while (pt != NULL)
		{
			if (pFood->x == pHead->x && pFood->y == pHead->y)
			{
				*pFood = InitFood();
				break;
			}
			pt = pt->next;
		}
	}

	return pHead;
}
//检查键盘按键
char KbHit(char orient)
{	
	char c;

	if (kbhit())
	{
		c = getch();	
		if (orient != 'd' && c == 'a')
		{
			orient = c;
		}
		else if (orient != 'a' && c == 'd')
		{
			orient = c;
		}
		else if (orient != 'w' && c == 's')
		{
			orient = c;
		}
		else if (orient != 's' && c == 'w')
		{
			orient = c;
		}
		else if (27 == c)
		{
			orient = c;
		}
	}

	return orient;
}
//蛇运动函数
int MoveSnake(pNODE pHead, char c)
{
	INT game_over = 0;
	pNODE pt = pHead;

	//让pt指向蛇尾
	while (pt->next != NULL)
	{
		pt = pt->next;
	}

	//从蛇尾向向蛇头前进
	while(pt != pHead)
	{
		pt->x = pt->pre->x;
		pt->y = pt->pre->y;
		pt = pt->pre;
	}

	if ('d' == c)
	{
		pHead->x += 1;
		if (pHead->x >= ROW)
		{
			pHead->x -= ROW;
		}
	}

	if ('a' == c)
	{
		pHead->x -= 1;
		if (pHead->x < 0)
		{
			pHead->x += ROW;
		}
	}
	
	if ('s' == c)
	{
		pHead->y += 1;
		if (pHead->y >= COL)
		{
			pHead->y -= COL;
		}
	}

	if ('w' == c)
	{
		pHead->y -= 1;
		if (pHead->y < 0)
		{
			pHead->y += COL;
		}
	}

	//当蛇头碰到蛇身,游戏结束
	pt = pHead->next;
	while (pt != NULL)
	{
		if (pt->x == pHead->x && pt->y == pHead->y)
		{
			game_over = 1;
		}
		pt = pt->next;
	}

	return game_over;
}
//打印游戏界面函数
void Print(pNODE pHead, FOOD food)
{
	int row = 0, col = 0, flag = 0;
	pNODE pt = NULL;

	printf("  方向控制——上:w 下:s 左:a 右:d(Esc退出)\n  ");
	for (row=0; row<ROW; row++)
	{
		printf("—");
	}
	putchar('\n');

	for (col=0; col<COL; col++)
	{
		printf(" |");
		for (row=0; row<ROW; row++)
		{
			pt = pHead;
			flag = 0;
			//打印出蛇
			while (pt != NULL)
			{
				if (row == pt->x && col == pt->y)
				{
					if (pt == pHead)
						printf("■");
					else
						printf("□");
					flag = 1;
					break;
				}
				pt = pt->next;
			}
			//打印出食物或两个空格
			if (0 == flag)
			{
				if (row == food.x && col == food.y)
				{
					putchar(food.c);
					putchar(food.c);
					continue;
				}
				printf("  ");
			}		
		}
		printf("|");
		putchar('\n');
	}
	
	printf("  ");
	for (row=0; row<ROW; row++)
	{
		printf("—");
	}
	putchar('\n');
}
//释放内存函数
void FreeMemory(pNODE *ppHead)
{
	pNODE p_delete = NULL, pt = NULL;

	while (*ppHead != NULL)
	{
		pt = (*ppHead)->next;
		if (pt != NULL)
		{
			pt->pre = NULL;
		}	
		p_delete = *ppHead;
		free(p_delete);
		p_delete = NULL;
		*ppHead = pt;
	}
}


最后附测试结果图片一张:
  • 10
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值