c语言俄罗斯方块

原创 2015年11月21日 18:08:27

linux实现

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




【C语言】俄罗斯方块的源代码

GitHub:【C语言】实现俄罗斯方块源代码Head.h#ifndef _HEAD_H_ #define _HEAD_H_#include #include #include #include #in...

【C语言】实现俄罗斯方块

学习了C语言,写一个俄罗斯方块,代码绝对可以运行 大神勿笑,只适合初学者 本人也是菜鸟1、考虑怎么存储俄罗斯方块俄罗斯方块的形状一共有19种类型,如果拿数组来表示的话,可能会比较会浪费空间(网...

VC++ 6.0 C语言实现俄罗斯方块教程

今天把我之前写的大作业分享一下吧,并教你们如何实现,希望你们看了前面的教程也能自己写一个。 1.要先下载一个 graphics.h 的头文件来绘图。 2.初始化窗口:initgraph(x...

C语言版 彩色俄罗斯方块 控制台输出

源码:  ///////////////////////////////////////////////////////////////////////////////////////////////...

俄罗斯方块C语言的初步感受

C语言作为计算机编程语言,具有功能强、语句表达简练、控制和数据结构丰富灵活、程序时空开销小的特点。她具有诸如Pascal、FORTRAN、COBOL等通用程序设计语言的特点,又具有汇编语言中的为、地址...

俄罗斯方块C语言——参考

#include #include #include #include #include #ifdef __cplusplus #define __CPPARGS ... #e...

C语言程序学习之俄罗斯方块

我最先接触的游戏当中就有俄罗斯方块,今天我就百度学习了一下它的思路和源代码: 一.思路 1.  设定小方块的大小和游戏区的坐标 每个俄罗斯方块都是有4个小方块构成的,所以我们要先设定好每个小方块...

俄罗斯方块之C语言版

#include #include #include #include #include #define MOD 28 #define SIZE_N 19 #define SIZE_M 12 in...

c语言控制台的俄罗斯方块

#include "stdafx.h" #include "plane.h" #include "myPlane.h" #include "missile.h" #define NUM 3 LRESU...
  • dyf4281
  • dyf4281
  • 2013年12月01日 23:33
  • 485

VC++ 6.0 C语言实现俄罗斯方块教程

今天把我之前写的大作业分享一下吧,并教你们如何实现,希望你们看了前面的教程也能自己写一个。 1.要先下载一个 graphics.h 的头文件来绘图。 2.初始化窗口:initgraph(x, y);这...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:c语言俄罗斯方块
举报原因:
原因补充:

(最多只允许输入30个字)