程序预览:
源文件下载链接:http://blog.wunanhui.wang/?c=p_slog&a=shj&s=63
源代码:
#include <stdio.h>
#include <windows.h>
#include <time.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;
*/
//基础函数头文件
/*
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);
}
/*
函数命名规则说明 动作_实体
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");
}
/*
函数命名规则说明 动作_实体
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;
}
/*#########################分隔线#########################*/
//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();
}