小游戏1024纯C语言

时间:2024-04-08 15:36:36

程序预览:

小游戏1024纯C语言


源文件下载链接: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();
}