小游戏1024纯C语言

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/weixin_40756041/article/details/78321497

俄罗斯方块- 源码文件 - 点击下载
说明:本程序使用DEV即可编译
效果截图:

1024.c

#include <stdio.h>
#include <windows.h>
#include <time.h>
#include "order_b_1.h"
#include "help_fun_1.h"
#include "order_fun_1.h"
#include "order_fun_2.h"
/*#########################分隔线#########################*/
//head(),程序初始函数 
void head(){
	console();//控制窗口
	srand((unsigned)time(NULL ));// 设置随机种子
	f_all_bianliang();//全局变量初始化 
	f_shuzhu_m();//m数组初始化
	f_data();//初始化data 
	set_cursor(0);//隐藏光标 
	f_beijing();//窗口背景初始化
	copyright();//版权说明
	d_jieshao();//游戏介绍
	printf("按任意键继续.....\n");
	command(2);
	command(1);
	d_ditu();//显示地图
	d_shuoming();//游戏操作说明  
}
/*#########################分隔线#########################*/
//body(),程序主体 
void body(){
	c_weizhi();//新方块位置生成
	d_fankuai(mx,my);//显示方块
	r_m_data();//将地图记录进data 
	while(G){
		if(kbhit()){//判断是否有键按下 
			switch(getch()){//获取用户按下的按键 
				case 0xE0:switch(getch()){//分析按键 
					case 72:t_yidong(1);break;
					case 80:t_yidong(2);break;
					case 75:t_yidong(3);break;
					case 77:t_yidong(4);break;
					default:break;
				}
				break;
				case 32:command(2);break;
				default:break;
			}
		}
	}   
}
/*#########################分隔线#########################*/
//food(),程序末尾 
void food(){
	set_color(0,15);
	command(1);
	printf("游戏结束!\n");
	printf("游戏得分:%d\n",F);
	printf("重新开始:1 结束:0\n");
}
/*#########################分隔线#########################*/ 
//程序运行函数 
void run(){ 
	do{
		head();//程序初始函数
		body();//程序主体
		food();//程序末尾
	}
	while(input_int(0,1));
}
/*#########################分隔线#########################*/ 
void main(){
	run();
}

help_fun_1.h

//基础函数头文件 

/*
0 = 黑色       8 = 灰色
1 = 蓝色       9 = 淡蓝色
2 = 绿色       10 = 淡绿色
3 = 浅绿色     11 = 淡浅绿色
4 = 红色       12 = 淡红色
5 = 紫色       13 = 淡紫色
6 = 黄色       14 = 淡黄色
7 = 白色       15 = 亮白色
*/
//设置字符前景色和底色,ForeColor:字色,BackColor:背景色,基本颜色0-7,8-15是亮度加强的基本色 
void set_color(int ForeColor,int BackColor){
    HANDLE hConsole = GetStdHandle((STD_OUTPUT_HANDLE)) ;
    SetConsoleTextAttribute(hConsole,BackColor*16+ForeColor) ;
}
//设置光标,flg=1:显示光标 flg=0:隐藏光标
void set_cursor(int flg){
    HANDLE hOut=GetStdHandle(STD_OUTPUT_HANDLE);
    CONSOLE_CURSOR_INFO cursor_info={100,flg};
    SetConsoleCursorInfo(hOut,&cursor_info);
}
//设置字符显示位置
void set_cocate(int x,int y)
{
	x*=2;//增加 
	HANDLE hOut=GetStdHandle(STD_OUTPUT_HANDLE);
	COORD loc={x,y};
	SetConsoleCursorPosition(hOut,loc);
}
//执行系统命令
void command(int a){
/*
1 = 清屏
2 = 暂停 
*/
switch(a){
	case 1:system("cls");break;
	case 2:system("pause>command.txt");break;
	default:break;
	} 
}
//整形数据输入
int input_int(int i,int j){
	int a=-100,k=0;
	printf("请输入 %d~%d 的数值,并按回车确定;\n",i,j);
	while(a>j||a<i){
		if(k!=0){
			printf("输入错误,请重新输入 %d~%d 的数值,并按回车确定;\n",i,j); 
		}
		scanf("%d",&a);
		k++;
	}
	return a;
}
//版权说明 
void copyright(){
	set_cocate(0,0);
	set_color(12,15);
	printf("########################################\n");
	printf("#Created At:20170909                   #\n");
	printf("#Algorithm Gossip:tetris               #\n");
	printf("#Developer:wunanhui                    #\n");
	printf("#Referenced By:http://www.wunanhui.wang#\n");
	printf("########################################\n");
}
//控制窗口
void console(){
	HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);	
	CONSOLE_SCREEN_BUFFER_INFO bInfo; 
	GetConsoleScreenBufferInfo(hOut, &bInfo );
	SetConsoleTitle("1024"); // 设置窗口的标题
	COORD size = {30, 30};//设置窗口大小
	SetConsoleScreenBufferSize(hOut,size); 	
	//SMALL_RECT rc = {0,0,63,31};
	//SetConsoleWindowInfo(hOut,true,&rc);
}

order_b_1.h

/*#########################分隔线#########################*/
//常量定义区
//#define MAX_X 8
#define DT 4//地图大小 

/*#########################分隔线#########################*/
//全局变量定义区
int m[DT][DT];//地图数组
int mx,my;//新方块坐标 
int fi,fj;//for循环专用变量
int G;//游戏生命
int F;//游戏得分 

/*#########################分隔线#########################*/
//结构体定义区
/*
typedef struct node{
		int x;
		int y;
		struct node *next;
	}slink;
*/

order_fun_1.h

/*
函数命名规则说明 动作_实体 
1.初始化 =  f_
2.显示 =  d_
3.设置 =  s_
4.运行 = t_
5.生产 = c_ 
6.记录 = r_ 
*/
/*#########################分隔线#########################*/
//f_all_bianliang(),全局变量初始化 
void f_all_bianliang(){
	fi=fj=mx=my=F=0;
	G=1; 
}
/*#########################分隔线#########################*/
//f_shuzhu(),m数组初始化
void f_shuzhu_m(){
	for(fi=0;fi<DT;++fi){
		for(fj=0;fj<DT;++fj){
			m[fi][fj]=0; 
		}
	}
}
/*#########################分隔线#########################*/
//f_beijing(),窗口背景初始化
void f_beijing(){
	int fanwei_x=80;
	int fanwei_y=25;
	set_color(0,15);
	for(fi=0;fi<fanwei_x;++fi){
		for(fj=0;fj<fanwei_y;++fj){
			set_cocate(fi,fj);
			printf("  ");
		}
	}
}
/*#########################分隔线#########################*/
// r_m_data(),将地图记录进data 
void r_m_data(){
	if(1){
		FILE *fp;
		int i,j;
		fp=fopen("data.txt","a");
		for(fi=0;fi<DT;fi++){
			fprintf(fp,"|");
			for(fj=0;fj<DT;fj++){
				fprintf(fp,"%4d|",m[fi][fj]);
			}
			fprintf(fp,"\n");
		}	
		fprintf(fp,"\n");
		fclose(fp);
	}
}
/*#########################分隔线#########################*/
//f_data(),初始化data 
void f_data(){
	FILE *fp;
	fp=fopen("data.txt","w");
	fclose(fp);
}
/*#########################分隔线#########################*/
//d_shuoming(),游戏操作说明 
void d_shuoming(){
	set_color(0,15);
	set_cocate(0,19);
	printf("↑:上移 ↓:下移 ←:左移 →:右移 空格:暂停");
}
/*#########################分隔线#########################*/
//d_jieshao(),游戏介绍 
void d_jieshao(){
	set_color(0,15);
	printf("1024是一款简单有趣的休闲益智游戏,有点像是求合体。\n");
	printf("滑动屏幕,移动数字,相同的数就可以叠加翻倍,直到方框被数字填满,看你能得多少高分。\n");
}

order_fun_2.h

/*
函数命名规则说明 动作_实体 
1.初始化 =  f_
2.显示 =  d_
3.设置 =  s_
4.运行 = t_
5.生产 = c_ 
6.记录 = r_ 
*/
/*#########################分隔线#########################*/
//d_ditu(),显示地图 
void d_ditu(){
	int fanwei=18;
	set_color(15,0);
	for(fi=0;fi<fanwei;++fi){
		for(fj=0;fj<fanwei;++fj){
			if(fi==0||fj==0||fi==fanwei-1||fj==fanwei-1){
				set_cocate(fi,fj);
				printf("  ");
			}
		}
	}
}
/*#########################分隔线#########################*/
//d_fengshu(),显示分数
void d_fengshu(){
	set_color(12,15);
	set_cocate(0,18);
	printf("游戏得分:%d",F+=m[mx][my]);
}
/*#########################分隔线#########################*/
//c_weizhi(),新方块位置生成 
void c_weizhi(){
	int max=0,kailv;
	if(t_siwang()){G=0;return;}
	mx=rand()%DT;
	my=rand()%DT;
	while(m[mx][my]){
		mx=rand()%DT;
		my=rand()%DT;
	}
	for(fi=0;fi<DT;++fi){
		for(fj=0;fj<DT-1;++fj){
			if(max<m[fi][fj]){
				max=m[fi][fj];
			}
		}
	}
	m[mx][my]=2;
	if(max>=4&&rand()%100==0){m[mx][my]=4;}
	if(max>=8&&rand()%200==0){m[mx][my]=8;}
	if(max>=16&&rand()%300==0){m[mx][my]=16;}
	if(max>=32&&rand()%400==0){m[mx][my]=32;}
	d_fengshu();//显示分数
}
/*#########################分隔线#########################*/
//d_xinfankuai(),显示方块 
void d_fankuai(int x,int y){
	switch(m[x][y]){
		case 0 :set_color(15,15);break;
		case 2 :set_color(15,1);break;
		case 4 :set_color(15,2);break;
		case 8 :set_color(15,3);break;
		case 16 :set_color(15,4);break;
		case 32 :set_color(15,5);break;
		case 64 :set_color(15,6);break;
		case 128 :set_color(15,9);break;
		case 256 :set_color(15,10);break;
		case 512 :set_color(15,11);break;
		case 1024 :set_color(15,12);break;
		case 2048 :set_color(15,13);break;
		case 4096 :set_color(15,14);break;
		case 8192 :set_color(15,8);break;
		default:break;
	}
	for(fi=x*4+1;fi<x*4+5;++fi){
		for(fj=y*4+1;fj<y*4+5;++fj){
			set_cocate(fi,fj);
			printf("  ");
		}
	}
	set_cocate(x*4+1,y*4+2);
	switch(m[x][y]){
		case 2 :printf("%4d",m[x][y]);break;
		case 4 :printf("%4d",m[x][y]);break; 
		case 8 :printf("%4d",m[x][y]);break;
		case 16 :printf("%4d",m[x][y]);break;
		case 32 :printf("%4d",m[x][y]);break;
		case 64 :printf("%4d",m[x][y]);break;
		case 128 :printf("%5d",m[x][y]);break;
		case 256 :printf("%5d",m[x][y]);break;
		case 512 :printf("%5d",m[x][y]);break;
		case 1024 :printf("%6d",m[x][y]);break;
		case 2048 :printf("%6d",m[x][y]);break;
		case 4096 :printf("%6d",m[x][y]);break;
		case 8192 :printf("%6d",m[x][y]);break;
		default:break;
	}
}
/*#########################分隔线#########################*/
//t_yidong(),移动方块 
void t_yidong(int a){
	int b=1;
	switch(a){
		case 1 :
			while(b){
				b=0;
				for(fi=0;fi<DT;++fi){
					for(fj=0;fj<DT-1;++fj){
						if(m[fi][fj]==0&&m[fi][fj+1]!=0){
							m[fi][fj]=m[fi][fj+1];
							m[fi][fj+1]=0;
							b=1;
						}
					}
				}
			}
			for(fi=0;fi<DT;++fi){
				for(fj=0;fj<DT-1;++fj){
					if(m[fi][fj]==m[fi][fj+1]&&m[fi][fj]!=0){
						m[fi][fj]*=2;
						m[fi][fj+1]=0;
						break;
					}
				}
			}
			b=1; 
			while(b){
				b=0;
				for(fi=0;fi<DT;++fi){
					for(fj=0;fj<DT-1;++fj){
						if(m[fi][fj]==0&&m[fi][fj+1]!=0){
							m[fi][fj]=m[fi][fj+1];
							m[fi][fj+1]=0;
							b=1;
						}
					}
				}
			}
			break;
		case 2 :
			while(b){
				b=0;
				for(fi=0;fi<DT;++fi){
					for(fj=DT-1;fj>0;--fj){
						if(m[fi][fj]==0&&m[fi][fj-1]!=0){
							m[fi][fj]=m[fi][fj-1];
							m[fi][fj-1]=0;
							b=1;
						}
					}
				}
			}
			for(fi=0;fi<DT;++fi){
				for(fj=DT-1;fj>0;--fj){
					if(m[fi][fj]==m[fi][fj-1]&&m[fi][fj]!=0){
						m[fi][fj]*=2;
						m[fi][fj-1]=0;
						break;
					}
				}
			}
			b=1; 
			while(b){
				b=0;
				for(fi=0;fi<DT;++fi){
					for(fj=DT-1;fj>0;--fj){
						if(m[fi][fj]==0&&m[fi][fj-1]!=0){
							m[fi][fj]=m[fi][fj-1];
							m[fi][fj-1]=0;
							b=1;
						}
					}
				}
			}
		break;
		case 3 :
			while(b){
				b=0;
				for(fj=0;fj<DT;++fj){
					for(fi=0;fi<DT-1;++fi){
						if(m[fi][fj]==0&&m[fi+1][fj]!=0){
							m[fi][fj]=m[fi+1][fj];
							m[fi+1][fj]=0;
							b=1;
						}
					}
				}
			}
			for(fj=0;fj<DT;++fj){
				for(fi=0;fi<DT-1;++fi){
					if(m[fi][fj]==m[fi+1][fj]&&m[fi][fj]!=0){
						m[fi][fj]*=2;
						m[fi+1][fj]=0;
						break;
					}
				}
			}
			b=1; 
			while(b){
				b=0;
				for(fj=0;fj<DT;++fj){
					for(fi=0;fi<DT-1;++fi){
						if(m[fi][fj]==0&&m[fi+1][fj]!=0){
							m[fi][fj]=m[fi+1][fj];
							m[fi+1][fj]=0;
							b=1;
						}
					}
				}
			}
		break;
		case 4 :
			while(b){
				b=0;
				for(fj=0;fj<DT;++fj){
					for(fi=DT-1;fi>0;--fi){
						if(m[fi][fj]==0&&m[fi-1][fj]!=0){
							m[fi][fj]=m[fi-1][fj];
							m[fi-1][fj]=0;
							b=1;
						}
					}
				}
			}
			for(fj=0;fj<DT;++fj){
				for(fi=DT-1;fi>0;--fi){
					if(m[fi][fj]==m[fi-1][fj]&&m[fi][fj]!=0){
						m[fi][fj]*=2;
						m[fi-1][fj]=0;
						break;
					}
				}
			}
			b=1; 
			while(b){
				b=0;
				for(fj=0;fj<DT;++fj){
					for(fi=DT-1;fi>0;--fi){
						if(m[fi][fj]==0&&m[fi-1][fj]!=0){
							m[fi][fj]=m[fi-1][fj];
							m[fi-1][fj]=0;
							b=1;
						}
					}
				}
			}
		break;
		default:break;
	}
	r_m_data();//将地图记录进data
	int i,j;
	for(i=0;i<DT;++i){
		for(j=0;j<DT;++j){
			d_fankuai(i,j);//显示方块
		}
	}
	c_weizhi();//新方块位置生成
	d_fankuai(mx,my);//显示方块
} 
/*#########################分隔线#########################*/
//t_siwang(),死亡检测 
int t_siwang(){
	for(fi=0;fi<DT;++fi){
		for(fj=0;fj<DT;++fj){
			if(m[fi][fj]==0){
				return 0;
			}
		}
	}
	return 1;
}

猜你喜欢

转载自blog.csdn.net/weixin_40756041/article/details/78321497