ヘビを食いしん坊
くだらないことは言わないで、直接コードをつけます.
注意これはvs 2017でのプログラムであり、CodeBlocksでいくつかの関数を変更する必要がある場合は、例えば_kbhit()をkbhit()に変更します.
AddLength関数は衝突検出をついで行い,ヘッダノードと第2ノードX,Y座標の差からdangを判断する.
なお、描画はバックグラウンドデータに対して計算が遅れるため、衝突検出時に次の位置の値ではなく頭部の位置の値を直接検出する.
これは簡単に蛇を食べることができて、基礎のない人を助けてゲームの循環の過程を理解することができて、もちろん多くのすごい大神のコードも参考にすることができます.
#include
#include
#include
#include
#include
#define WIDE 42
#define HEIGHT 22
#define up 2
#define down 8
#define left 4
#define right 6// ( )
int map[HEIGHT][WIDE];//
typedef struct Snake {//
int x;
int y;
struct Snake *next;
struct Snake *back;
}snake;
int Front = right;//
int hasFood = 0;//
void InitSanke(snake *sHead);//
void Init(snake *sHead);//
void Draw(snake *sHead);//
void CreateFood();//
void Move(snake *sHead);//
void TurnMove(snake* sHead);//
int AddLength(snake *sHead, snake *s);//
int main()
{
snake *sHead = NULL, *s = NULL;
sHead = (snake*)malloc(sizeof(snake));
sHead->x = 10;
sHead->y = 20;
sHead->next = NULL;
sHead->back = NULL;
Init(sHead);
CreateFood();
Draw(sHead);
while (1)
{
system("cls");//Windows
Move(sHead);
TurnMove(sHead);
if (AddLength(sHead, s) == 0)
break;
CreateFood();
Draw(sHead);
Sleep(500);//
}
return 0;
}
void InitSanke(snake *sHead)//
{
snake *p, *q = NULL;
int i;
p = sHead;
for (i = 0; i < 3; i++)
{
q = (snake*)malloc(sizeof(snake));
q->x = 10;
q->y = 20 - i - 1;
q->next = NULL;
q->back = NULL;
p->next = q;
q->back = p;
p = p->next;
}
}
void Init(snake *sHead)//
{
int i, j, x = 10, y = 20;
for (i = 0; i < HEIGHT; i++)
for (j = 0; j < WIDE; j++)
map[i][j] = 0;
for (i = 0; i < HEIGHT; i++)
{
map[i][0] = 1;
map[i][WIDE - 1] = 1;
}
for (i = 0; i < WIDE; i++)
{
map[0][i] = 1;
map[HEIGHT - 1][i] = 1;
}
InitSanke(sHead);
}
void Draw(snake *sHead)//
{
int i, j;
snake *s = sHead;
while (s != NULL)
{
map[s->x][s->y] = 1;
s = s->next;
}
for (i = 0; inext != NULL)
p = p->next;
switch (Front)
{
case up:
while (p->back != NULL)
{
p->x = p->back->x;
p->y = p->back->y;
p = p->back;
}
p->x--;
break;
case down:
while (p->back != NULL)
{
p->x = p->back->x;
p->y = p->back->y;
p = p->back;
}
p->x++;
break;
case left:
while (p->back != NULL)
{
p->x = p->back->x;
p->y = p->back->y;
p = p->back;
}
p->y--;
break;
case right:
while (p->back != NULL)
{
p->x = p->back->x;
p->y = p->back->y;
p = p->back;
}
p->y++;
break;
default:printf("error");
}
}
void TurnMove(snake* sHead)//
{
char ch;
while (_kbhit())
{
ch = _getche();
switch (ch)
{
case '2':
if (Front == left) { sHead->x++; sHead->y++; }
if (Front == right) { sHead->x++; sHead->y--; }
if (Front == left || Front == right)
Front = down;
break;
case '8':
if (Front == left) { sHead->x--; sHead->y++; }
if (Front == right) { sHead->x--; sHead->y--; }
if (Front == left || Front == right)
Front = up;
break;
case '4':
if (Front == up) { sHead->x++; sHead->y--; }
if (Front == down) { sHead->x--; sHead->y--; }
if (Front == up || Front == down)
Front = left;
break;
case '6':
if (Front == up) { sHead->x++; sHead->y++; }
if (Front == down) { sHead->x--; sHead->y++; }
if (Front == up || Front == down)
Front = right;
break;
}
}
}
int AddLength(snake *sHead, snake *s)//
{
snake *p;
int x = sHead->x - sHead->next->x;
int y = sHead->y - sHead->next->y;//
p = sHead;
while (p->next != NULL)
p = p->next;
s = (snake*)malloc(sizeof(snake));
if (map[sHead->x][sHead->y] == 2)//
{
s->x = (p->x - p->back->x) + p->x;
s->y = (p->y - p->back->y) + p->y;
p->next = s;
s->back = p;
s->next = NULL;
hasFood = 0;
map[sHead->x + x][sHead->y + y] = 0;
return 1;
}
else if (map[sHead->x][sHead->y] == 1)//
return 0;
else
return -1;
}
注意これはvs 2017でのプログラムであり、CodeBlocksでいくつかの関数を変更する必要がある場合は、例えば_kbhit()をkbhit()に変更します.
AddLength関数は衝突検出をついで行い,ヘッダノードと第2ノードX,Y座標の差からdangを判断する.
なお、描画はバックグラウンドデータに対して計算が遅れるため、衝突検出時に次の位置の値ではなく頭部の位置の値を直接検出する.
これは簡単に蛇を食べることができて、基礎のない人を助けてゲームの循環の過程を理解することができて、もちろん多くのすごい大神のコードも参考にすることができます.