【成长记录】【C语言】尝试用C语言实现简易贪吃蛇

刚开始查阅资料看别人的贪吃蛇代码,看得一头雾水,比如:
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), c);
这是个什么玩意儿?
于是只能先去查阅一些资料。

1.技术支持

在稍微了解了控制台API函数后,发现这一堆巨长的字母也就是这么回事,虽然没背过,但拿过来用还是可以的。

移动光标的函数
个人感觉这个算比较重要的

void Gotoxy(int x, int y)
{
   
    COORD position = {
    y, x };
    SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), position);
}

更改字体颜色的函数
这个可以不要,纯粹是为了好看

int color(int c)
{
   
	//SetConsoleTextAttribute是API设置控制台窗口字体颜色和背景色的函数
	SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), c);       
	return 0;
}

隐藏光标的函数
在制作的过程中发现光标一闪一闪的很碍眼,最初的操作是在不需要在地图上打印东西时把光标移动到(0,0),但发现有时候光标还是会在地图内闪烁,于是加入了这个函数(这里对我来说有一个问题,会在“遗留问题部分说明”)

void cursor_visible(int size,int visible)
{
   
    CONSOLE_CURSOR_INFO cursor_info;
    cursor_info.bVisible=visible;
    cursor_info.dwSize=size;
    SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursor_info);
}

其他
笔者自己的理解:
fflush(stdin);清空缓冲区
system(“cls”);刷屏
_kbhit() 相应键盘输入
getch() 接收字符

2.前期设定

设置一些基本的要素,如一些宏定义,全局变量,蛇与食物的结构体,函数声明,下面的代码中有一些时一开始就写上的,有一些是边写边加的(做完之后发现相较于最初的设想,改了好多东西)。
我把它们写在了自己的头文件head.h里:

#ifndef HEAD_H_INCLUDED
#define HEAD_H_INCLUDED
#define TALL 30//地图高度
#define DBW 68//地图宽度
#define SNAKE_MAXLEN 500//蛇的极限长度(用于定义数组)
#define SNAKE_INI_LEN 4
#define SNAKE_INI_DELAY 200
void cursor_visible(int,int);
int color(int);
void Gotoxy(int,int);
void welcome(void);
void printboard(void);
void printnotes(void);
void printsnake(void);
void printfood(void);
void snakemove(void);
int jgameover(void);
void gameover(int);
int jeat(void);
void repr_info(void);
int score;
struct
{
   
    int x[SNAKE_MAXLEN];
    int y[SNAKE_MAXLEN];
    int delay;
    int len;//目前蛇的长度
    int dire;//direction蛇的移动方向
}snake;
struct
{
   
    int x;
    int y;
}food;
#endif // HEAD_H_INCLUDED

看别人写的贪吃蛇都没有用数组来记录蛇的位置,(猜)可能是因为数组会占用连续的空间,这样不太好。
(2020.04.15更新:他们都用的链表,当时我都没听过这东西)

3.着手实现

显示最初界面的函数

void welcome(void)
{
   
    color(6);
    Gotoxy(3,10);
    printf("欢迎来到真·终极蛇皮上帝视角之皮死人不偿命之来回咕畜之贪吃蛇!");
    Gotoxy(6,10);
    printf("不温馨的提示:请先把游戏窗口调整至\"足够大\",否则后果自负");
    Gotoxy(9,10);
    printf("按E可赛艇...  我是指按任意键开始游戏。");
    Gotoxy(12,10);
    color(7);
    system("pause");
}

效果图
效果图
画地图
发现代码写得好粗啊,浪费资源

void printboard(void)
{
   
    int i,j;
    system("cls");
    color(9);
    for(i=0;i<=TALL;i++)
        for(j=0;j<=DBW;j+=2)
            if(i==0||i==TALL||j==0||j==DBW)
            {
   
                Gotoxy(i,j);
                printf("■");
            }
    color(7);
}

显示地图之外的一些信息

void printnotes(void)
{
   
    color(2);
    Gotoxy(3,74);
    printf("当前得分:%d",score);
    Gotoxy(4,74);
    printf("当前蛇长:%d节",SNAKE_INI_LEN);
    Gotoxy(8,74);
    printf("当前难度:较为平和");
    Gotoxy(9,74);
    printf("等待延迟:%d    ms(最小为20ms)",SNAKE_INI_DELAY);
    //Gotoxy(12,74);
    //printf("历史最高分为:");
    color(7);
}

画静态蛇

void printsnake(void)
{
   
    snake.x[0]=TALL/2;
    snake.y[0]=DBW/2;
    snake.delay=SNAKE_INI_DELAY;
    snake.len=SNAKE_INI_LEN;
    snake.dire='w';
    Gotoxy(snake.x[0],snake.y[0]);
    printf("⊙");
    for(int i=1;i<4;i
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值