C语言实现2048小游戏

上线左右或者wasd移动,q或Q退出

/*
2048.c
*/
#include<stdio.h>
#include<stdlib.h>
#include<curses.h>
#include<unistd.h>
#include<signal.h>
#include<time.h>

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();
    noecho();
    curs_set(0);

    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);
            addch(‘-‘);
            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);
        }
    }
}

void draw_one(int y, int x)
{
    int i, m, k, j;
    char c[5] = {0x00};
    i = a[y][x];
    m = 0;

    while (i > 0)
    {
        j = i % 10;
        c[m++] = j + ‘0‘;
        i = i / 10;
    }

    m = 0;
    k = (x + 1) * 5 - 1;
    while(c[m] != 0x00)
    {
        move(2 * y + 1, k);
        addch(c[m++]);
        k--;
    }
}
void play()
{
    int x, y, i, new_x, new_y, temp;
    int old_empty, move;
    char ch;
    while (1)
    {
        move = 0;
        old_empty = empty;
        ch = getch();
        switch (ch)
        {
            case 97:
            case 104:
            case 68:
                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;
                                        empty++;
                                        break;
                                    }
                                    else
                                    {
                                        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 100:
            case 108:
            case 67:
                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;
                                    empty++;
                                    break;
                                }
                                else
                                {
                                    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 119:
            case 107:
            case 65:
                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;
                                    empty++;
                                    break;
                                }
                                else
                                {
                                    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 115:
            case 106:
            case 66:
                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;
                                    empty++;
                                    break;
                                }
                                else
                                {
                                    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();
        }
        if ((empty != old_empty) || (move == 1))
        {
            do
            {
                new_x = rand() % 4;
                new_y = rand() % 4;
            } while (a[new_y][new_x] != 0);

            cnt_value(&new_y, &new_x);

            do
            {
                temp = rand() % 4;
            } while (temp == 0 || temp == 2);

            a[new_y][new_x] = temp + 1;
            empty--;
        }
        draw();
    }
}

int cnt_one(int y, int x)
{
    int value = 1;
    if (y - 1 > 0)
    {
        a[y-1][x] ? 0 : value++;
    }
    if (y + 1 < 4)
    {
        a[y+1][x] ? 0 : value++;
    }
    if (x - 1 >= 0)
    {
        a[y][x-1] ? 0 : value++;
    }
    if (x + 1 < 4)
    {
        a[y][x+1] ? 0 : value++;
    }
    if (y - 1 >= 0 && x + 1 < 4)
    {
        a[y-1][x+1] ? 0 : value++;
    }
    if ( y - 1 >= 0 && x - 1 >= 0)
    {
        a[y-1][x-1] ? 0 : value++;
    }
    if (y + 1 < 4 && x - 1 >= 0)
    {
        a[y+1][x-1] ? 0 : value++;
    }
    if (y + 1 < 4 && x + 1 < 4)
    {
        a[y+1][x+1] ? 0 : value++;
    }

    return value;
}

void cnt_value(int *new_y, int *new_x)
{
    int max_x, max_y, x, y, value;
    int max = 0;

    max = cnt_one(*new_y, *new_x);
    for ( y = 0; y < 4; y++)
    {
        for (x = 0; x < 4; x++)
        {
            if (!a[y][x])
            {
                value = cnt_one(y, x);
                if (value > max && old_y != y && old_x != x)
                {
                    *new_y = y;
                    *new_x = x;
                    old_x = x;
                    old_y = y;
                    break;
                }
            }
        }
    }
}
int game_over()
{
    sleep(1);
    endwin();
    exit(0);
}

编译时需要加上-lcurses,如果系统没有这个库还需要安装。

这个源码在功能上好像有个BUG,先放着吧。

原文地址:https://www.cnblogs.com/wanghao-boke/p/12145142.html

时间: 2024-10-03 21:00:42

C语言实现2048小游戏的相关文章

2048小游戏(C语言版)

1 #include <climits> 2 #include <cstdio> 3 #include <cstring> 4 #include <stack> 5 #include <string> 6 #include <map> 7 #include <vector> 8 #include <cmath> 9 10 11 /* 12 玩法说明:编译运行后,输入一个整数n,表示自己想玩的游戏中是n*n的表格

卖萌向2048小游戏

五一前的某天 离散课上突发奇想 我是不是可以用c语言模拟各种小游戏 当时想了三个 贪吃蛇 2048 俄罗斯方块 俄罗斯方块的话..想起了ccf中的简单的模拟下落都熬了将近一个小时 更别说各种随机判断了 当场放弃..淞淞告诉我有现成的程序 几十行就可以..简直.. 然后思考了一下贪吃蛇 我的思想是枚举蛇身 没错就是枚!举! 反正不怕超时... 当时认为2048应该是最简单的 毕竟只有16个空 枚举起来..很方便..(只会枚举的渣渣瑟瑟发抖) 本来打算五一假期看看 然而当时准备省赛就忘了这件事 (其

如何在CentOS上安装一个2048小游戏

如何在centos上安装一个2048小游戏 最近在学习CentOS系统,就琢磨着玩点什么,然后我看到有人在玩2048小游戏,所有我就在想,为啥不装一个2048小游戏搞一下嘞,于是乎,我就开始工作啦 由于我个人的编程能力不强,所以我就在网上找到了一个C语言版的2048游戏小程序,我把它放到我的百度网盘上,可以供大家下载(链接:http://pan.baidu.com/s/1jIutb3g 密码:mu9z),然后我们把这个程序给复制到CentOS系统下,在进行下一步的工作.我们可以在CentOS上安

Swift实战之2048小游戏

上周在图书馆借了一本Swift语言实战入门,入个门玩一玩^_^正好这本书的后面有一个2048小游戏的实例,笔者跟着实战了一把. 差不多一周的时间,到今天,游戏的基本功能已基本实现,细节我已不打算继续完善,就这么整理一下过程中一些值得记录的点吧. 用的Swift版本是2.0,原书中的Swift版本会低一些,所以实践起来有些地方语法并不一样. 一.开始页面   在程序的第一张页面(Main.storyboard)上,只放了一个“开始游戏”按钮,点击按钮,弹出一个提示对话框,确认后,进入游戏页面. 1

C# 开发2048小游戏

这应该是几个月前,闲的手痒,敲了一上午代码搞出来的,随之就把它丢弃了,当时让别人玩过,提过几条更改建议,但是时至今日,我也没有进行过优化和更改(本人只会作案,不会收场,嘎嘎),下面的建议要给代码爱好的童鞋完成了. 更改建议: a.当数字超过四位数时,显示的时候有部分被它的容器TextBox遮挡了,能不能把显示的数值变小点?答案是可以的.代码里有一段通过矩阵数据填充TextBox值的操作,可以在填充时,判断下数值长度,然后修改TextBox的文字大小. b.玩游戏的时候,使用方向键移动时,焦点可能

C语言 三子棋 小游戏

//C语言 三子棋 小游戏 //棋盘为3x3大小,电脑棋子 X ,玩家 O : //用命令窗口模拟3子棋,玩家与电脑轮流下,先连成3子判赢:无路可走判平局 #include<stdio.h> #include<string.h> #include<windows.h> int judge_is_moved(char arr[][12], int place); void print_chessboard(char arr[][12])//输出棋盘 { int i = 0

canvas随笔之2048小游戏

HTML: <!DOCTYPE HTML> <html> <head> <title>2048小游戏</title> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=0.5, maximum-scale=2.0, u

2048小游戏-JS实现(BUG调试中)

刚刚学习JS的菜鸟,游戏没有实现滑动效果.希望有前辈能指点一下······ 定义的主要方法: 1.fuzhi()生成一对随机数,然后根据这对随机数取得一个随机单元格,先判断其是否为空,不为空,对其进行赋值为2的操作:为空,则再次调用fuzhi(). 2.secai()遍历表格,根据单元格的数值改变单元格的背景颜色. 3.score()遍历单元格,计算实时总得分. 4.keyDown()主要方法,根据用户按上下左右键来进行不同的数值相加.消除动作.这一段代码写得很冗余····· 1 <!DOCTY

2048小游戏用例图

用例图主要用来描述"用户.需求.系统功能单元"之间的关系.它展示了一个外部用户能够观察到的系统功能模型图. 下面是我们2048小游戏的用例图: