C语言 VC6.0控制台编写一个贪吃蛇游戏

最近看到有人发布贪吃蛇的编码实现,想到了自己多年之前也实现过一个,发布在这里,做一下回忆。

C语言面向过程编码,基本功能实现以函数为单位,重点就是各个函数的设计和实现。

本篇使用VC6.0来实现,因为我大二大概就是2012年的时候,上手就使用了这个工具。直接上代码吧:

自定义的函数实现:

//文件名:map.cpp
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <conio.h>
#include "map.h"
#include <time.h>

int a[H][W];	//游戏区域
int s[H*W][2];	//蛇的动态长度
int sLength;	//蛇的初始长度
int direction;   //蛇的方向
int score=0;	  //分数记录
bool eated = false;


void init()    //界面初始化
{	
	srand((unsigned)time(NULL));
	//设置光标隐藏
	CONSOLE_CURSOR_INFO cursor_info = {1,0};
	SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE),&cursor_info);	
	int i,j;
	for(i=0;i<H;i++)
	{
		a[i][0]=1;
		a[i][W-1]=1;
	}
	for(j=0;j<W;j++)
	{
		a[0][j]=1;
		a[H-1][j]=1;
	}
	sLength=4;
	s[0][0]=H/2;
	s[0][1]=W/2;
	for(i=1;i<4;i++)
	{
		s[i][0]=s[0][0]+i;
		s[i][1]=s[0][1];
	}
	direction=UP;
}

void gotoxy(int i,int j)	//移动光标到指定点
{
	COORD position={j,i};
	SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),position);
}

void drawmap()	//画地图
{
	int i,j;
	for(i=0;i<H;i++)
	{
		for(j=0;j<W;j++)
		{
			if(a[i][j]==0)
				printf(" ");
			else
				printf("*");
		}
		printf("\n");
	}
}

void drawSnake()	//画蛇
{
	int i;
	for(i=0;i<sLength;i++)
	{
		gotoxy(s[i][0],s[i][1]);
		printf("@");
	}
}

void move()
{
	int i;
	gotoxy(s[sLength-1][0],s[sLength-1][1]);
	printf(" ");
	if(eated)
	{
		sLength++;
		eated=false;
	}
	for(i=sLength-1;i>0;i--)
	{
		s[i][0]=s[i-1][0];
		s[i][1]=s[i-1][1];
	}
	switch(direction)
	{
	case UP:
		s[0][0]--;
		break;
	case DOWN:
		s[0][0]++;
		break;
	case LEFT:
		s[0][1]--;
		break;
	case RIGHT:
		s[0][1]++;
		break;
	}
}

void key()
{
	if(_kbhit()!=0)
	{
		char in;
		while(!_kbhit()==0)
			in = _getch();
		switch(in)
		{
		case 'W':
		case 'w':
			if(direction!=DOWN)
				direction=UP;
			break;
		case 'S':
		case 's':
			if(direction!=UP)
				direction=DOWN;
			break;
		case 'A':
		case 'a':
			if(direction!=RIGHT)
				direction=LEFT;
			break;
		case 'D':
		case 'd':
			if(direction!=LEFT)
				direction=RIGHT;
			break;
		case 'P':
		case 'p':
			gotoxy(H,0);
			system("pause");
			gotoxy(H,0);
			printf(" ");
				break;
		}
	}
}

int check(int ii,int jj)	//判断这个点是否可以投放食物
{
	if(a[ii][jj]==1)
		return 0;
	int i;
	for(i=0;i<sLength;i++)
	{
		if(ii==s[i][0]&&jj==s[i][1])
			return 0;
	}
	if(ii==0||ii==H-1||jj==0||jj==W-1)
		return 0;
	return 1;
}

void food()			//投放食物函数
{
	int i,j;
	do
	{
		i=rand()%H;
		j=rand()&W;
	}while(check(i,j)==0);
	a[i][j]=-1;
	gotoxy(i,j);
	printf("$");
}

bool gameOver()
{
	bool isGameOver = false;
	int sX = s[0][0],sY=s[0][1];  // 蛇头的X坐标和Y坐标
	if(sX==0||sX==H-1||sY==0||sY==W-1)
		isGameOver = true;
	for(int i=1;i<sLength;i++)
	{
		if(s[i][0]==sX&&s[i][1]==sY)
			isGameOver = true;
	}
	return isGameOver;
}

void printfScore()
{
	gotoxy(0,W+2);
	printf("  EatSnake game!");
	gotoxy(1,W+2);
	printf("  JYH制作");
	gotoxy(7,W+2);
	printf("  得分:%d",score);
	gotoxy(3,W+2);
	printf("操作:W:上 S:下");
	gotoxy(4,W+2);
	printf("      A:左 D:右");
	gotoxy(5,W+2);
	printf("      P:暂停");
}

头文件实现:

//文件名 map.h
#ifndef _MAP_H_
#define _MAP_H_

#define H 23
#define W 55
#define WAIT_TIME 500
#define UP 0
#define DOWN 1
#define LEFT 2
#define RIGHT 3

extern int a[H][W];	//游戏区域
extern int s[H*W][2];	//蛇的动态长度
extern int sLength;	//蛇的初始长度
extern int direction;   //蛇的方向
extern int score;
extern bool eated;

void init();
void drawmap();
void drawSnake();
void key();
void move();
int check(int ii,int jj);
void food();
bool gameOver();
void printfScore();

#endif

主函数实现:

//文件名:main.cpp
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>

#include "map.h"

int main()
{
	init();
	drawmap();
	food();
	while(1)
	{
		drawSnake();
		printfScore();
		Sleep(WAIT_TIME);
		key();
		move();
		if(gameOver())
		{
			system("cls");
			printf("Game Over! \n");
			system("pause");
		}
		if(a[s[0][0]][s[0][1]]==-1)
		{
			eated = true;
			score+=10;
			food();
			a[s[0][0]][s[0][1]]=0;
		}
	}
	getchar();

	return 0;
}

运行效果:

不足之处,是只能运行一次,game over之后,需要重新ctrl+F5 。

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在 VC6.0 中自己编写一个库函数并调用它,可以按照以下步骤进行: 1. 创建一个新的 Win32 控制台应用程序项目。 2. 在解决方案资源管理器中,右键单击“源文件”,选择“添加”->“新建项”,然后选择“C++文件(.cpp)”。 3. 编写你的库函数代码,并将其保存为 .cpp 文件。例如,这里我们编写一个名为 mylib.cpp 的库函数,其中包含一个名为 myfunc() 的函数: ```c++ #include <stdio.h> void myfunc() { printf("This is my library function!\n"); } ``` 4. 在 Visual Studio 菜单栏中,选择“项目”->“添加新建项”->“C++头文件(.h)”。 5. 在新创建的头文件中,声明你的库函数。例如,这里我们创建一个名为 mylib.h 的头文件,其中声明了 myfunc() 函数: ```c++ #ifndef MYLIB_H #define MYLIB_H void myfunc(); #endif ``` 6. 回到 mylib.cpp 文件,包含 mylib.h 头文件,这样就可以使用头文件中声明的函数了: ```c++ #include "mylib.h" void myfunc() { printf("This is my library function!\n"); } ``` 7. 在 Visual Studio 菜单栏中,选择“项目”->“属性”->“配置属性”->“常规”,将“配置类型”设置为“动态链接库(.dll)”。 8. 编译项目,这样就会生成一个名为“mylib.dll”的动态链接库文件。 9. 在另一个项目中,包含 mylib.h 头文件,并调用 myfunc() 函数: ```c++ #include "mylib.h" int main() { myfunc(); return 0; } ``` 10. 在编译链接时,将 mylib.dll 库文件添加到链接器的附加依赖项中,这样就可以成功地调用你自己编写的库函数了。 需要注意的是,不同的编译器和操作系统可能会有不同的库函数命名规则和链接方式。因此,在使用库函数时,你需要仔细查阅相关的文档或者参考示例代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值