Windows下使用C语言实现2048

这是我之前写的一个小游戏,在windows下的Dev-C++中用C语言来实现的,通过不断的清屏,打印,清屏,打印来实现动态效果,不过功能不完善,有几个缺陷的地方。

实现效果(使用 w a s d 四个键来控制上下左右的移动) :

源代码(如果在Dev-C++中编译运行的时候报错,请将注释符号   //    换为  /**/ 来进行注释):

#include <stdio.h>
#include <stdlib.h>     // for rand() and srand() and exit()
#include <time.h>       // for time()
#include <conio.h>      // for getch()
#include <windows.h>    // for system()

void init(void);      // 初始化数组跟赋值第一个随机二维数组元素
void draw(void);      // 绘制4 * 4方格图
void play(void);      // 控制移动方向
void to_up(void);     // 向上移动
void to_down(void);  // 像下移动
void to_left(void);   // 向左移动
void to_right(void);  // 向右移动
void add_number(void);  // 加新的数 

int a[4][4];
int empty;

int
main(void) {
    printf("****************************\n");
    printf("            2048            \n\n");
    printf("Control by:\n"
            " w/s/a/d or W/S/A/D\n");
    printf("press q or Q quit game!\n");
    printf("****************************\n");
    printf("Press any key to continue . . .\n");
    getch();
    system("cls"); 

    init();
    draw();
    while(1)
        play();

    return 0;
} 

void
init(void) {
    int i, j;

    for(i = 0; i < 4; ++i)
        for(j = 0; j < 4; ++j)
            a[i][j] = 0;
    srand(time(0));
    i = rand() % 4;
    j = rand() % 4;
    a[i][j] = 2;
    empty = 15;
}

void
draw(void) {
    int i, j;

    for(i = 0; i < 4; ++i) {          // 一个方格由三根竖线组成
        for(j = 0; j < 4; ++j)     // 第一排竖线 每个竖线之间占5个格
            printf("|    ");
        printf("|\n");

        for(j = 0; j < 4; ++j) {   // 第二排竖线与数字
            if(a[i][j] == 0)
                printf("|    ");
            else
                printf("|%4d", a[i][j]);
        }
        printf("|\n"); 

        for(j = 0; j < 4; ++j)     // 第三排竖线加底线
            printf("|____");
        printf("|\n");
    }
} 

void
play(void) {
    int ch;

    ch = getch();
    switch(ch) {
        case ‘w‘:    // 向上移动
        case ‘W‘:
            to_up();
            system("cls");
            add_number();
            draw();
            break;
        case ‘s‘:    // 向下移动
        case ‘S‘:
            to_down();
            system("cls");
            add_number();
            draw();
            break;
        case ‘a‘:    // 向左移动
        case ‘A‘:
            to_left();
            system("cls");
            add_number();
            draw();
            break;
        case ‘d‘:     // 向右移动
        case ‘D‘:
            to_right();
            system("cls");
            add_number();
            draw();
            break;
        case ‘q‘:   // 退出游戏
        case ‘Q‘:
            exit(0);
            break;
        default:
            printf("\nwrong type!!!\n\n");
            printf("please type :\n");
            printf("w/s/a/d or W/S/A/D\n");
            break;
    }
}

void
to_up(void) {
    int x, y, i;

    for(y = 0; y < 4; ++y) {     // 从上向下合并相同的方块
        for(x = 0; x < 4; ++x) {
            if(a[x][y] == 0)
                ;
            else {
                for(i = x + 1; i < 4; ++i) {
                    if(a[i][y] == 0)
                        ;
                    else if(a[x][y] == a[i][y]) {
                        a[x][y] += a[i][y];
                        a[i][y] = 0;
                        ++empty;
                        x = i;
                        break;
                    }
                    else {
                        //x = i - 1;
                        break;
                    }
                }
            }
        }
    }

    for(y = 0; y < 4; ++y)    // 向上移动箱子
        for(x = 0; x < 4; ++x) {
            if(a[x][y] == 0)
                ;
            else {
                for(i = x; (i > 0) && (a[i - 1][y] == 0); --i) {
                    a[i - 1][y] = a[i][y];
                    a[i][y] = 0;
                }
            }
        }
}

void
to_down(void) {
    int x, y, i;

    for(y = 0; y < 4; ++y)  // 向下合并相同的方格
        for(x = 3; x >= 0; --x) {
            if(a[x][y] == 0)
                ;
            else {
                for(i = x - 1; i >= 0; --i) {
                    if(a[i][y] == 0)
                        ;
                    else if(a[x][y] == a[i][y]) {
                        a[x][y] += a[i][y];
                        a[i][y] = 0;
                        ++empty;
                        x = i;
                        break;
                    }
                    else
                        break;
                }
            }
        }

    for(y = 0; y < 4; ++y)  // 向下移动方格
        for(x = 3; x >= 0; --x) {
            if(a[x][y] == 0)
                ;
            else {
                for(i = x; (i < 3) && (a[i + 1][y] == 0); ++i) {
                    a[i + 1][y] = a[i][y];
                    a[i][y] = 0;
                }
            }
        }
}

void
to_left(void) {
    int x, y, i;

    for(x = 0; x < 4; ++x)   // 向左合并相同的方格
        for(y = 0; y < 4; ++y) {
            if(a[x][y] == 0)
                ;
            else {
                for(i = y + 1; i < 4; ++i) {
                    if(a[x][i] == 0)
                        ;
                    else if(a[x][y] == a[x][i]) {
                        a[x][y] += a[x][i];
                        a[x][i] = 0;
                        ++empty;
                        y = i;
                        break;
                    }
                    else
                        break;
                }
            }
        }

    for(x = 0; x < 4; ++x)  // 向左移动方格
        for(y = 0; y < 4; ++y) {
            if(a[x][y] == 0)
                ;
            else {
                for(i = y; (i > 0) && (a[x][i - 1] == 0); --i) {
                    a[x][i - 1] = a[x][i];
                    a[x][i] = 0;
                }
            }
        }
}

void
to_right(void) {
    int x, y, i;

    for(x = 0; x < 4; ++x)  // 向右合并相同的方格
        for(y = 3; y >= 0; --y) {
            if(a[x][y] == 0)
                ;
            else {
                for(i = y - 1; i >= 0; --i) {
                    if(a[x][i] == 0)
                        ;
                    else if(a[x][y] == a[x][i]) {
                        a[x][y] += a[x][i];
                        a[x][i] = 0;
                        ++empty;
                        y = i;
                        break;
                    }
                    else
                        break;
                }
            }
        } 

    for(x = 0; x < 4; ++x)   // 向右移动方格
        for(y = 3; y >= 0; --y) {
            if(a[x][y] == 0)
                ;
            else {
                for(i = y; (i < 3) && (a[x][i + 1] == 0); ++i) {
                    a[x][i + 1] = a[x][i];
                    a[x][i] = 0;
                }
            }
        }
}

void
add_number(void) {
    int temp, number;
    int x, y;

    if(empty > 0) {     // 找出空格
        srand(time(0));
        do {
            x = rand() % 4;
            y = rand() % 4;
        } while(a[x][y] != 0);

        number = rand();
        temp = number % 2;

        if(temp == 1) {  // 判断是生成数字2,还是数字4
            a[x][y] = 2;
            --empty;
        }
        if(temp == 0) {
            a[x][y] = 4;
            --empty;
        }
    }

}
时间: 2024-10-05 12:45:47

Windows下使用C语言实现2048的相关文章

《Go语言入门》如何在Windows下安装Go语言编程环境

概述 本文为Go语言学习入门第一篇,<Go语言入门>如何在Windows下安装Go语言编程环境 . 主要讲Go语言编译环境的安装以及基于Notepad++(Go语言插件.语法高亮)的开发环境配置. 下载安装包 安装包下载地址:https://golang.org/dl/ 这里选择下载Windows版本,点击链接打开的页面可能不会开始下载:地址栏里会显示完整的下载地址,如:https://golang.org/doc/install?download=go1.5.1.windows-amd64.

Windows下搭建go语言开发环境 以及 开发IDE (附下载链接)

1.下载 并且 安装 Go安装包 =========================================================== 在CSDN上传了我的版本,供大家下载: =========================================================== go1.2.windows-386.msi : http://download.csdn.net/detail/shuideyidi/7718563 go1.2.1.windows-am

Windows下用C语言连接Mysql注意问题

原文:Windows下用C语言连接Mysql注意问题 环境是:在VS6.0 安装Mysql后,我们需要相应的头文件以及lib文件,所以安装过程必须是完整安装.否则不会生成include文件夹哦~ 具体步骤如下: 1.完全安装mysql,这样才能生成include文件夹. 2.在Directories的标 签页中右边的"Show directories for" 下拉列表中选中"Includefiles", 然后在中间列表框中添加你本地安装MySQL的include目

在windows下用C语言写socket通讯实例

原文:在windows下用C语言写socket通讯实例 From:Microsoft Dev Center #undef UNICODE #define WIN32_LEAN_AND_MEAN #include <windows.h> #include <winsock2.h> #include <ws2tcpip.h> #include <stdlib.h> #include <stdio.h> // Need to link with Ws2

windows下的go语言的环境搭建和初探

闲话不说,直入主题. 1.准备工具 a.windows下的Go语言开发安装包 官方下载地址:https://code.google.com/p/go/downloads/list b.Go语言中文官网(有相关参考和文档) http://zh.golanger.com/ 2.方法步骤 在Go语言的Google代码项目上下载Windows下的Go语言开发包(下载地址见工具).有zip压缩版和msi安装版两个按本下载.(这里使用msi安装版,比较方便)   下载得到一个msi安装文件,运行它.一路Ne

Windows下学习C语言有哪些集成开发软件?

前言 初学者学习C语言遇到的最大困难想必就是搭建环境了,相当多的初学者就是被搭建环境导致放弃了学习编程,就我自己的经验而言,初学编程不应该受限于环境,使用成熟好用的环境就可以了,之后熟悉一些可以在慢慢探究.想到大多数小伙伴都是使用Windows系统,今天就先说下Windows系统下有哪些学习C语言的集成开发环境,由于篇幅问题,具体安装方法之后再详细分解. 什么是集成开发工具(IDE) 这里大家如果没有接触过编程的话,可能不知道什么是集成开发环境. 之前已经说过编程的核心工具是下边几个:编辑器:

如何在windows下搭建C语言开发环境

兵欲善其事,必先利其器.如果想要学好c语言,首先最重要的一点就是要学会如何搭建一个适合自己的学习环境,这里我就简单讲述一下如何在windows操作系统上搭建VC++6.0的开发环境,以便于新手更好的学习后面的知识. 首先,我们要从百度上下载一个vc++6.0的安装包,可以是中文版的,也可以是英文版的,自己看着下载,下载完了之后就开始安装.安装过程很简单,玩过电脑游戏的同学基本上都能看懂如何安装,我在这里就不多做介绍. 安装完成之后,桌面上会出现一个图标,,有的版本的显示的可能是VC++6.0,也

【Go】windows下搭建go语言编译环境

主要是协助杨哥做Kubernetes相关工作,由于Kubernetes和Docker都是由Go语言编写,因此改源码后还是需要go语言编译器来编译运行.所以打算先在windows上安装一下go语言环境. 需要的工具: GCC编译器 http://gcc.gnu.org/index.html Golang编译器 https://golang.org/ liteide IDE :https://sourceforge.net/projects/liteide/ 接下来就是把对应的安装包给下下来然后安装

windows下用C语言实现服务程序编写与安装

说是每学点知识就记录下,前段时间也没弄,还是自己懒惰了,今天逼着自己写写,当是在复习下,废话少说,进入正题. windows的服务程序 需要SERVICE_TABLE_ENTRY这个结构体(描述服务名和对应启动的函数eg:ServiceMain),然后StartServiceCtrlDispatcher来调用前面的结构体,在ServiceMain函数里要注册服务状态控制的方法,不然就不能控制服务的初始化.启动等,这个是基本的服务程序 主要代码如下(只有服务程序,下面会有解说安装.卸载等): 1