定数の定義
まず、ターミナルを開き、次のコマンドを実行して ncurses
ライブラリをインストールします。
sudo apt-get update
sudo apt-get install libncurses5-dev
~/project
ディレクトリに移動し、プロジェクトファイル snake.c
を作成します。
cd ~/project
touch snake.c
次に、C コードを記述する必要があります。最初のステップは、ヘッダーファイルをインクルードすることです。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/time.h>
#include <sys/types.h>
#include <unistd.h>
#include <ncurses.h>
main()
関数を書く前に、いくつかの基本的なタスクを完了しましょう。ターミナル文字インターフェイスを使用しているため、ASCII 文字が不可欠です。したがって、いくつかの定数を定義する必要があります。
#define TBool int
#define True 1
#define False 0
#define SHAPE_FOOD '@' // 食べ物
#define SHAPE_SNAKE '#' // 蛇の体
#define GAMEWIN_YLEN 15
#define GAMEWIN_XLEN 60
#define LOGWIN_YLEN 7
#define LOGWIN_XLEN (GAMEWIN_XLEN)
#define LOGBUF_NUM (LOGWIN_YLEN-2)
#define LOGBUF_LEN (GAMEWIN_XLEN-2)
#define MAXLEVEL 12
#define GetSnakeTail(s) ((s)->head->front)
WINDOW *logwin; // ログウィンドウを宣言
#define INITRUNLOG() logwin = newlogw() // カスタム関数 newlogw() を呼び出してログウィンドウを作成
#define RUNLOG(str) runlog(logwin, str) // ログウィンドウを実行してゲームのプロンプトを表示
#define DESTROYRUNLOG() delwin(logwin)
int g_level; // プレイヤーのレベル、グローバル変数
また、いくつかの構造体と列挙型の定義も追加しました。
enum TDirection {
DIR_UP,
DIR_DOWN,
DIR_LEFT,
DIR_RIGHT
};
struct TFood {
int y;
int x;
};
struct TSnakeNode {
int y;
int x;
struct TSnakeNode *front;
};
struct TSnake {
int length;
struct TSnakeNode *head;
enum TDirection dir;
};
ここで、作成する関数を宣言します。
int refreshgamew(WINDOW *win, struct TSnake *psnake);
void movesnake(struct TSnake *psnake);
int checksnake(struct TFood *pfood, struct TSnake *psnake);
void snakegrowup(struct TFood *pfood, struct TSnake *psnake);
void gameover(WINDOW *win, char *str);
struct TSnakeNode *newsnakenode(struct TSnakeNode **ppsnode, int y, int x);
WINDOW* newgamew();
struct TSnake* initsnake();
void destroysnake(struct TSnake *psnake);
void drawsnakew(WINDOW *win, struct TSnake *psnake);
void drawfoodw(WINDOW *win, struct TFood *pfood, struct TSnake *psnake);
TBool checkfood(struct TFood *pfood, struct TSnake *psnake);
WINDOW* newlogw();
void runlog(WINDOW *win, char *str);
void cleanline(WINDOW *win, int y, int x);