c语言贪吃蛇详解-2.画出蛇
前几天的实验室培训课后作业我布置了贪吃蛇,今天有时间就来写一下题解。我将分几步来教大家写一个贪吃蛇小游戏。由于大家c语言未学完,这个教程只涉及数组和函数等知识点。
蛇的身体就是一些点,我们可以用二维数组把这些点的坐标存起来。
先声明一个足够大的二维数组。虽然我觉得你们玩不了这么长(手动滑稽)。
int s[H*W][2];
这样s[0][0]表示蛇头的i坐标,s[0][1]表示蛇头的j坐标。s[i][0]表示蛇第i+1个点的i坐标。s[i][1]同理。
然后再声明一个int变量存储蛇的长度。然后把这些初始化操作都放进上面init函数里面。
int sLength; //蛇的长度
sLength=4; //让蛇的最初长度为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]; //给刚开始的蛇身几个初始坐标
}
然后接下来我们把蛇画出来,我这里有一个函数(百度的),可以实现移动光标到指定点。注:要添加头文件windows.h
如下:
void gotoxy(int i,int j)
{
COORD position={j,i}; SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),position); }
然后就可以先画地图,然后通过移动光标在地图上画出蛇。
void drawSnake()
{
int i; for(i=0;i<sLength;i++) { gotoxy(s[i][0],s[i][1]); //移动关标到蛇的坐标 printf("@"); //在这个位置画蛇 } }
好,看看效果
蛇确实出来了,但是那个光标很碍事,在init函数开始时加入下面代码可隐藏关标
CONSOLE_CURSOR_INFO cursor_info = {1, 0};
SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursor_info);
这样就没有光标了。
到现在为止的代码。
#include <stdio.h>
#include <stdlib.h> #include<windows.h> #define H 23 #define W 75 int a[H][W]; //地图数组 int s[H*W][2]; //蛇身坐标数组 int sLength; //蛇的长度 void init() //程序开始时的初始化操作 { 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; //让第一列为1 a[i][W-1]=1; //让最后一列为1 } for(j=0; j<W; j++) { a[0][j]=1; //让第一行为1 a[H-1][j]=1; //让最后一行为1 } sLength=4; //让蛇的最初长度为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]; //给刚开始的蛇身几个初始坐标 } } 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++) //两重for循环遍历数组 { if(a[i][j]==0) //为0输出空格 printf(" "); else //为1输出# printf("#"); } printf("\n"); //别忘了换行 } } void drawSnake() //画蛇 { int i; for(i=0;i<sLength;i++) { gotoxy(s[i][0],s[i][1]); //移动关标到蛇的坐标 printf("@"); //在这个位置画蛇 } } int main() { init(); //程序开始时的初始化操作 drawMap(); //画地图 drawSnake(); //画蛇 getchar(); return 0; }