新浦京81707con > 注册购买 > [C入门,c入门

原标题:[C入门,c入门

浏览次数:170 时间:2019-11-13

[C入门,c入门

  蛇是其风姿罗曼蒂克游乐的台柱,要落到实处的效果与利益也是最复杂的多少个。因为蛇不唯有有总体性,还应该有表现。它会动,还恐怕会吃东西,还社长大!並且还有只怕会死!那是很可怜的。小编历来看不懂复杂的代码,也写不出复杂的代码。所以对于蛇,我很郁结,如何本领简单的得以完结它。

 

  毫无疑忌的少数是,食物具有的品质,蛇也装有。蛇必需存在于世界中,有大大小小和岗位以至颜色。那样最起码能够估算出三个蛇的回顾定义。可是这还贫乏,蛇是活的,它主动,就亟须有速度和动向,它能吃,就必需能长大。所以,抛开其余的总体,它最轻易易行的方式最少也得这样:

typedef struct Snake
{
    World *world;
    int x, y, size;
    SDL_Color color;
    int speed, length, direction;

    struct Body
    {
        int x, y;
        int direction;
        struct Body *next;
    } *body;
} Snake;

而本身要的正是简约,于是乎,风姿洒脱咬牙风流倜傥跺脚,就它了!

 

  既然采用了创立那样的一条蛇,那作者也只能选取制造它了。

extern Snake * SNK_CreateSnake(World *world, int size, int x, int y);
extern void SNK_DestroySnake(Snake *snake);

 

  这样的蛇,要操控它的品质,就亟须兑现多个函数。而出于个性之间的交互作用关系,就得贯彻更加多的函数。举例,改动蛇的来头,会有二种结果:1. 积极向上,2. 会死!吃掉食物,也是有三种结果:1. 能长大,2. 被撑死。所以,作者把这几个函数风姿罗曼蒂克风华正茂细分,分为属性函数、行为函数以至附加函数。

 

天性相关函数:

extern void SNK_SetSnakeSpeed(Snake *snake, int speed);
extern void SNK_SetSnakeDirection(Snake *snake, int direction);
extern void SNK_SetSnakeColor(Snake *snake, Uint8 r, Uint8 g, Uint8 b, Uint8 a);

行事相关函数:

extern void SNK_MoveSnake(Snake *snake);
extern void SNK_GrowSnake(Snake *snake);

外加函数:

extern int SNK_HasIntersection(Snake *snake, SDL_Rect rect);
extern int SNK_GetSnakeStatus(Snake *snake);

 

  当这么一条蛇被完完整整的创办出来,笔者就能够绝不记挂的让它暴光在世界中间。

extern void SNK_DrawSnake(Snake *snake);

 

  这是作者当下所能想到的最简易的方法去落到实处一条蛇了。对,只是蛇!你会意识,从头到位,贪吃蛇游戏都是蛇在吃食物,可是本身并不曾在蛇的概念中,蕴涵别的和食品有关的函数或变量, 笔者只是站在三个皇天的角度去创设生命罢了。蛇吃哪些不是本身要关爱的,笔者创立了它,并创立了平整,让它去适应世界。

 

以下是snk-snake.h文件中的完整蛇定义:

#ifndef SNK_SNAKE_H_HEADER
#define SNK_SNAKE_H_HEADER

#define SNAKE_UP            (1 << 0)
#define SNAKE_LEFT          (1 << 1)
#define SNAKE_DOWN          (1 << 2)
#define SNAKE_RIGHT         (1 << 3)

#define SNAKE_DIED          (1 << 4)
#define SNAKE_MOVABLE       (1 << 5)

#define SNAKE_INIT_COLOR    0,    0xff, 0, 0xff
#define SNAKE_DIED_COLOR    0xff, 0,    0, 0xff
#define SNAKE_CTMV_COLOR    0xff, 0xff, 0, 0xff

#define SNAKE_INIT_SPEED    900

#include "snk-world.h"

typedef struct Snake
{
    World *world;
    int x, y, size;
    SDL_Color color;
    int speed, length, direction;

    struct Body
    {
        int x, y;
        int direction;
        struct Body *next;
    } *body;
} Snake;

extern Snake * SNK_CreateSnake(World *world, int size, int x, int y);
extern void SNK_DestroySnake(Snake *snake);

extern int SNK_HasIntersection(Snake *snake, SDL_Rect rect);

extern void SNK_MoveSnake(Snake *snake);
extern void SNK_DrawSnake(Snake *snake);
extern void SNK_GrowSnake(Snake *snake);

extern int SNK_GetSnakeStatus(Snake *snake);

extern void SNK_SetSnakeSpeed(Snake *snake, int speed);
extern void SNK_SetSnakeDirection(Snake *snake, int direction);
extern void SNK_SetSnakeColor(Snake *snake, Uint8 r, Uint8 g, Uint8 b, Uint8 a);

#endif

最起始的几行宏定义是蛇的动向,然后是蛇的情事:已死还能运动。最上边几行宏只是为了提供方便,仅在设置属性时利用。SNAKE_INIT_SPEED设置为900阿秒,表示蛇的快慢,它是时间值,并非活动的间隔。

蛇是以此游戏的中流砥柱,要实现的意义也是最复杂的一个。因为蛇不仅只有品质,还应该有表现。它会动,还恐怕会吃东西,还组织首领大!而...

[C入门,c入门

  由于食物是贪吃蛇游戏中最简便的豆蔻梢头局地,並且和其它一些关联性不强,基本上是叁个独门的风华正茂对,所以笔者筹算先落成它。

 

自个儿的主见是食品必得在世界中才具被成立出来,也便是说,先有世界再有食品,所以作者得先判断世界是不是留存,存在的话技能够创制食物。

Food * SNK_CreateFood(World *world, int size)
{
    Food *food;

    if (world == 0) return 0;

    if ((food = (Food *)SDL_malloc(sizeof(Food))) == 0) return 0;

    INIT_FOOD(world, size);

    return food;
}

对于指针变量,小编连连显式地将它和数值相比较,那有扶植制止有些隐形的荒谬。宏INIT_FOOD用来开首化Food结构体,在最终的完好源码中能够看出定义。

 

由于food是用SDL_malloc函数分配的,所以销毁食物假如释放内部存款和储蓄器就能够了。在C语言中,释放后的指针并不为零, 三个好的习于旧贯是:每一次释放指针后,显式的中指针置为零。作者老是会鲁人持竿那些习贯,除非释放指针后前后相继也登时退出,否则小编接连将释放后的指针置为零。

void SNK_DestroyFood(Food *food)
{
    SDL_free(food);
    food = 0;
}

 

自个儿对食物的美或丑未有别的概念,所以自个儿这里所谓的食物仅仅只是多个矩形。在画食品这里能够有许多新意,画三个奇葩的食物能够令人耳目风姿洒脱新。但是自个儿只力求删芜就简,意思到了就能够了。

void SNK_DrawFood(Food *food)
{
    SDL_Rect rect;

    if (food != 0)
    {
        rect.x = food->x;
        rect.y = food->y;
        rect.w = rect.h = food->size;

        if (((food->world != 0) ? (food->world->render != 0) : 0))
        {
            SDL_SetRenderDrawColor(food->world->render,
                                   food->color.r, food->color.g,
                                   food->color.b, food->color.a);
            SDL_RenderDrawRect(food->world->render, &rect);
        }
    }
}

 

 

安装食品地方的函数定义的一点也不细略,给四个食物和坐标就足以了。可是中间贯彻起来自个儿照旧做了几许论断和管理,为了确定保证双方面包车型客车动向:1. 管教坐标是正数且在世界范围内。2. 食物坐标要为食品大小的整几倍。固然不是整几倍也能行,可是小编是准备将食品和蛇设置为近似大小的,假使不是整好数倍,就能生出蛇尚未吃完食品,食品就消失了的处境。

void SNK_SetFoodPosition(Food *food, int x, int y)
{
    if (((food != 0) ? (food->world != 0) : 0))
    {
        if (SDL_abs(x) > food->world->w)
            x = food->world->w;

        if (SDL_abs(y) > food->world->h)
            y = food->world->h;

        if (food->size != 0)
        {
            food->x = (SDL_abs(x) / food->size) * food->size;
            food->y = (SDL_abs(y) / food->size) * food->size;
        }
    }
}

 

 

提及底正是设置食品颜色了,这么些十分轻易,依次赋值就能够了。

void SNK_SetFoodColor(Food *food, Uint8 r, Uint8 g, Uint8 b, Uint8 a)
{
    if (food != 0)
    {
        food->color.r = r;
        food->color.g = g;
        food->color.b = b;
        food->color.a = a;
    }
}

 

以下是snk-food.c文件的完好内容:

#include "snk-food.h"

#define INIT_FOOD(world, size)                                          
    food->world = (world);                                              
    food->x = food->y = 0;                                              
    food->size = (size) ? SDL_abs(size) : 0;                            
    food->color.r = food->color.g = food->color.b = food->color.a = 0;

Food * SNK_CreateFood(World *world, int size)
{
    Food *food;

    if (world == 0) return 0;

    if ((food = (Food *)SDL_malloc(sizeof(Food))) == 0) return 0;

    INIT_FOOD(world, size);

    return food;
}

void SNK_DestroyFood(Food *food)
{
    SDL_free(food);
    food = 0;
}

void SNK_DrawFood(Food *food)
{
    SDL_Rect rect;

    if (food != 0)
    {
        rect.x = food->x;
        rect.y = food->y;
        rect.w = rect.h = food->size;

        if (((food->world != 0) ? (food->world->render != 0) : 0))
        {
            SDL_SetRenderDrawColor(food->world->render,
                                   food->color.r, food->color.g,
                                   food->color.b, food->color.a);
            SDL_RenderDrawRect(food->world->render, &rect);
        }
    }
}

void SNK_SetFoodPosition(Food *food, int x, int y)
{
    if (((food != 0) ? (food->world != 0) : 0))
    {
        if (SDL_abs(x) > food->world->w)
            x = food->world->w;

        if (SDL_abs(y) > food->world->h)
            y = food->world->h;

        if (food->size != 0)
        {
            food->x = (SDL_abs(x) / food->size) * food->size;
            food->y = (SDL_abs(y) / food->size) * food->size;
        }
    }
}

void SNK_SetFoodColor(Food *food, Uint8 r, Uint8 g, Uint8 b, Uint8 a)
{
    if (food != 0)
    {
        food->color.r = r;
        food->color.g = g;
        food->color.b = b;
        food->color.a = a;
    }
}

 

由于食物是贪吃蛇游戏中最轻松易行的黄金时代有的,而且和其它界分关联性不强,基本上是叁个独门的某个,所以笔者筹划先实现它。...

本文由新浦京81707con发布于注册购买,转载请注明出处:[C入门,c入门

关键词: 新浦京81707con

上一篇:澳门葡京赌场官网获取实例运行时间StopWatch类

下一篇:没有了