用C代码写贪吃蛇游戏--创建一条蛇并移动

***********************************************
开发工具:VC6.0中文版
**********************************************


前段时间实习做了贪吃蛇游戏,现在抽空进行总结和整理,重点是整理思路,如何让一个想法变成代码。

1、创建一条蛇
2、让这条蛇移动
3、按键控制蛇的移动
4、创建食物
5、蛇吃掉食物,并且增长
6、创建简单的规则

这是我的大概思路,后面会一步步按照思路来整理并且优化代码。

首先是创建一条蛇,用printf("*");来代替蛇,当蛇移动的时候,需要在蛇头移动的方向依次打印蛇身,而后面的蛇身要消失,这样子蛇就会看起来像是移动了

这里需要引入一个函数来获取坐标控制台



创建一个蛇,开始移动,代码:

#include "stdafx.h"
#include<stdlib.h>
#include<windows.h>
#include<stdio.h>

int main(int argc, char* argv[])
{
	int i;
	//在规定的坐标点创建蛇身
	COORD pos = {0,0};
	COORD pos1 = {0,1};
	COORD pos2 = {0,2};
	HANDLE hout=GetStdHandle(STD_OUTPUT_HANDLE);		//获得窗体控制台
	for(i = 0;i < 20;i++)			//沿Y轴向下移动20步
	{
		Sleep(100);			//延时100ms
		system("cls");		//清屏
		//pos.X++;
		pos.Y++;
		SetConsoleCursorPosition(hout,pos);		//在控制台上设置光标位置
		printf("*");
		pos1.Y++;
		SetConsoleCursorPosition(hout,pos1);	//在控制台上设置光标位置
		printf("*");
		pos2.Y++;
		SetConsoleCursorPosition(hout,pos2);	//在控制台上设置光标位置
		printf("*");
		
		
	}


	return 0;
}




这条蛇目前并不能转弯,如果要实现转弯的功能,思路如下:

让蛇转弯,规律:后一个重复前一个位置,只需要让第一个动,后面的依次复制即可,如果想重复转弯,可以加一个while循环在int i;

代码如下:

#include "stdafx.h"
#include<stdlib.h>
#include<windows.h>
#include<stdio.h>

int main(int argc, char* argv[])
{
	int i;
	COORD pos = {0,0};
	COORD pos1 = {0,1};
	COORD pos2 = {0,2};
	HANDLE hout=GetStdHandle(STD_OUTPUT_HANDLE);//获得窗体控制台
	for(i = 0;i < 20;i++)
	{
		Sleep(100);
		system("cls");
		//pos.X++;
		pos.Y++;
		SetConsoleCursorPosition(hout,pos);//在控制台上设置光标位置
		printf("*");
		pos1.Y++;
		SetConsoleCursorPosition(hout,pos1);//在控制台上设置光标位置
		printf("*");
		pos2.Y++;
		SetConsoleCursorPosition(hout,pos2);//在控制台上设置光标位置
		printf("*");	
	}

	for(i = 0;i < 20;i++)
	{
		Sleep(100);
		system("cls");
		//pos.X++;
		pos=pos1;			//让蛇的第二段的位置等于蛇的第一个位置
		pos1=pos2;			//最后一段蛇身,等于第二段的位置
		pos2.X++;
		SetConsoleCursorPosition(hout,pos);//在控制台上设置光标位置
		printf("*");
		SetConsoleCursorPosition(hout,pos1);//在控制台上设置光标位置
		printf("*");	
		SetConsoleCursorPosition(hout,pos2);//在控制台上设置光标位置
		printf("*");	
	}

	for(i = 0;i < 22;i++)
	{
		Sleep(100);
		system("cls");
		//pos.X++;
		pos=pos1;
		pos1=pos2;
		pos2.Y--;
		SetConsoleCursorPosition(hout,pos);//在控制台上设置光标位置
		printf("*");
		SetConsoleCursorPosition(hout,pos1);//在控制台上设置光标位置
		printf("*");	
		SetConsoleCursorPosition(hout,pos2);//在控制台上设置光标位置
		printf("*");	
	}
	for(i = 0;i < 20;i++)
	{
		Sleep(100);
		system("cls");
		//pos.X++;
		pos=pos1;
		pos1=pos2;
		pos2.X--;
		SetConsoleCursorPosition(hout,pos);//在控制台上设置光标位置
		printf("*");
		SetConsoleCursorPosition(hout,pos1);//在控制台上设置光标位置
		printf("*");	
		SetConsoleCursorPosition(hout,pos2);//在控制台上设置光标位置
		printf("*");	
	}
	return 0;
}




执行效果如下:



前面的代码比较繁杂,现在将其封装成函数形式,简化格式并且不停循环转圈

代码及注释如下:

#include "stdafx.h"
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>

#define	SNAKELEN	10
#define	SNAKEMAX	10
#define INITSNAKELEN	4


#define RIGHT	1
#define LEFT	2
#define	DOWN	3
#define	UP		4

COORD snakeBodyPosition[SNAKELEN];
void showSnake();
int snakeLen = 3;
void initSnake(COORD snakeHeadPosition )
{	
	int i = 0;
	
	HANDLE hout = GetStdHandle(STD_OUTPUT_HANDLE);		//获取控制台
	COORD tmp = snakeHeadPosition;						//把蛇头位置赋值给tmp
	
	for(i = 0;i < INITSNAKELEN;i++)						//打印蛇身
	{
		snakeBodyPosition[i] = tmp;
		SetConsoleCursorPosition(hout,tmp);			//获取光标位置
		printf("*");
		tmp.X--;					//光标向后移,方便再次打印蛇下一部分

	}
	snakeLen = INITSNAKELEN;
}

void move(int direction)
{
	Sleep(100);			//延时100ms
	system("cls");		//清除屏幕
	int i = 0;
	
	for(i = 0;i < snakeLen - 1;i++)		//除了蛇头外,蛇的其它部分依次移动
	{
		snakeBodyPosition[snakeLen -1-i] = snakeBodyPosition[snakeLen - 2-i];		//除蛇头,其余部分和蛇的前一个点位置一致	
	}
	
	switch(direction)						//switch和if的区别:当条件多余三个时,switch执行效率更高
	{
	case RIGHT:
		{
			snakeBodyPosition[0].X++;
			break;
		}
	case LEFT:
		{
			snakeBodyPosition[0].X--;
			break;
		}
	case DOWN:
		{
			snakeBodyPosition[0].Y++;
			break;
		}
	case UP:
		{
			snakeBodyPosition[0].Y--;
			break;
		}
		default:
		{
			break;
		}
	}
	showSnake();				//打印蛇身,因为这个函数在move函数后创建,要在开始处进行声明(程序是顺序执行)
}

void showSnake()
{

	int i = 0;
	HANDLE hout = GetStdHandle(STD_OUTPUT_HANDLE);
	for(i = 0;i <snakeLen;i++)
	{
		SetConsoleCursorPosition(hout,snakeBodyPosition[i]);
		printf("*");
	}

}
int main(int argc, char* argv[])
{
	int i = 0;
	COORD	pos = {0,0};						//设定蛇头位置
	initSnake(pos);								//根据蛇头位置创建一条蛇
	
	while(1)				//无限循环转方形
	{
		for(i = 0;i < 20;i++)
		{
			move(RIGHT);	//控制蛇右移20步
		}
		for(i = 0;i < 20;i++)
		{
			move(DOWN);
		}
		for(i = 0;i < 20;i++)
		{
			move(LEFT);
		}
		for(i = 0;i < 20;i++)
		{
			move(UP);
		}
	}
	/*
	for(i = 0;i < INITSNAKELEN;i++)
	{
		printf("\n");		//进行换行,防止后面程序自带的字体掩盖蛇身
	}
	*/
	return 0;
}


执行效果如下:



总结:

1、熟悉用C建立坐标系
2、一段好的代码,主函数一定是简洁的
3、熟悉VC6.0用法



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值