程序小新编写2048求指错。

来源:互联网 发布:ubuntu 镜像源 编辑:程序博客网 时间:2024/05/19 02:25

话不多说,直接上代码

#include<stdio.h>#include<windows.h>#include<time.h>#include<conio.h>//涉及到_getch()函数#define N 4#define Test 0//值等于0时不显示int main(){    /**************************************    *窗口大小改为合适大小(这里因为还没学指针所以有些不懂) *    *                                     *    ***************************************/    HANDLE hOut; //标准输出输入句柄    COORD size = { 30, 18 }; //窗口大小    SMALL_RECT rc = { 0, 0, 30 - 1, 18 - 1 };    CONSOLE_CURSOR_INFO cursor = { 1, FALSE }; //光标信息,用于隐藏光标    hOut = GetStdHandle(STD_OUTPUT_HANDLE);    SetConsoleWindowInfo(hOut, TRUE, &rc);    SetConsoleScreenBufferSize(hOut, size);    SetConsoleCursorInfo(hOut, &cursor);    /**************************************    *使窗口大小不可改变(看不懂+1)       *    *                                     *    ***************************************/    HWND hWnd = GetConsoleWindow(); //获得cmd窗口句柄    RECT Rc;    GetWindowRect(hWnd, &Rc); //获得cmd窗口对应矩形                              //改变cmd窗口风格    SetWindowLongPtr(hWnd,        GWL_STYLE, GetWindowLong(hWnd, GWL_STYLE) & ~WS_THICKFRAME & ~WS_MAXIMIZEBOX & ~WS_MINIMIZEBOX);    //因为风格涉及到边框改变,必须调用SetWindowPos,否则无效果    SetWindowPos(hWnd,        NULL,        Rc.left,        Rc.top,        Rc.right - Rc.left, Rc.bottom - Rc.top,        NULL);    int n[N][N] = {        0,0,0,0,        0,0,0,0,        0,0,0,0,        0,0,0,0 };    int past[N][N] = {        0,0,0,0,        0,0,0,0,        0,0,0,0,        0,0,0,0 };    int i, j, m, num;    int x = 0;    int p = 10;    int c = 0;    DWORD start;    int a = 0, b = 1, score = 0;    //printf("游戏控制:        得分:\n小键盘8、↑向上   %d\n小键盘4、←向左\n小键盘6、→向右\n小键盘2、↓向下\n", score);    while (1)    {        /**************************************        *判断是否进行了移动                      *        *移动b大于0,没有移动b等于0               *        ***************************************/        for (i = 0; i < N; i++)        {            for (j = 0; j < N; j++)            {                if (n[i][j] != past[i][j])b++;            }        }        /**************************************        *取随机数使某个不等于0的值变为2或者4  *        *                                     *        ***************************************/        int nn[N][N] = {        0,0,0,0,        0,0,0,0,        0,0,0,0,        0,0,0,0};        x = 0;        for (i = 0; i < N; i++)        {            for (j = 0; j < N; j++)            {                if (n[i][j] == 0)                {                    x++;                    nn[i][j] = x;                }            }        }        if (b != 0)//没移动则不生成随机数        {            start = GetTickCount();            srand(start);            if ((rand()/* + m*/) % 100 < p)num = 4;            else num = 2;            x = rand() % x;            x++;            for (i = 0; i < N; i++)            {                for (j = 0; j < N; j++)                {                    if (nn[i][j] == x)                    {                        n[i][j] = num;                        i = j = N;                    }                }            }        }        b = 0;//确保下次使用时b为0        /**************************************        *判断是否可以继续移动                 *        *                                     *        ***************************************/        a = 0;        for (i = 0; i < N; i++)        {            for (j = 0; j < N; j++)            {                if (n[i][j] == 0)a++;                if (i != 3)                {                    if (n[i][j] == n[i + 1][j]) a++;                }                if (j != 3)                {                    if (n[i][j] == n[i][j + 1]) a++;                }            }        }        /**************************************        *显示游戏界面                         *        *                                     *        ***************************************/        printf("游戏控制:        得分:\n小键盘8、↑向上   %d\n小键盘4、←向左\n小键盘6、→向右\n小键盘2、↓向下\n", score);        for (i = 0; i < N; i++)        {            for (j = 0; j < N;j++)            {                if (n[i][j] != Test) printf("%d\t", n[i][j]);                else printf(".\t");            }            printf("\n\n");        }        if (a == 0)        {            printf("Good Game!");            system("pause");            return 0;        }//a=0代表不能移动        /**************************************        *捕捉上次运行结果                     *        *                                     *        ***************************************/        for (i = 0; i < N; i++)        {            for (j = 0; j < N; j++)            {                past[i][j] = n[i][j];            }        }        /**************************************        *检测玩家按键                         *        *                                     *        ***************************************/        char key;        int direction;        printf("请输入移动的方向:");        switch (key = _getch())        {        case -32:            switch (key = _getch())            {            case 72://UP                printf("向上移动\n");                direction = 8;                break;            case 80://DOWN                printf("向下移动\n");                direction = 2;                break;            case 75://LEFT                printf("向左移动\n");                direction = 4;                break;            case 77://RIGHT                printf("向右移动\n");                direction = 6;                break;            default:                printf("\n键入无效,请重新键入!");            }            break;        }        /**************************************        *执行按键对应的程序                   *        *                                     *        ***************************************/        if (direction == 8)        {        //补位            for (j = 0; j < N; j++)            {                for (i = N - 1; i > -1; i--)                {                    if (n[i][j] == 0)                    {                        for (m = 0; m < N - i - 1; m++)                        {                            n[i + m][j] = n[i + m + 1][j];                        }                        n[N - 1][j] = 0;                    }                }            }            //            for (j = 0; j < N; j++)            {                for (i = 0; i < N; i++)                {                    if (n[i][j] == n[i + 1][j])                    {                        n[i][j] += n[i + 1][j];                        n[i + 1][j] = 0;                        score += n[i][j];                    }                }            }            //            for (j = 0; j < N; j++)            {                for (i = N - 1; i > -1; i--)                {                    if (n[i][j] == 0)                    {                        for (m = 0; m < N - i - 1; m++)                        {                            n[i + m][j] = n[i + m + 1][j];                        }                        n[N - 1][j] = 0;                    }                }            }        }        if (direction == 2)        {            //补位            for (j = 0; j < N; j++)            {                for (i = 0; i < N; i++)                {                    if (n[i][j] == 0)                    {                        for (m = 0;m < i;m++)                        {                            n[i - m][j] = n[i - m - 1][j];                        }                        n[0][j] = 0;                    }                }            }            //合并            for (j = 0; j < N; j++)            {                for (i = N - 1; i > 0; i--)                {                    if (n[i][j] == n[i - 1][j])                    {                        n[i][j] += n[i - 1][j];                        n[i-1][j] = 0;                        score += n[i][j];                    }                }            }            //补位            for (j = 0; j < N; j++)            {                for (i = 0; i < N; i++)                {                    if (n[i][j] == 0)                    {                        for (m = 0; m < i; m++)                        {                            n[i - m][j] = n[i - m - 1][j];                        }                        n[0][j] = 0;                    }                }            }        }        if (direction == 4)        {            //补齐            for (i = 0; i < N; i++)            {                for (j = N - 1; j > -1; j--)                {                    if (n[i][j] == 0)                    {                        for (m = 0; m < N - j - 1; m++)                        {                            n[i][j + m] = n[i][j + m + 1];                        }                        n[i][N - 1] = 0;                    }                }            }            //合并相邻的两个相同项            for (i = 0; i < N; i++)            {                for (j = 0; j < N; j++)                {                    if (n[i][j] == n[i][j + 1])                    {                        n[i][j] += n[i][j + 1];                        n[i][j + 1] = 0;                        score += n[i][j];                    }                }            }            //再次补齐            for (i = 0; i < N; i++)            {                for (j = N - 1; j > -1; j--)                {                    if (n[i][j] == 0)                    {                        for (m = 0; m < N - j - 1; m++)                        {                            n[i][j + m] = n[i][m + j + 1];                        }                        n[i][N - 1] = 0;                    }                }            }        }        if (direction == 6)        {            //            for (i = 0; i < N; i++)            {                for (j = 0; j < N; j++)                 {                    if (n[i][j] == 0)                    {                        for (m = 0; m < j; m++)                        {                            n[i][j - m] = n[i][j - m - 1];                        }                        n[i][0] = 0;                    }                }            }            //            for (i = 0; i < N; i++)            {                for (j = N - 1; j > 0; j--)                {                    if (n[i][j] == n[i][j - 1])                    {                        n[i][j] += n[i][j - 1];                        n[i][j - 1] = 0;                        score += n[i][j];                    }                }            }            //            for (i = 0; i < N; i++)            {                for (j = 0; j < N; j++)                {                    if (n[i][j] == 0)                    {                        for (m = 0; m < j; m++)                        {                            n[i][j - m] = n[i][j - m - 1];                        }                        n[i][0] = 0;                    }                }            }        }        //system("pause");    }    printf("游戏结束!");    system("pause");    return 0;}

这里就大概说说运算把,就是执行按键程序的那一块,思路就是把2048中的0位全部补齐,然后判断相邻的两个数有没有一样的,如果有,相加并且把后面的命成0,相当于把“2,2,2,2“向左靠变为“4,0,4,0”,然后再次把零去掉,达到运算的目的。
取随机数使某个不等于0的值变为2或者4的那一部分我先定义nn[][]全为0,然后让2048中0在nn中变号为1、2、3……(假设m个0)然后以毫秒为种子取随机数获得100以内的任意数,和m以内的数,然后判断m是不是大于p(省成2概率),大于p生成2,反之生成4,取得的另一个数反过来看在nn的哪个位置,并且使对应的n中的位置变为2或者4。
然后就是判断是不是能继续移动,假定有:
a b c
d e f
g h i
则只需要判断前两行的下一行对应的数是否相等(例如判断a的值是否等于d)和前两列的下一列对应的数是否相等(例如a和b)。
emmmmmmmmm大概就这样把,有疑问问题欢迎评论!