C语言实现俄罗斯方块小游戏

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;
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • 基于C语言实现的贪吃蛇游戏完整实例代码

    本文以实例的形式讲述了基于C语言实现的贪吃蛇游戏代码,这是一个比较常见的游戏,代码备有比较详细的注释,对于读者理解有一定的帮助. 贪吃蛇完整实现代码如下: #include <graphics.h> #include <conio.h> #include <stdlib.h> #include <dos.h> #define NULL 0 #define UP 18432 #define DOWN 20480 #define LEFT 19200 #defi

  • C语言实现汉诺塔游戏

    操作就是:A B 号码A的塔顶一层放在号码B的塔顶.如1(空格) 3 回车. 话说有人能把我这C的代码添加到QT界面框架上去么?  代码写的不好 ,维护性不够,只能玩8层的,写完以后发现很难拓展,软件工程,设计模式有待提高.... 里面提示输入等级的装B用了,没有实现,大家随便输入个个位数就可以玩了. stackfunc.c #include"STACK.h" #include<stdio.h> extern ceng CENG[SIZE]; //数据入栈 void pus

  • C语言实现五子棋小游戏

    首先我们先来看一个稍微简单些的实现方式: #include <stdio.h> #include <stdlib.h> #define N 15 int chessboard[N + 1][N + 1] = { 0 }; int whoseTurn = 0; void initGame(void); void printChessboard(void); void playChess(void); int judge(int, int); int main(void) { init

  • C语言开发简易版扫雷小游戏

    前言: 想起来做这个是因为那时候某天知道了原来黑框框里面的光标是可以控制的,而且又经常听人说起这个,就锻炼一下好了. 之前就完成了那1.0的版本,现在想放上来分享却发现有蛮多问题的,而且最重要的是没什么注释[果然那时候太年轻]!现在看了也是被那时候的自己逗笑了,就修改了一些小bug,增加了算是详尽而清楚的注释,嗯,MSDN上面对各种函数的解释很详细的[又锻炼一下英语],顺便让开头和结尾的展示"动"了起来,就当作1.5的版本好了. 这个只是给出了一个实现的思路,其中肯定也有很多不合理的地

  • 基于C语言实现的迷宫游戏代码

    本文实例讲述了基于C语言实现迷宫游戏的方法,代码备有较为详尽的注释,便于读者理解.通过该游戏代码可以很好的复习C语言的递归算法与流程控制等知识,相信对于学习游戏开发的朋友有一定的借鉴价值. 完整的实例代码如下: #include <graphics.h> #include <stdlib.h> #include <stdio.h> #include <conio.h> #include <dos.h> #define N 20/*迷宫的大小,可改

  • C语言实现最简单的剪刀石头布小游戏示例

    本文实例讲述了C语言实现最简单的剪刀石头布小游戏.分享给大家供大家参考,具体如下: #include<stdio.h> #include<stdlib.h> #include<time.h> /*************\ * 剪刀 石头 布 * * 最简单小游戏 * \*************/ int main(void){ char gesture[3][10] = {"scissor","stone","clo

  • 利用C语言实现2048小游戏的方法

    准备工作 首先上一张图,因为这里只是在用C语言验证算法,所以没有对界面做很好的优化,丑是理所应当的. 了解了游戏的工作原理,实际上可以将游戏描述为四个带有方向的同一操作: 1.将所有数字向一个方向移动至中间没有空位 2.将相邻的两个相同的数字加和然后放在更靠近移动方向前部的一个位置上 另外需要判断一下玩家当前输入的内容是否可以执行,如果不可以执行等待用户下一条记录. 同时需要对游戏的进程进行控制,如果可以继续游戏,那么运行玩家继续输入下一条指令,而如果不可以进行,那么提示无法继续游戏的提示. 首

  • C语言控制台版2048小游戏

    效果不好,见谅,没事就写了一个!!! /** * @author Routh * @main.c * @date 2014, 4, 26 */ #include <stdio.h> #include <stdlib.h> #include <conio.h> #include <windows.h> // console width #define CONSOLE_WIDTH 80 #define BOX_WIDTH 10 int BOX[4][4] = {

  • C语言实现2048小游戏

    本文实例为大家分享了C语言实现2048小游戏的具体代码,供大家参考,具体内容如下 具有以下特点: 1.linux下完成 2.非堵塞键盘读取 3.随机生成2和4 #include <stdio.h> #include <stdlib.h> #include <unistd.h> #define TTY_PATH "/dev/tty" #define STTY_ON "stty raw -echo -F" #define STTY_O

  • 原创的C语言控制台小游戏

    最开始左上色块被感染,通过切换颜色,不断感染同色色块.亮点是可以切换图案,设置方块个数和最大限制次数.整体还是比较满意,希望大神指教. #include <stdio.h> #include <windows.h> #include <conio.h> #include <time.h> #include <stdlib.h> int DIFFICULT=44; int count=0 ; int TYPE_SHAPE=2 ; int flag=

  • 基于C语言实现五子棋游戏完整实例代码

    本文实例讲述了基于C语言实现五子棋游戏的方法,代码备有比较完整的注释,可以帮助读者更好的加以理解. 五子棋游戏代码如下: /* * 使用键盘的上下左右键移动棋盘,空格键表示下棋,ESC键退出程序 */ #include <stdio.h> #include <stdlib.h> #include <bios.h> #include <graphics.h> #include<malloc.h> /* * 对应键盘键的十六进制数字 */ #defi

随机推荐