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语言版

#include #include #include #include #include #define MOD 28 #define SIZE_N 19 #define SIZE_M 12 in...
  • free4294
  • free4294
  • 2011年11月15日 21:56
  • 9616

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

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

用C语言写俄罗斯方块

用C语言写俄罗斯方块[微软用户1] 目录(需求):1.  屏幕作图与窗口实现;2.  方块的构造与产生;3.  方块的移动与翻转;4.  中断计时与方块自由下落;5.  判断方块碰撞与消行;6.  按...
  • RICH_BABA
  • RICH_BABA
  • 2010年08月15日 21:27
  • 9973

基于VC 6.0 用C语言实现的俄罗斯方块

裸写的俄罗斯方块的代码,有意见或者想征用,直接评论留言即可。 /***************************************************************/ /*俄...
  • u012520551
  • u012520551
  • 2017年03月22日 22:22
  • 1014

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

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

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

GitHub:【C语言】实现俄罗斯方块源代码Head.h#ifndef _HEAD_H_ #define _HEAD_H_#include #include #include #include #in...
  • wenqiang1208
  • wenqiang1208
  • 2017年05月05日 22:15
  • 2780

C语言图形编程--俄罗斯方块制作(一)详解

效果图   用C语言实现俄罗斯方块,需要先解决下面几个问题: 1、如何用C语言绘制图形界面 EasyX图形库(http://www.easyx.cn)即TC的图形库在VC下的移植。   包含库#in...
  • yang_yulei
  • yang_yulei
  • 2013年12月29日 22:38
  • 120537

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

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

C语言-控制台俄罗斯方块

求改进
  • Bugggget
  • Bugggget
  • 2017年04月03日 16:38
  • 4366

C语言图形编程--俄罗斯方块制作(二)源代码

所有源代码文件,此为本人2年前所作,设计上还有些缺陷。希望大家不吝指正。 /************************ (C) COPYRIGHT 2013 yang_yulei *******...
  • yang_yulei
  • yang_yulei
  • 2013年12月29日 22:39
  • 32932
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:c语言俄罗斯方块
举报原因:
原因补充:

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