日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

[C入门 - 游戏编程系列] 贪吃蛇篇(四) - 食物实现

發布時間:2025/3/20 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [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;} }

?

轉載于:https://www.cnblogs.com/git-pizcai/p/4262533.html

總結

以上是生活随笔為你收集整理的[C入门 - 游戏编程系列] 贪吃蛇篇(四) - 食物实现的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。