卖萌向2048小游戏

五一前的某天 离散课上突发奇想 我是不是可以用c语言模拟各种小游戏

当时想了三个 贪吃蛇 2048 俄罗斯方块

俄罗斯方块的话..想起了ccf中的简单的模拟下落都熬了将近一个小时 更别说各种随机判断了 当场放弃..淞淞告诉我有现成的程序 几十行就可以..简直..

然后思考了一下贪吃蛇 我的思想是枚举蛇身 没错就是枚!举! 反正不怕超时...

当时认为2048应该是最简单的 毕竟只有16个空 枚举起来..很方便..(只会枚举的渣渣瑟瑟发抖)

本来打算五一假期看看 然而当时准备省赛就忘了这件事 (其实假期也没有准备省赛...)

创业培训的时候看见小牟搞了个贪吃蛇代码 各种指针递归...代码极其魔性 我是看不懂的 .. 不过F9之后很高端的样子就对了...

于是忽然想起自己也想过这种小东西 于是今天十点多早起要把认为最简单的2048搞出来

看了二十分钟愣是没有搞懂怎么把程序弄成始终是一个框的..

但是这并不能难住我 因为我精通枚举...

于是我还是弄了个每次操作后都打印一遍的版本...

不到一个小时就打出来了..果然极其简单

交给杨杨试玩 过了一会给出了两个回答

1 伤眼伤眼伤眼

2 把程序给了一个搞游戏的大神朋友看 答曰:这么智障的程序谁不会写...

喂喂...

等我学会了高端的做法一定要搞出来一个不伤眼的程序...

#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<map>
#include<math.h>
#include<queue>
#include<time.h>
using namespace std;
/// 2048游戏
/// 目标 每次读取一个命令 wasd 都进行一次滑动屏幕
/// 并没有学会systempause一类..所以..暂且每次进行命令后..都进行一次重新printf...伤眼
/// 我了解的2048游戏
/// 每次进行滑动后 所有数字朝滑动方向进行试加
/// 每次试加 如果两个数字相同 就相加
/// 每次试加后 随机生成 2
/// 如果没有位置生成 2 游戏结束
/// 游戏格式 4*4
int a[5][5];
bool f;
void init() /// 初始化
{
    srand(time(0)); /// 生成随机数  x = rand();
    memset(a,0,sizeof(a));
    f=false;
}
void print() /// 试加后的输出
{
    for(int i=1; i<=4; i++)
    {
        for(int k=1; k<=4; k++)
        {
            if(a[i][k]!=0)
            {
                int z=a[i][k];
                int d=0;
                while(z)
                {
                    d++;
                    z/=10;
                }
                for(int j=1; j<=7-d; j++)
                    printf("_");
                printf("%d",a[i][k]);
            }
            else
            {
                for(int j=1; j<=7; j++)
                    printf("*");
            }
        }
        printf("
");
    }
}
bool caozuo(char c)
{
    bool kexing=false;
    if(c=='a')
    {
        for(int i=1; i<=4; i++)
        {
            for(int k=2; k<=4; k++)
            {
                if(a[i][k]==0)
                    continue;
                int j=k-1;
                while(j>=1&&a[i][j]==0)
                    j--;
                if(j==0)
                    continue;
                if(a[i][j]!=a[i][k])
                    continue;
                a[i][j]+=a[i][k];
                a[i][k]=0;
                kexing=true;
            }
            for(int k=2; k<=4; k++)
            {
                if(a[i][k]==0)
                    continue;
                int j=k-1;
                while(j>=1&&a[i][j]==0)
                    j--;
                j++;
                if(j==k)
                    continue;
                a[i][j]=a[i][k];
                a[i][k]=0;
                kexing=true;
            }
        }
    }
    else if(c=='d')
    {
        for(int i=1; i<=4; i++)
        {
            for(int k=3; k>=1; k--)
            {
                if(a[i][k]==0)
                    continue;
                int j=k+1;
                while(j<=4&&a[i][j]==0)
                    j++;
                if(j==5)
                    continue;
                if(a[i][j]!=a[i][k])
                    continue;
                a[i][j]+=a[i][k];
                a[i][k]=0;
                kexing=true;
            }
            for(int k=3; k>=1; k--)
            {
                if(a[i][k]==0)
                    continue;
                int j=k+1;
                while(j<=4&&a[i][j]==0)
                    j++;
                j--;
                if(j==k)
                    continue;
                a[i][j]=a[i][k];
                a[i][k]=0;
                kexing=true;
            }
        }
    }
    else if(c=='w')
    {
        for(int k=1; k<=4; k++)
        {
            for(int i=2; i<=4; i++)
            {
                if(a[i][k]==0)
                    continue;
                int j=i-1;
                while(j>=1&&a[j][k]==0)
                    j--;
                if(j==0)
                    continue;
                if(a[j][k]!=a[i][k])
                    continue;
                a[j][k]+=a[i][k];
                a[i][k]=0;
                kexing=true;
            }
            for(int i=2; i<=4; i++)
            {
                if(a[i][k]==0)
                    continue;
                int j=i-1;
                while(j>=1&&a[j][k]==0)
                    j--;
                j++;
                if(j==i)
                    continue;
                a[j][k]=a[i][k];
                a[i][k]=0;
                kexing=true;
            }
        }
    }
    else if(c=='s')
    {
        for(int k=1; k<=4; k++)
        {
            for(int i=3; i>=1; i--)
            {
                if(a[i][k]==0)
                    continue;
                int j=i+1;
                while(j<=4&&a[j][k]==0)
                    j++;
                if(j==5)
                    continue;
                if(a[j][k]!=a[i][k])
                    continue;
                a[j][k]+=a[i][k];
                a[i][k]=0;
                kexing=true;
            }
            for(int i=3; i>=1; i--)
            {
                if(a[i][k]==0)
                    continue;
                int j=i+1;
                while(j<=4&&a[j][k]==0)
                    j++;
                j--;
                if(j==i)
                    continue;
                a[j][k]=a[i][k];
                a[i][k]=0;
                kexing=true;
            }
        }
    }
    if(f==true)
    {
        if(!kexing)
            return true;
    }
    f=true;
    int have=1000;
    for(int i=1; i<=4; i++)
    {
        for(int k=1; k<=4; k++)
        {
            if(a[i][k]==0)
            {
                a[i][k]=have;
                have++;
            }
        }
    }
    if(have==1000)
        return false;
    int ok=have-1000;
    int z=rand()%ok;
    for(int i=1; i<=4; i++)
    {
        for(int k=1; k<=4; k++)
        {
            if(a[i][k]>=1000&&a[i][k]<=1015)
            {
                a[i][k]-=1000;
                if(a[i][k]==z)
                    a[i][k]=2;
                else a[i][k]=0;
            }
        }
    }
    print();
    return true;
}
int main()
{
    init();
    char command[3];
    bool jx=true;
    while(jx)
    {
        scanf("%s",command);
        jx=caozuo(command[0]);
    }
    for(int i=1; i<=5; i++)
        printf("
");
    printf("you lose
") ;
}

分割线-------------------------------- 2017.3.23

后来我学会了那种一直是一个框的办法..发现..原理很简单...

之所以一直是那一个框跑来跑去 不是因为这个框会变 而是每次都清了一下屏 于是屏幕啥都没有 然后就可以...再输出一个了... 清屏是window.h下面的system("cls")

至于输入后直接就有反应 不用enter 是用了conio.h下面的kbhit() 和 getch() 

非阻塞函数和阻塞函数

kbhit是非阻塞函数 它的作用是 如果按了键盘 就返回非0 如果没按就是0 也就是说按不按键盘 这个函数都会返回

而getch 是阻塞函数 它的作用是 接受键盘输入的东西 也就是说 如果不按键盘 就会一直卡在这儿 啥都不返回

如果要做贪吃蛇的话 肯定不能等到kbhit或者getch的时候再清屏 让它按原有方向走

这时候就要用到 Sleep(int time) 这是一个time.h的函数 可以..睡一会冷静一下

#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<map>
#include<math.h>
#include<queue>
#include<time.h>
#include<windows.h>
#include<conio.h>
using namespace std;
/// 2048游戏
/// 目标 每次读取一个命令 wasd 都进行一次滑动屏幕
/// 并没有学会systempause一类..所以..暂且每次进行命令后..都进行一次重新printf...伤眼
/// 我了解的2048游戏
/// 每次进行滑动后 所有数字朝滑动方向进行试加
/// 每次试加 如果两个数字相同 就相加
/// 每次试加后 随机生成 2
/// 如果没有位置生成 2 游戏结束
/// 游戏格式 4*4
int a[5][5];
bool f;
void init() /// 初始化
{
    srand(time(0)); /// 生成随机数  x = rand();
    memset(a,0,sizeof(a));
    f=false;
}
void print() /// 试加后的输出
{
    for(int i=1; i<=4; i++)
    {
        for(int k=1; k<=4; k++)
        {
            if(a[i][k]!=0)
            {
                int z=a[i][k];
                int d=0;
                while(z)
                {
                    d++;
                    z/=10;
                }
                for(int j=1; j<=7-d; j++)
                    printf(" ");
                printf("%d",a[i][k]);
            }
            else
            {
                for(int j=1; j<=7; j++)
                    printf(" ");
            }
        }
        printf("


");
    }
}
bool caozuo(char c)
{
    bool kexing=false;
    if(c=='a')
    {
        for(int i=1; i<=4; i++)
        {
            for(int k=2; k<=4; k++)
            {
                if(a[i][k]==0)
                    continue;
                int j=k-1;
                while(j>=1&&a[i][j]==0)
                    j--;
                if(j==0)
                    continue;
                if(a[i][j]!=a[i][k])
                    continue;
                a[i][j]+=a[i][k];
                a[i][k]=0;
                kexing=true;
            }
            for(int k=2; k<=4; k++)
            {
                if(a[i][k]==0)
                    continue;
                int j=k-1;
                while(j>=1&&a[i][j]==0)
                    j--;
                j++;
                if(j==k)
                    continue;
                a[i][j]=a[i][k];
                a[i][k]=0;
                kexing=true;
            }
        }
    }
    else if(c=='d')
    {
        for(int i=1; i<=4; i++)
        {
            for(int k=3; k>=1; k--)
            {
                if(a[i][k]==0)
                    continue;
                int j=k+1;
                while(j<=4&&a[i][j]==0)
                    j++;
                if(j==5)
                    continue;
                if(a[i][j]!=a[i][k])
                    continue;
                a[i][j]+=a[i][k];
                a[i][k]=0;
                kexing=true;
            }
            for(int k=3; k>=1; k--)
            {
                if(a[i][k]==0)
                    continue;
                int j=k+1;
                while(j<=4&&a[i][j]==0)
                    j++;
                j--;
                if(j==k)
                    continue;
                a[i][j]=a[i][k];
                a[i][k]=0;
                kexing=true;
            }
        }
    }
    else if(c=='w')
    {
        for(int k=1; k<=4; k++)
        {
            for(int i=2; i<=4; i++)
            {
                if(a[i][k]==0)
                    continue;
                int j=i-1;
                while(j>=1&&a[j][k]==0)
                    j--;
                if(j==0)
                    continue;
                if(a[j][k]!=a[i][k])
                    continue;
                a[j][k]+=a[i][k];
                a[i][k]=0;
                kexing=true;
            }
            for(int i=2; i<=4; i++)
            {
                if(a[i][k]==0)
                    continue;
                int j=i-1;
                while(j>=1&&a[j][k]==0)
                    j--;
                j++;
                if(j==i)
                    continue;
                a[j][k]=a[i][k];
                a[i][k]=0;
                kexing=true;
            }
        }
    }
    else if(c=='s')
    {
        for(int k=1; k<=4; k++)
        {
            for(int i=3; i>=1; i--)
            {
                if(a[i][k]==0)
                    continue;
                int j=i+1;
                while(j<=4&&a[j][k]==0)
                    j++;
                if(j==5)
                    continue;
                if(a[j][k]!=a[i][k])
                    continue;
                a[j][k]+=a[i][k];
                a[i][k]=0;
                kexing=true;
            }
            for(int i=3; i>=1; i--)
            {
                if(a[i][k]==0)
                    continue;
                int j=i+1;
                while(j<=4&&a[j][k]==0)
                    j++;
                j--;
                if(j==i)
                    continue;
                a[j][k]=a[i][k];
                a[i][k]=0;
                kexing=true;
            }
        }
    }
    if(f==true)
    {
        /*if(!kexing)
            return false ;*/
    }
    f=true;
    int have=1000;
    for(int i=1; i<=4; i++)
    {
        for(int k=1; k<=4; k++)
        {
            if(a[i][k]==0)
            {
                a[i][k]=have;
                have++;
            }
        }
    }
    if(have==1000)
        return false;
    int ok=have-1000;
    int z=rand()%ok;
    for(int i=1; i<=4; i++)
    {
        for(int k=1; k<=4; k++)
        {
            if(a[i][k]>=1000&&a[i][k]<=1015)
            {
                a[i][k]-=1000;
                if(a[i][k]==z)
                    a[i][k]=2;
                else a[i][k]=0;
            }
        }
    }
    print();
    return true;
}
int main()
{
    init();
    char command;
    bool jx=true;
    while(1)
    {
        if(kbhit()) {
            system("cls") ;
            command = getch() ;
            jx=caozuo(command);
        }


    }
    for(int i=1; i<=5; i++)
        printf("
");
    printf("you lose
") ;
}

升级完成! 当然以后很有可能再次升级  毕竟那时候我的代码写得真的丑... 

原文地址:https://www.cnblogs.com/rayrayrainrain/p/5572994.html