C言語循環チェーンは蛇を食べるゲームを実現します。


本論文の実例では、C言語表が蛇をむさぼるゲームを実現するための具体的なコードを共有しています。参考にしてください。具体的な内容は以下の通りです。
全体的な思想
輪廻チェーンを利用して蛇の座標を保存し、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経典ミニゲームのまとめ
以上が本文の全部です。皆さんの勉強に役に立つように、私たちを応援してください。