温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

使用C语言如何实现一个俄罗斯方块小游戏

发布时间:2021-04-16 16:03:28 来源:亿速云 阅读:200 作者:Leah 栏目:编程语言

使用C语言如何实现一个俄罗斯方块小游戏?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。

具体内容如下

#include <stdio.h>  #include <stdlib.h>  #include <unistd.h>      #define TTY_PATH "/dev/tty"  #define STTY_ON "stty raw -echo -F"  #define STTY_OFF "stty -raw echo -F"    int map[21][14];  char direct;    int node[7][4][16]={   {{0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0},//长方形   {0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0},   {0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0},   {0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0}},   {{1,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0},//正方形   {1,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0},   {1,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0},   {1,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0}},   {{0,1,0,0,1,1,1,0,0,0,0,0,0,0,0,0},//3边加一中点   {0,1,0,0,0,1,1,0,0,1,0,0,0,0,0,0},   {0,0,0,0,1,1,1,0,0,1,0,0,0,0,0,0},   {0,1,0,0,1,1,0,0,0,1,0,0,0,0,0,0}},   {{0,1,1,0,0,1,0,0,0,1,0,0,0,0,0,0},//右锄头型   {0,0,0,0,1,1,1,0,0,0,1,0,0,0,0,0},   {0,1,0,0,0,1,0,0,1,1,0,0,0,0,0,0},   {1,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0}},   {{1,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0},//左锄头型   {0,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0},   {0,1,0,0,0,1,0,0,0,1,1,0,0,0,0,0},   {0,0,0,0,1,1,1,0,1,0,0,0,0,0,0,0}},   {{0,1,0,0,0,1,1,0,0,0,1,0,0,0,0,0},//右曲折型   {0,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0},   {0,1,0,0,0,1,1,0,0,0,1,0,0,0,0,0},   {0,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0}},   {{0,1,0,0,1,1,0,0,1,0,0,0,0,0,0,0},//左曲折型   {1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0},   {0,1,0,0,1,1,0,0,1,0,0,0,0,0,0,0},   {1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0}}   };    typedef struct block  {   int x;   int y;   int blockType;   int blockDirect;  }Block;  Block bl;    void init_map()//初始化边框  {   int i,j;   for(i=0; i<21; i++)   for(j=0; j<14; j++)   {   if(j==0 || j==13)   map[i][j] = 200;   else if(i==20)   map[i][j] = 201;   else   map[i][j] = 0;   }  }  void new_block()//生成随机的俄罗斯方块  {   int blockType = rand()%7;   int blockDirect = rand()%4;   int x = 1;   int y = 5;   bl.x = x;   bl.y = y;   bl.blockType = blockType;   bl.blockDirect = blockDirect;  }    void input()//将移动后的俄罗斯方块,导入地图中作标记  {   int i, j;   for(i=0; i<4; i++)   for(j=0; j<4; j++)   if(node[bl.blockType][bl.blockDirect][i*4+j]==1)   {   map[bl.x+i][bl.y+j] = 1;   }  }  void output()//移动时,将之前俄罗斯方块在地图信息清空。  {   int i, j;   for(i=0; i<4; i++)   for(j=0; j<4; j++)   if(node[bl.blockType][bl.blockDirect][i*4+j]==1)   {   map[bl.x+i][bl.y+j] = 0;   }  }    void change()//俄罗斯方格在碰撞后融入,固定  {   int i, j;   for(i=0; i<4; i++)   for(j=0; j<4; j++)   if(node[bl.blockType][bl.blockDirect][i*4+j]==1)   {   map[bl.x+i][bl.y+j] = 10;   }   for(j=1; j<13; j++)   if(map[5][j] == 10)   {   system("clear");   printf("game over !!!!!!!!!\n");   exit(1);   }  }      void print_map()//打印地图,显示信息  {   int i,j;   for(i=5; i<21; i++)   {   for(j=0; j<14; j++)   {   if(map[i][j]==200)//左右边界   printf("#");   else if(map[i][j]==201)//下边界   printf(" # ");   else if(map[i][j]==0)//空白地   printf(" ");   else if(map[i][j]==1)//移动的俄罗斯方块   printf(" * ");   else if(map[i][j]==10)//固定的俄罗斯方块   printf(" @ ");   }   printf("\n");   }  }  void delLine(int n)//消行  {   int i,j;   for(j = 1; j<13; j++)   map[n][j] = 0;   for(i = n; i>5 ; i--)   for(j = 1; j<13; j++)   if(map[i-1][j] != 1)   map[i][j] = map[i-1][j];  }    void isFillLine()//是否满足消行条件  {     int i,j;   int fals;   for(i=19; i>5; i--)   {   fals = 1;   for(j=1; j<13; j++)   {   if(map[i][j] != 10)   {   fals = 0;   continue;   }   }   if(fals)   {   delLine(i);   }   }  }  void down()//下移  {   int i, j;   int fale = 1;   for(i=3; i>=0; i--)   for(j=0; j<4; j++)   if(node[bl.blockType][bl.blockDirect][i*4+j] == 1)   if(map[bl.x+i+1][bl.y+j] == 10 || map[bl.x+i+1][bl.y+j] == 201)   {   change();   fale = 0;   new_block();   isFillLine();   return;   }   if(fale)   {   output();   bl.x += 1;   input();   }    }  void right()//右移  {   int i, j;   int fale = 1;   for(i=3; i>=0; i--)   for(j=0; j<4; j++)   if(node[bl.blockType][bl.blockDirect][i*4+j] == 1)   if(map[bl.x+i][bl.y+j+1] == 10 || map[bl.x+i][bl.y+j+1] == 200)   {   fale = 0;   return;   }   if(fale)   {   output();   bl.y += 1;   input();   }    }  void left()//左移  {   int i, j;   int fale = 1;   for(i=3; i>=0; i--)   for(j=0; j<4; j++)   if(node[bl.blockType][bl.blockDirect][i*4+j] == 1)   if(map[bl.x+i][bl.y+j-1] == 10 || map[bl.x+i][bl.y+j-1] == 200)   {   fale = 0;   return;   }   if(fale)   {   output();   bl.y -= 1;   input();   }    }    void change_block()//俄罗斯方块变形  {   int i,j;   output();   int fals = 1;   bl.blockDirect += 1;   bl.blockDirect %= 4;   for(i=0; i<4; i++)   for(j=0; j<4; j++)   if(node[bl.blockType][bl.blockDirect][i*4+j]==1)   if(map[bl.x+i][bl.y+j] != 0 )   {   fals = 0;   break;   }   if(fals)   {   input();   }else   {   bl.blockDirect -= 1;   input();   }  }    char in_direct()//非堵塞输入  {   fd_set fd;   struct timeval tv;   char ch;   FD_ZERO(&fd);   FD_SET(0, &fd);   tv.tv_sec = 0;   tv.tv_usec = 10;   if(select(1, &fd ,NULL, NULL, &tv) > 0)   {   ch = getchar();   }   return ch;  }  int main()//q 退出游戏,a,d 左右移动,空格变形  {   srand(time(NULL));   init_map();   new_block();   input();   char ch;   int num = 0;   while(1)   {   usleep(500000);   system(STTY_ON TTY_PATH);   ch = in_direct();   system(STTY_OFF TTY_PATH);   system("clear");   if(ch == 'a' && num <= 1)   {   left();   print_map();   num++;   continue;   }else if(ch == 'd' && num <= 1)   {   right();   print_map();   num++;   continue;   }else if(ch == ' ' && num <= 1 )   {   change_block();   print_map();   num++;   continue;   }else if(ch == 'q')   {   system("clear");   printf("gave over!!!!!\n");   exit(0);   }   down();   print_map();   num = 0;     }   return 0;  }

看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注亿速云行业资讯频道,感谢您对亿速云的支持。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI