手把手教你用C语言制作简单的贪吃蛇小程序(二维数组实现)(上)

废话不多说,直接进入正题。
(注:贪吃蛇源码改编自童晶老师所著《c语言课程设计与游戏开发实践教程》),感觉这个源码对初学者很友好,于是便分享出来,侵删。以下是本人的理解,我尽量不用术语,用初学者能听得懂的大白话。
由于文章过长,我打算分上下两篇来写。
看本文所需的知识:while语句,for语句,if else、else if语句,函数,二维数组,#define。
我们今天用c语言制作简单的贪吃蛇,用二维数组实现。
IDE: Dev-C++
首先对于c语言初学者来说,制作一个贪吃蛇最大的难题是在黑色的框框里怎么显示运动的蛇呢?c语言初学者在编译程序的时候,在黑色的框框里显示的都是静态的数字或字符,从来没有遇到过这种情况。
那么,有如下两种解决方案:
第一种是利用<stdlib.h>头文件里的system(“cls”),函数。这是一种清屏函数,在程序执行到这个函数时,会删除之前所打印的所有字符。利用人眼的视觉暂留特性,可以产生运动的效果。
比如,我们来举个例子:
程序如下:

#include<Stdio.h>
#include<Stdlib.h>

int main(void)
{
   
	int i=0while(1)
	{
   
		system("cls");
		printf("  %d",i++);//注意:%d前面有两个空格
	}
	return 0;
}

感兴趣的同学可以尝试着编译一下,很简单的一个程序,也不难。
最终在黑框里输出的是一个从1到2到3到…每次加一的这么一个数字。
让我们来分析一下这个简单的程序:
首先while(1)是一个无限循环的while语句,然后进入{ }这么一个区域,之后开始执行system(“cls”)清屏函数。接下来printf()函数输出0。(注意,我们这里是i++,先在黑框上输出0(前面声明的i=0),再把i的值加1;如果是++i,则先把i的值(为0)加一(为1),再输出,则此时输出的值为1)
然后再次进入{ }区域,执行清屏函数system(“cls”),把之前在屏幕上输出的0清除,再在黑框上输出1,然后此时i的值加1,为2。
之后无限循环,就一直按照这个步骤进行下去。
但是,你会发现,有个光标一直在最下面,就是这个东西:在这里插入图片描述

第二种是利用gotoxy(int x,int y),这个函数是将光标移动到(x,y)点处。
由于dev c++中并没有这个函数的原型,所以我们需要自己声明,声明如下:
注意,由于我们用到了Windows API,所以要加<windows.h>头文件

void gotoxy(int x,int y)
{
   
	HANDLE handle=GetStdHandle(STD_OUTPUT_HANDLE);
	COORD pos;
	pos.X=x;
	pos.Y=y;
	SetConsoleCursorPosition(handle,pos);
}

这个函数的原理是每次将光标移动到(0,0)点,即黑色框的左上角,再进行重新输入,达到了清屏的功能。
改进后的程序如下:

#include<Stdio.h>
#include<Stdlib.h>
#include<windows.h>
void gotoxy(int x,int y)
{
   
	HANDLE handle=GetStdHandle(STD_OUTPUT_HANDLE);
	COORD pos;
	pos.X=x;
	pos.Y=y;
	SetConsoleCursorPosition(handle,pos);
}

int main(void)
{
   
	int i=0;
	while(1)
	{
   
		gotoxy(0,0);
		printf("  %d",i++);
	}
	return 0;
}

但是,运行上面的程序,你会发现,光标闪来闪去,看着很难受。没关系,咱们还有办法改进。
改进措施如下:
我们还是利用windows API,声明一个函数:

void HideCursor(void)
{
   
	CONSOLE_CURSOR_INFO cursor_info={
   1,0};
	SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE),&cursor_info);
}

这个函数的作用是隐藏光标。初学者对于这个的原理不用过于纠结,不然我们又得讲很久。

#include<Stdio.h>
#include<Stdlib.h>
#include<windows.h>

void gotoxy(int x,int y)
{
   
	HANDLE handle=GetStdHandle(STD_OUTPUT_HANDLE);
	COORD pos;
	pos.X=x;
	pos.Y=y;
	SetConsoleCursorPosition(handle,pos);
}

void HideCursor(void)
{
   
	CONSOLE_CURSOR_INFO cursor_info={
   1,0};
	SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE),&cursor_info);
}

int main(void)
{
   
	int i=0;
	while(1)
	{
   
		HideCursor();
		gotoxy(0,0);
		printf("  %d",i++);
	}
	return 0;
}

最后,再运行一下这个程序,我们就会发现光标不见了。
至此,如何显示运动的蛇的问题就解决了。

那么,还有一个难点,如何控制蛇的移动?
我们的想法是用键盘输入来控制蛇的移动。小时候经常玩4399小游戏和7k7k小游戏的人都会发现,很多动作和闯关类的游戏都是用w,s,a,d来控制上下左右的,那么我们也通过这个来控制上下左右。

那么我们就用到了kbhit()函数,这个函数,这个函数在我们敲击键盘的时候返回1,没有敲击键盘则返回0。所以我们可以用if(kbhit())来判断玩家是否敲击了键盘。而玩家具体敲击了哪个键,则需要读取用户的输入,我们就需要用输入函数来获得用户的输入。常用的输入函数有scanf(),getchar(),getch()。
但是,前两种函数需要玩家输入一个字符后再按回车键才能把字符从缓冲区取出来,所以导致了我们按下wasd这四个键的其中一个之后还要再次按以下回车才能改变蛇的方向,哪有游戏这么玩的对吧?所以,我们就需要一个函数,只要我们按下了键盘,不需要再按回车键就能改变蛇的方向,而getch()函数则是用户只要输入了一个字符就直接获取它的值,不需要回车,这才是我们玩过的游戏的样子嘛。(注:getch()函数头文件为<conio.h>,而getchar()和scanf()为<stdio.h>)
好,那么我们怎么根据用户敲击的键盘来确定蛇往哪个方向移动呢?
想法是,利用四个if语句来判断,代码如下:

void updateWithInput(void)//与用户输入有关的函数
{
   
	char input;
	if(kbhit())
	{
   
		input=getch();
		if(input=='a')//蛇向左移动
		{
   
		}
		if(input=='d')//蛇向右移动
		{
  • 2
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值