标题:断断续续自学了很久,没方向感。这几天写的垃圾2048,望指教需要通过学哪些 ...
只看楼主
TAAAAB
Rank: 7Rank: 7Rank: 7
来 自:湖南
等 级:黑侠
威 望:1
帖 子:243
专家分:635
注 册:2011-5-29
结帖率:95.24%
已结贴  问题点数:20 回复次数:11 
断断续续自学了很久,没方向感。这几天写的垃圾2048,望指教需要通过学哪些东西来优化。
以这代码为例,如果想代码更清晰易懂,界面更美观,更友好,要编成类似手机上的《全民2048》那样需要学哪些,怎么学?


程序代码:
/* 2048 */
/*方向键控制上下左右*/

#include <stdio.h>
#include <stdlib.h>     //包含生成随机数函数rand()
#include <time.h>        //为生成随机数提供种子
#include <conio.h>        //包含getch()
#include "windows.h"

int shenchen (void);        //生成随机数为2或者4
void zuobiao (int pa[][4]);    //生成坐标,并填入数字
int pandan(const int a[][4], int ch);    //判断用户选择的方向是否合法
int gameover (const int a[][4]);        //判断游戏结束
void display(const int a[][4]);
void w(int a[][4]);
void s(int a[][4]);
void a(int a[][4]);
void d(int a[][4]);

void display(const int a[][4])
{
    int i, j;

    for (i = 0; i < 4; i++)
    {
        puts("|-----+-----+-----+-----|");
        printf("|");
        for (j = 0; j < 4; j++)
        if (a[i][j] == 0)
        {
            printf("%5c", ' ');
            printf("|");
        }
        else
        {
            printf("%5d", a[i][j]);
            printf("|");
        }
        printf("\n");
        if (i == 3)
            puts("|-----+-----+-----+-----|");
    }
}

void zuobiao (int pa[][4])
{
    int x, y, i, j;
    int t = 0;
    //判断是否有空位
    for (i = 0; i < 4; i++)
    {
        for (j = 0; j < 4; j++)
            if (pa[i][j] == 0)
                t = 1;
        if (t)
            break;
    }
    if    (t)
    {
        do
        {
            x = rand() % 4;
            y = rand() % 4;
        }
        while(pa[x][y] != 0);        //是否会出现坐标对应的值永远不等于0??    
        pa[x][y] = shenchen();                
    }
}

int shenchen (void)
{
    int i;

    i = rand() % 10;
    if (i / 2 == 0)
        i = 4;
    else
        i = 2;
    
    return i;
}

int main (void)
{
    int b[4][4] = {0};         //模拟4X4界面
    int ch;                //存储用户输入的字符
    
    srand((unsigned)time(0));            //随机函数
    zuobiao(b);
    zuobiao(b);
    display(b);

    while ((ch = getch()) != 27)
    {
        if (!pandan(b, ch))
            ch = 'q';    
        switch (ch)
        {
            case 72 : w(b);
                zuobiao (b);
                break;
            case 80 : s(b);
                zuobiao (b);
                break;
            case 75 : a(b);
                zuobiao (b);
                break;
            case 77 : d(b);
                zuobiao (b);
                break;
        }
        if (!gameover(b))
        {
            printf ("游戏结束");
            break;
        }
        Sleep(200);
        system("CLS");                //清屏
        
        display(b);
    }

    return 0;
}

void w (int a[][4])
{
    int i, j, k;
    
    //将4x4数组中不为0的数全部向上移
    for (j = 0; j < 4; j++)    
        for (i = 0; i < 3; i++)
            for (k = i+1; k < 4; k++)
                if (a[i][j] == 0 && a[k][j] != 0)
                {
                    a[i][j] = a[k][j];
                    a[k][j] = 0;
                }

    //将同一个方向上相同的按顺序相加
    j = 0;
    while (j < 4)    
    {
        if (a[0][j] == a[1][j])
        {
            a[0][j] *= 2;
            a[1][j] = 0;
            if (a[2][j] == a[3][j])
            {
                a[1][j] = 2 * a[2][j];
                a[2][j] = a[3][j] = 0;
            }
            else
            {
                a[1][j] = a[2][j];
                a[2][j] = a[3][j];
                a[3][j] = 0;
            }    
        }
        else if (a[1][j] == a[2][j])
        {
            a[1][j] *= 2;
            a[2][j] = a[3][j];
            a[3][j] = 0;
        }
        else if (a[2][j] == a[3][j])
        {
            a[2][j] *= 2;
            a[3][j] = 0;
        }
        j++;
    }
}

void s (int a[][4])
{
    int i, j, k;
    
    //将4x4数组中不为0的数全部向上移
    for (j = 0; j < 4; j++)    
        for (i = 3; i > 0; i--)
            for (k = i-1; k >= 0; k--)
                if (a[i][j] == 0 && a[k][j] != 0)
                {
                    a[i][j] = a[k][j];
                    a[k][j] = 0;
                }

    //将同一个方向上相同的按顺序相加
    j = 3;
    while (j >= 0)    
    {
        if (a[3][j] == a[2][j])
        {
            a[3][j] *= 2;
            a[2][j] = 0;
            if (a[1][j] == a[0][j])
            {
                a[2][j] = 2 * a[1][j];
                a[1][j] = a[0][j] = 0;
            }
            else
            {
                a[2][j] = a[1][j];
                a[1][j] = a[0][j];
                a[0][j] = 0;
            }    
        }
        else if (a[2][j] == a[1][j])
        {
            a[2][j] *= 2;
            a[1][j] = a[0][j];
            a[0][j] = 0;
        }
        else if (a[1][j] == a[0][j])
        {
            a[1][j] *= 2;
            a[0][j] = 0;
        }
        j--;
    }
}

void a (int a[][4])
{
    int i, j, k;
    
    for (i = 0; i < 4; i++)    
        for (j = 0; j < 3; j++)
            for (k = j+1 ; k < 4; k++)
                if (a[i][j] == 0 && a[i][k] != 0)
                {
                    a[i][j] = a[i][k];
                    a[i][k] = 0;
                }

    i = 0;
    while (i < 4)    
    {
        if (a[i][0] == a[i][1])
        {
            a[i][0] *= 2;
            a[i][1] = 0;
            if (a[i][2] == a[i][3])
            {
                a[i][1] = 2 * a[i][2];
                a[i][2] = a[i][3] = 0;
            }
            else
            {
                a[i][1] = a[i][2];
                a[i][2] = a[i][3];
                a[i][3] = 0;
            }    
        }
        else if (a[i][1] == a[i][2])
        {
            a[i][1] *= 2;
            a[i][2] = a[i][3];
            a[i][3] = 0;
        }
        else if (a[i][2] == a[i][3])
        {
            a[i][2] *= 2;
            a[i][3] = 0;
        }
        i++;
    }
}
    
void d (int a[][4])
{
    int i, j, k;
    
    for (i = 0; i < 4; i++)    
        for (j = 3; j > 0; j--)
            for (k = j-1 ; k >= 0; k--)
                if (a[i][j] == 0 && a[i][k] != 0)
                {
                    a[i][j] = a[i][k];
                    a[i][k] = 0;
                }
    
    i = 3;
    while (i >= 0)    
    {
        if (a[i][2] == a[i][3])
        {
            a[i][3] *= 2;
            a[i][2] = 0;
            if (a[i][0] == a[i][1])
            {
                a[i][2] = 2 * a[i][1];
                a[i][1] = a[i][0] = 0;
            }
            else
            {
                a[i][2] = a[i][1];
                a[i][1] = a[i][0];
                a[i][0] = 0;
            }    
        }
        else if (a[i][1] == a[i][2])
        {
            a[i][2] *= 2;
            a[i][1] = a[i][0];
            a[i][0] = 0;
        }
        else if (a[i][0] == a[i][1])
        {
            a[i][1] *= 2;
            a[i][0] = 0;
        }
        i--;
    }
}

int pandan (const int a[][4], int ch)
{
    int i, j, t;
    
    switch (ch)
    {
        case 72 : 
                for (j = 0; j < 4; j++)
                {
                    for (i = 0; i < 3; i++)
                    {
                        if (a[i][j]  == 0)
                            if(a[i+1][j] > 0)
                                t = 1;
                            else
                                t = 0;
                        else
                            if(a[i+1][j] == a[i][j])
                                t = 1;
                            else
                                t = 0;
                        if (t == 1)
                            break;
                    }
                    if (t == 1)
                            break;
                }
                break;
        case 80 : 
                for (j = 0; j < 4; j++)
                {
                    for (i = 3; i > 0; i--)
                    {
                        if (a[i][j]  == 0)
                            if(a[i-1][j] > 0)
                                t = 1;
                            else
                                t = 0;
                        else
                            if(a[i-1][j] == a[i][j])
                                t = 1;
                            else
                                t = 0;
                        if (t == 1)
                            break;
                    }
                    if (t == 1)
                            break;
                }
                break;
        case 75 : 
                for (i = 0; i < 4; i++)
                {
                    for (j = 0; j < 3; j++)
                    {
                        if (a[i][j]  == 0)
                            if(a[i][j+1] > 0)
                                t = 1;
                            else
                                t = 0;
                        else
                            if(a[i][j+1] == a[i][j])
                                t = 1;
                            else
                                t = 0;
                        if (t == 1)
                            break;
                    }
                    if (t == 1)
                            break;
                }
                break;
        case 77 : 
                for (i = 0; i < 4; i++)
                {
                    for (j = 3; j > 0; j--)
                    {
                        if (a[i][j]  == 0)
                            if(a[i][j-1] > 0)
                                t = 1;
                            else
                                t = 0;
                        else
                            if(a[i][j-1] == a[i][j])
                                t = 1;
                            else
                                t = 0;
                        if (t == 1)
                            break;
                    }
                    if (t == 1)
                            break;
                }
                break;
        default : t = 0;
    }
    
    return t;
}

int gameover (const int a[][4])
{
    int i, j;
    for (i = 0; i < 4; i++)
        for (j = 0; j < 4; j++)
            if (a[i][j] == 0)
                return 1;
    for (i = 0; i < 4; i++)
        for (j = 0; j < 3; j++)
            if (a[i][j] == a[i][j+1])
                return 1;
    for (i = 0; i < 4; i++)
        for (j = 0; j < 3; j++)
            if (a[j][i] == a[j+1][i])
                return 1;
    return 0;
}
搜索更多相关主题的帖子: 怎么学 手机 友好 
2015-03-09 15:16
wmf2014
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:216
帖 子:2039
专家分:11273
注 册:2014-12-6
得分:4 
可以玩哦,只是代码长了点,肯定有优化的地方,再接再厉!

能编个毛线衣吗?
2015-03-09 16:18
逍风
Rank: 2
来 自:中国 江西
等 级:论坛游民
帖 子:88
专家分:84
注 册:2015-3-7
得分:4 
很不错,我也是自学,学习了!

<%谦虚学习,用心做人,没有最好,只有更好!%>
2015-03-09 17:55
逍风
Rank: 2
来 自:中国 江西
等 级:论坛游民
帖 子:88
专家分:84
注 册:2015-3-7
得分:0 
回复 楼主 TAAAAB
把你的代码放到编译器上运行,一次性通过,挺不错,学习了 !  建议把界面做一下,会更好 .

<%谦虚学习,用心做人,没有最好,只有更好!%>
2015-03-09 18:04
大爱CATs
Rank: 4
来 自:重庆
等 级:业余侠客
威 望:3
帖 子:108
专家分:250
注 册:2015-1-13
得分:4 
回复 4楼 逍风
这个是什么编译器,感觉很实用!
功能可能就不怎么滴了。

弹指一挥间
2015-03-09 18:33
大爱CATs
Rank: 4
来 自:重庆
等 级:业余侠客
威 望:3
帖 子:108
专家分:250
注 册:2015-1-13
得分:0 
老乡!
点赞!

弹指一挥间
2015-03-09 19:34
松鼠岛
Rank: 2
等 级:论坛游民
帖 子:3
专家分:11
注 册:2015-3-10
得分:4 
厉害
2015-03-10 17:37
逍风
Rank: 2
来 自:中国 江西
等 级:论坛游民
帖 子:88
专家分:84
注 册:2015-3-7
得分:0 
回复 5楼 大爱CATs
您好! 这也是一种C语言编译器 我写程序都在这上面完成 至于怎么样 用下就知道了 您可以去网上搜 :(C/C ++程序设计学习与实验系统)  
地址:http://www.

<%谦虚学习,用心做人,没有最好,只有更好!%>
2015-03-10 18:07
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
得分:4 
没有方向感是因为目的性不强
2015-03-10 19:10
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
得分:4 
標識符命名都沒做好,哎~別的不說了。

授人以渔,不授人以鱼。
2015-03-10 20:35



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-442466-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.141270 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved