2048游戏C语言代码

转载 2015年11月20日 11:07:29
#include <stdio.h>
#include <stdlib.h>
#include <curses.h>
#include <time.h>
#include <unistd.h>
#include <signal.h>

// 4*4方格
int a[4][4] = {0};
// 方格里空格的个数
int empty;
int old_y, old_x;


void draw();
void play();
void init();
void draw_one(int y, int x);
void cnt_value(int *new_y, int *new_x);
int game_over();
int cnt_one(int y, int x);

int main()
{
    init();
    play();
    endwin();

    return 0;
}
void init()
{
    int x, y;

    initscr();	//初始化屏幕
    cbreak();	//如果没有设置CBREAK模式,
				//从键盘输入的字符都将被存储在缓冲区里面
				//直到输入回车键或者行结束符
    noecho();	//ECHO模式用来决定用户的输入是否立即回显
    curs_set(0);//0、1、2,分别表示光标的状态为隐藏、正常、高亮显示

    empty = 15;
    srand(time(0));
    x = rand() % 4;
    y = rand() % 4;
    a[y][x] = 2;
    draw();
}
void draw()
{
    int n, m, x, y;
    char c[4] = {'0', '0', '0', '0'};

    clear();
    for(n = 0; n < 9; n += 2)   //横线
        for(m = 0; m < 21; m++) {
            move(n, m);	//光标移动到给定的位置,这个位置是相对与屏幕的左上角而言,
						//左上角的坐标为(0,0)
            addch('-');	//a函数在当前光标处输出一个字符,
						//同时光标将向右移动一个位置
            refresh();	//刷新屏幕
        }
    for(m = 0; m < 22; m += 5)  //竖线
        for(n = 1; n < 8; n++) {
            move(n, m);
            addch('|');
            refresh();
        }
    for(y = 0; y < 4; y++)     //数字
        for(x = 0; x < 4; x++) {
            draw_one(y, x);
        }
}
//将a[y][x]完整的显示在屏幕上
//例如值为16,则c[0]=6,c[1]=1,逐位输出
void draw_one(int y, int x)
{
    int i, m, k, j;
    char c[4] = {'0', '0', '0', '0'};

    i = a[y][x];
    m = 0;
    do {
        j = i % 10;
        c[m++] = j + '0';
        i = i / 10;
    }while(i > 0);
    m = 0;
    k = (x + 1) * 5 - 1;
    while(c[m] != '0') {
        move(2*y+1, k);
        addch(c[m++]);
        k--;//
    }
}

void play()
{
    int x, y, i, new_x, new_y, tmp;
    int old_empty, move;
    char ch;

    while(1) {
        move = 0;
        old_empty = empty;
        //draw();
        ch = getch();
        switch(ch) {
            case 'A':
            case 'a':
                //从左向右消去相同方块
                for(y = 0; y < 4; y++)
                    for(x = 0; x < 4; ) {
                        if(a[y][x] == 0) {
                            x++;
                            continue;
                        } else {
                            for(i = x + 1; i < 4; i++) {
                                if(a[y][i] == 0) {
                                    continue;
                                }
                                else {
                                    if(a[y][x] == a[y][i]) {
                                        a[y][x] += a[y][i];
                                        a[y][i] = 0;
                                        x = i + 1;
                                        empty++;
                                        break;
                                    }
                                    else {
                                        x = i;
                                        break;
                                    }
                                }
                            }
                            x = i;
                        }
                    }
                //向左移动方块
                for(y = 0; y < 4; y++)
                    for(x = 0; x < 4; x++) {
                        if(a[y][x] == 0) {
                            continue;
                        } else {
                            for(i = x; (i > 0) && (a[y][i-1] == 0); i--) {
                                a[y][i-1] = a[y][i];
                                a[y][i] = 0;
                            move = 1;
                            }
                        }
                    }
                break;
            case 'D':
            case 'd':
                //从右向左消去相同方块
                for(y = 0; y < 4; y++)
                    for(x = 3; x >= 0; ) {
                        if(a[y][x] == 0) {
                            x--;
                            continue;
                        } else {
                            for(i = x - 1; i >= 0; i--) {
                                if(a[y][i] == 0) {
                                    continue;
                                } else if(a[y][x] == a[y][i]) {
                                    a[y][x] += a[y][i];
                                    a[y][i] = 0;
                                    x = i - 1;
                                    empty++;
                                    break;
                                } else {
                                    x = i;
                                    break;
                                }
                            }
                            x = i;
                        }
                    }
                //向右移动方块
                for(y = 0; y < 4; y++)
                    for(x = 3; x >= 0; x--) {
                        if(a[y][x] == 0) {
                            continue;
                        } else {
                            for(i = x; (i < 3) && (a[y][i+1] == 0); i++) {
                                a[y][i+1] = a[y][i];
                                a[y][i] = 0;
                            move = 1;
                            }
                        }
                    }
                break;
            case 'W':
            case 'w':
                //从上向下消去相同方块
                for(x = 0; x < 4; x++)
                    for(y = 0; y < 4; ) {
                        if(a[y][x] == 0) {
                            y++;
                            continue;
                        } else {
                            for(i = y + 1; i < 4; i++) {
                                if(a[i][x] == 0) {
                                    continue;
                                } else if(a[y][x] == a[i][x]) {
                                    a[y][x] += a[i][x];
                                    a[i][x] = 0;
                                    y = i + 1;
                                    empty++;
                                    break;
                                } else {
                                    y = i;
                                    break;
                                }
                            }
                            y = i;
                        }
                    }
                //向上移动方块
                for(x = 0; x < 4; x++)
                    for(y = 0; y < 4; y++) {
                        if(a[y][x] == 0) {
                            continue;
                        } else {
                            for(i = y; (i > 0) && (a[i-1][x] == 0); i--) {
                                a[i-1][x] = a[i][x];
                                a[i][x] = 0;
                            move = 1;
                            }
                        }
                    }
                break;
            case 'S':
            case 's':
                //从下向上消去相同方块
                for(x = 0; x < 4; x++)
                    for(y = 3; y >= 0; ) {
                        if(a[y][x] == 0) {
                            y--;
                            continue;
                        } else {
                            for(i = y - 1; i >= 0; i--) {
                                if(a[i][x] == 0) {
                                    continue;
                                } else if(a[y][x] == a[i][x]) {
                                    a[y][x] += a[i][x];
                                    a[i][x] = 0;
                                    y = i -1;
                                    empty++;
                                    break;
                                } else {
                                    y = i;
                                    break;
                                }
                            }
                            y = i;
                        }
                    }
                //向下移动方块
                for(x = 0; x < 4; x++)
                    for(y = 3; y >= 0; y--) {
                        if(a[y][x] == 0) {
                            continue;
                        } else {
                            for(i = y; (i < 3) && (a[i+1][x] == 0); i++) {
                                a[i+1][x] = a[i][x];
                                a[i][x] = 0;
                            move = 1;
                            }
                        }
                    }
                break;
            case 'Q':
            case 'q':
                game_over();
                break;
            default:
                continue;
                break;
        }

        if(empty <= 0)
            game_over();
        draw();
        //生成新方块
        if((empty != old_empty) || (move == 1)) {  //修复了不移动或消除方块也生成新方块的bug
            do {
                new_x = rand() % 4;
                new_y = rand() % 4;
            }while(a[new_y][new_x] != 0);


            do {
                tmp = rand() % 4;
            }while(tmp == 0 || tmp == 2);//生成1或3
            a[new_y][new_x] = tmp + 1;//插入2或4
            empty--;

            draw_one(new_y, new_x);//将生成的值显示
        }
    }
}

int game_over()
{
    sleep(1);
    endwin();
    exit(0);
}

建议在linux环境下编译,编译前请安装ncurses库,安装命令:sudo apt-get install libncurses5-dev。然后gcc编译执行

C语言实现2048

本题目来自于一位去澳洲参加暑期交流的小朋友,为期一个多月的编程课程最后的Assignment就是用C语言在命令行中实现2048.具体要求:http://webapps.cse.unsw.edu.au/...
  • qwm8777411
  • qwm8777411
  • 2014年11月20日 22:06
  • 13637

c语言编写的2048游戏代码,大家可以参考一下这些

2048_launcher.c #include #include #include void main() { printf("正在启动中,请稍后!\n"); Sleep(1000); sy...
  • u012187684
  • u012187684
  • 2016年08月03日 18:48
  • 6897

2048游戏C语言代码

听说2048游戏实现起来很easy! 所以今天就试了试!确实不太难,要想编的很成功,也不是太容易!有很多细节需要考虑! 下面是我自己设计的代码,估计里面会漏洞百出!希望路过大神能指点一二! #i...
  • u012804490
  • u012804490
  • 2014年07月09日 22:17
  • 2353

2048的C语言实现

前言高中时班上有一位dalao用了大概一周的时间搞出来了控制台版的2048。然后今天上实验课的时候突发想到,我既然现在已经是这个专业的了,然后自认为自己的代码量还算看得过去,这个控制台版的应该不会太难...
  • SCaryon
  • SCaryon
  • 2017年06月26日 21:28
  • 1356

2048c语言代码

#include #include int a[4][4]={{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0}}; int flag=0; void r...
  • u014304806
  • u014304806
  • 2014年10月20日 20:37
  • 1807

空闲时间用C语言写了下2048游戏

随手C语言写了个2048游戏,这个游戏还是比较简单的,所以直接上代码,代码逻辑也很清楚。...
  • IAccepted
  • IAccepted
  • 2014年07月30日 14:37
  • 10124

c语言实现2048

效果图: 使 使用文本界面的屏幕绘图库 ncurses. 设计思路: 在满足条件情况下消除方块允许在游戏主界面(16 宫格)中任意一格输出数据 实现代码:#include #include ...
  • qq_15345805
  • qq_15345805
  • 2017年04月12日 23:46
  • 128

C语言2048源码+可运行程序(win32 dos)

  • 2014年06月17日 19:11
  • 502KB
  • 下载

2048游戏C源代码

  • 2014年06月22日 21:35
  • 5KB
  • 下载

2048的c语言实现

大一时学c语言写的,写的不好但当时感觉还行。。 环境运行 vc6.0 ,cpp文件。 基本上是c写的,但是改变字体颜色,在控制台移动光标等等好像不是c中的。 ...
  • yanweibujian
  • yanweibujian
  • 2016年03月13日 16:58
  • 589
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:2048游戏C语言代码
举报原因:
原因补充:

(最多只允许输入30个字)