C言語循環チェーンは蛇を食べるゲームを実現します。
本論文の実例では、C言語表が蛇をむさぼるゲームを実現するための具体的なコードを共有しています。参考にしてください。具体的な内容は以下の通りです。
全体的な思想
輪廻チェーンを利用して蛇の座標を保存し、gotoxy関数(カーソルを指定の位置に位置させることができます)を利用して蛇の座標から「@」を出力し、複数の蛇を出力することで、蛇を発生させることができます。循環チェーンを通して蛇の移動を行い、循環チェーンの挿入要素に蛇が長くなる効果があります。以下は各機能のための関数です。
1.食いしん坊蛇の地図関数map()
2.蛇の移動move()、up()、left()などの関数
3.食品のfood()を作って、食べ物のeat_を食べます。food()
4.蛇が食べ物を食べた時に生じる成長効果スネークlink関数
5.蛇の死亡を判断し、それぞれ壁に激突するwall()と自殺suicide()
1.食いしん坊蛇の地図関数map()
ゲームの地図は閉鎖すべきエリアを採用しています。この配列を0に初期化して、ゲームの壁のへりの賦値を1にして、配列が0になると、「」を出力します。配列は1で、「〓」を出力して、地図を作ります。
コードは以下の通りです
move()関数は主に蛇の上下左右を変更します。ここでswitch関数を使って解決します。
コードは以下の通りです
コードは以下の通りです
食べ物や食べ物を食べると、乱数を発生させて一つの食品のxを生成します。y座標はそれぞれ大域変数のfood_に保存されます。xy[2]配列の中で、最後にgotoxyを利用します。xy[0]food_xy[1]ランダムに食べ物を生成する。
コードは以下の通りです
コードは以下の通りです
蛇が長くなって、蛇が食べ物を食べる時、私達は食べ物の座標を蛇の頭に変えて、それから再び蛇を印刷して、つまり蛇のなる効果が発生することができて、実質は循環チェーンに元素の挿入を行います。
このように食物の座標を循環リンクに挿入することで、蛇になる効果があります。
コードは以下の通りです
壁を突くと、蛇の頭の単一座標x軸またはy軸が壁の座標と等しいかどうかを判断するだけで、同じであれば蛇が壁にぶつかったと説明します。
コードは以下の通りです
コードは以下の通りです
すべてのコードは以下の通りです
C++クラシックミニゲームまとめ
pythonクラシックミニゲームまとめ
pythonテトリスゲーム集合
JavaScript経典ゲームは遊んで止まらないです。
java経典の小さいゲームのまとめ
javascript経典ミニゲームのまとめ
以上が本文の全部です。皆さんの勉強に役に立つように、私たちを応援してください。
全体的な思想
輪廻チェーンを利用して蛇の座標を保存し、gotoxy関数(カーソルを指定の位置に位置させることができます)を利用して蛇の座標から「@」を出力し、複数の蛇を出力することで、蛇を発生させることができます。循環チェーンを通して蛇の移動を行い、循環チェーンの挿入要素に蛇が長くなる効果があります。以下は各機能のための関数です。
1.食いしん坊蛇の地図関数map()
2.蛇の移動move()、up()、left()などの関数
3.食品のfood()を作って、食べ物のeat_を食べます。food()
4.蛇が食べ物を食べた時に生じる成長効果スネークlink関数
5.蛇の死亡を判断し、それぞれ壁に激突するwall()と自殺suicide()
1.食いしん坊蛇の地図関数map()
ゲームの地図は閉鎖すべきエリアを採用しています。この配列を0に初期化して、ゲームの壁のへりの賦値を1にして、配列が0になると、「」を出力します。配列は1で、「〓」を出力して、地図を作ります。
コードは以下の通りです
void map() //
{
int a[25][50] = {0};
int i,j;
for(i = 0; i < 50; i++)
{
a[0][i] = 1;
a[24][i] =1;
}
for(i = 0; i < 25; i++)
{
a[i][0] = 1;
a[i][49] =1;
}
for(i = 0; i < 25; i++)
for(j = 0; j < 50; j++)
{
if(j%50 == 0)
printf("
");
if(a[i][j] == 0)
{
printf(" ");
}
else
{
printf("#");
}
}
}
2.蛇の移動move()、up()、left()などの関数move()関数は主に蛇の上下左右を変更します。ここでswitch関数を使って解決します。
コードは以下の通りです
void move(struct snake *p) //
{
while(1)
{
ch = getch();
switch(ch)
{
case 'W':p = up(p);break;
case 'A':p = left(p);break;
case 'D':p = right(p);break;
case 'S':p = down(p);break;
}
}
}
蛇を動かせるのは主に蛇の座標を変更します。この時、蛇の頭は一回移動します。gotoxy()関数を利用して「@」を出力します。そして蛇尾に「」を出力します。ぐるぐる回ると蛇が移動する効果があります。蛇の上下左右は同じ方向に移動する時に単一の座標xまたはyを変更します。変更した座標を循環チェーンに保存します。移動関数は主にup()、left()などがあります。やり方が似ているので、ここではup()関数だけを展示します。コードは以下の通りです
struct snake *up(struct snake *p) //
{
int x;
int y;
x = p->pre->x; // x,y
y = p->pre->y;
while(p) // ,
{
Sleep(SNAKE_SPEED); //
y--; // ,
gotoxy(p->x,p->y); // , “ ”
printf(" ");
gotoxy(x, y); // ,"@", ,
printf("@");
suicide(p,x,y); //
p = p->next; //
p->pre->x = x; // ,
p->pre->y = y;
food(); //
eat_food(p,x,y); //
hit_wall(y); //
if(kbhit()) break; // ,
}
return p;
}
3.食品のfood()を作って、食べ物のeat_を食べます。food()食べ物や食べ物を食べると、乱数を発生させて一つの食品のxを生成します。y座標はそれぞれ大域変数のfood_に保存されます。xy[2]配列の中で、最後にgotoxyを利用します。xy[0]food_xy[1]ランダムに食べ物を生成する。
コードは以下の通りです
void food() //
{
int i;
if(!flag) // flag
{
srand( (unsigned)time( NULL ) );
for( i = 0; i < 2; i++ ) // food_(x,y)
{
food_xy[i] = rand()%24+2;
while(food_xy[0] == 1 || food_xy[0] == 25) // while
food_xy[0] = rand()%24+2; //
while(food_xy[1] >= 49 || food_xy[1] == 1)
food_xy[1] =rand()%24+2;
}
gotoxy(food_xy[0],food_xy[1]); //
printf("*");
flag = 1;
}
}
食べ物を食べたらfood()は蛇の頭が食べ物の座標と重なっているかどうかを判断します。重なったら蛇が食べ物を食べたということです。コードは以下の通りです
void eat_food(struct snake *p,int x, int y) // , x,y
{ //food_xy ,
if(x == food_xy[0] && y == food_xy[1]) //snake_link
{
p = snake_link(p);
flag = 0; // ,
printSnake(p);
gotoxy(8,0);
score = score + 1; //
printf("%d",score);
}
}
4.蛇が食べ物を食べた時に生じる成長効果スネークlink関数蛇が長くなって、蛇が食べ物を食べる時、私達は食べ物の座標を蛇の頭に変えて、それから再び蛇を印刷して、つまり蛇のなる効果が発生することができて、実質は循環チェーンに元素の挿入を行います。
このように食物の座標を循環リンクに挿入することで、蛇になる効果があります。
コードは以下の通りです
struct snake *snake_link(struct snake *p) //
{
struct snake *q;
q = (struct snake *)malloc(sizeof(struct snake)); // ,
q->x = food_xy[0]; // ,
q->y = food_xy[1];
q->pre = p->pre;
p->pre->next = q;
p->pre = q;
q->next = p;
return p;
}
5.蛇の死亡を判断し、それぞれ壁に激突するwall()と自殺suicide()壁を突くと、蛇の頭の単一座標x軸またはy軸が壁の座標と等しいかどうかを判断するだけで、同じであれば蛇が壁にぶつかったと説明します。
コードは以下の通りです
void hit_wall(int n) // , x y , ,
{
if(ch == 'W'|| ch == 'S' )
if(n == 1 || n == 25) //
{
gotoxy(0,26);
printf(" !");
printf(" :%d",score);
exit(0);
}
if(ch == 'A'|| ch == 'D' )
if(n == 0 || n == 49)
{
gotoxy(0,26);
printf(" !");
printf(" :%d",score);
exit(0);
}
}
自杀のsuicide()は蛇の头が蛇の体にぶつかったかどうかで、方法は蛇の头の座标を取り出してくるので、蛇の身の座标と対比するならば、蛇の头が蛇の体にぶつかったと说明して、本质的には循环のチェーンの値がマッチングするので、遍歴します。コードは以下の通りです
void suicide(struct snake *p, int x, int y) // ,
{
struct snake *q; // , ,
q = p;
while(q != p->next) //
{
if(p->x == x && p->y == y)
{
gotoxy(0,26);
printf(" !");
printf(" :%d",score);
exit(0);
}
else
p = p->next;
}
}
この蛇の基本機能はもう説明済みです。以下は全部コードです。すべてのコードは以下の通りです
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <conio.h>
#include <time.h>
#define SNAKE_SPEED 200 //
int score = 0; //
int flag = 0; // ,0
int food_xy[2]; //
char ch; //
struct snake //
{
int x;
int y;
struct snake *next;
struct snake *pre;
};
void HideCursor()// ,
{
CONSOLE_CURSOR_INFO cursor;
cursor.bVisible = FALSE;
cursor.dwSize = sizeof(cursor);
HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleCursorInfo(handle, &cursor);
}
void gotoxy(int x, int y) // , , ( x,y x,y)
{
HideCursor();
COORD coord = {x,y};
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
}
void map() //
{
int a[25][50] = {0};
int i,j;
for(i = 0; i < 50; i++)
{
a[0][i] = 1;
a[24][i] =1;
}
for(i = 0; i < 25; i++)
{
a[i][0] = 1;
a[i][49] =1;
}
for(i = 0; i < 25; i++)
for(j = 0; j < 50; j++)
{
if(j%50 == 0)
printf("
");
if(a[i][j] == 0)
{
printf(" ");
}
else
{
printf("#");
}
}
}
struct snake *createSnake() // , ,
{
int i;
struct snake *head,*p,*q;
p = q = (struct snake *)malloc(sizeof(struct snake));
head = NULL;
head = p;
head->pre = NULL;
for( i = 0; i < 5; i++)
{
p->x = 25 - i;
p->y = 13;
p->pre = head->pre;
head->pre = p;
q->next = p;
q = p;
p = (struct snake *)malloc(sizeof(struct snake));
}
q->next = head;
return head;
}
void printSnake(struct snake *p) // , gotoxy() ,
{
struct snake *q;
q = p;
while(q != p->next) //
{
gotoxy(p->x,p->y); // @,
printf("@");
p = p->next;
}
gotoxy(p->x,p->y);
printf("@");
gotoxy(0,0);
printf(" :"); //
}
void food() //
{
int i;
if(!flag) // flag
{
srand( (unsigned)time( NULL ) );
for( i = 0; i < 2; i++ ) // food_(x,y)
{
food_xy[i] = rand()%24+2;
while(food_xy[0] == 1 || food_xy[0] == 25) // while
food_xy[0] = rand()%24+2;
while(food_xy[1] >= 49 || food_xy[1] == 1)
food_xy[1] =rand()%24+2;
}
gotoxy(food_xy[0],food_xy[1]); //
printf("*");
flag = 1;
}
}
struct snake *snake_link(struct snake *p) //
{
struct snake *q;
q = (struct snake *)malloc(sizeof(struct snake)); // , ,
q->x = food_xy[0];
q->y = food_xy[1];
q->pre = p->pre;
p->pre->next = q;
p->pre = q;
q->next = p;
return p;
}
void eat_food(struct snake *p,int x, int y) // , x,y food_xy , snake_link
{
if(x == food_xy[0] && y == food_xy[1])
{
p = snake_link(p);
flag = 0;
printSnake(p);
gotoxy(8,0);
score = score + 1;
printf("%d",score);
}
}
void hit_wall(int n) // , x y , ,
{
if(ch == 'W'|| ch == 'S' )
if(n == 1 || n == 25)
{
gotoxy(0,26);
printf(" !");
printf(" :%d",score);
exit(0);
}
if(ch == 'A'|| ch == 'D' )
if(n == 0 || n == 49)
{
gotoxy(0,26);
printf(" !");
printf(" :%d",score);
exit(0);
}
}
void suicide(struct snake *p, int x, int y) // ,
{
struct snake *q; // , ,
q = p;
while(q != p->next) //
{
if(p->x == x && p->y == y)
{
gotoxy(0,26);
printf(" !");
printf(" :%d",score);
exit(0);
}
else
p = p->next;
}
}
struct snake *up(struct snake *p) //
{
int x;
int y;
x = p->pre->x; // x,y
y = p->pre->y;
while(p) // ,
{
Sleep(SNAKE_SPEED); //
y--; // ,
gotoxy(p->x,p->y); // , “ ”
printf(" ");
gotoxy(x, y); // ,"@", ,
printf("@");
suicide(p,x,y); //
p = p->next; //
p->pre->x = x; // ,
p->pre->y = y;
food(); //
eat_food(p,x,y); //
hit_wall(y); //
if(kbhit()) break; // ,
}
return p;
}
struct snake *left(struct snake *p) //
{
int x;
int y;
x = p->pre->x;
y = p->pre->y;
while(p)
{
Sleep(SNAKE_SPEED);
x--;
gotoxy(p->x,p->y);
printf(" ");
gotoxy(x, y);
printf("@");
suicide(p,x,y);
p = p->next;
p->pre->x = x;
p->pre->y = y;
food();
eat_food(p,x,y);
hit_wall(x);
if(kbhit()) break;
}
return p;
}
struct snake *down(struct snake *p) //
{
int x;
int y;
x = p->pre->x;
y = p->pre->y;
while(p)
{
Sleep(SNAKE_SPEED);
y++;
gotoxy(p->x,p->y);
printf(" ");
gotoxy(x, y);
printf("@");
suicide(p,x,y);
p = p->next;
p->pre->x = x;
p->pre->y = y;
food();
eat_food(p,x,y);
hit_wall(y);
if(kbhit()) break;
}
return p;
}
struct snake *right(struct snake *p) //
{
int x;
int y;
x = p->pre->x;
y = p->pre->y;
while(p)
{
Sleep(SNAKE_SPEED);
x++;
gotoxy(p->x,p->y);
printf(" ");
gotoxy(x, y);
printf("@");
suicide(p,x,y);
p = p->next;
p->pre->x = x;
p->pre->y = y;
food();
eat_food(p,x,y);
hit_wall(x);
if(kbhit()) break;
}
return p;
}
void move(struct snake *p) //
{
while(1)
{
ch = getch();
switch(ch)
{
case 'W':p = up(p);break;
case 'A':p = left(p);break;
case 'D':p = right(p);break;
case 'S':p = down(p);break;
}
}
}
int main()
{
struct snake *p;
map(); //
p = createSnake(); //
printSnake(p); //
move(p); //
return 0;
}
もっと面白い経典ミニゲームはテーマを実現して、みんなに共有します。C++クラシックミニゲームまとめ
pythonクラシックミニゲームまとめ
pythonテトリスゲーム集合
JavaScript経典ゲームは遊んで止まらないです。
java経典の小さいゲームのまとめ
javascript経典ミニゲームのまとめ
以上が本文の全部です。皆さんの勉強に役に立つように、私たちを応援してください。