| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 22593 人关注过本帖, 22 人收藏
标题:100 行代码撸了一个 2048 的小游戏
只看楼主 加入收藏
RockCarry
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:13
帖 子:662
专家分:58
注 册:2005-8-5
结帖率:95.65%
收藏(22)
已结贴  问题点数:20 回复次数:35 
100 行代码撸了一个 2048 的小游戏
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>

#define GAME_SIZE  4

static void left(int *data)
{
    int i, j, f;
    int row = GAME_SIZE;
    while (row--) {
        for (j=0,f=0,i=0; i<GAME_SIZE; i++) {
            if (data[i]) {
                if (!f && j>0 && data[j-1] == data[i]) {
                    data[j-1]+= data[i]; f = 1;
                } else {
                    data[j++] = data[i]; f = 0;
                }
            }
        }
        while (j < GAME_SIZE) data[j++] = 0;
        data += GAME_SIZE;
    }
}

static void right(int *data)
{
    int i, j, f;
    int row = GAME_SIZE;
    while (row--) {
        for (j=GAME_SIZE-1,f=0,i=GAME_SIZE-1; i>=0; i--) {
            if (data[i]) {
                if (!f && j<GAME_SIZE-1 && data[j+1] == data[i]) {
                    data[j+1]+= data[i]; f = 1;
                } else {
                    data[j--] = data[i]; f = 0;
                }
            }
        }
        while (j >= 0) data[j--] = 0;
        data += GAME_SIZE;
    }
}

static void up(int *data)
{
    int i, j, f;
    int col = GAME_SIZE;
    while (col--) {
        for (j=0,f=0,i=0; i<GAME_SIZE; i++) {
            if (data[i*GAME_SIZE]) {
                if (!f && j>0 && data[(j-1)*GAME_SIZE] == data[i*GAME_SIZE]) {
                    data[(j-1)*GAME_SIZE]+= data[i*GAME_SIZE]; f = 1;
                } else {
                    data[(j++)*GAME_SIZE] = data[i*GAME_SIZE]; f = 0;
                }
            }
        }
        while (j < GAME_SIZE) data[(j++)*GAME_SIZE] = 0;
        data++;
    }
}

static void down(int *data)
{
    int i, j, f;
    int col = GAME_SIZE;
    while (col--) {
        for (j=GAME_SIZE-1,f=0,i=GAME_SIZE-1; i>=0; i--) {
            if (data[i*GAME_SIZE]) {
                if (!f && j<GAME_SIZE-1 && data[(j+1)*GAME_SIZE] == data[i*GAME_SIZE]) {
                    data[(j+1)*GAME_SIZE]+= data[i*GAME_SIZE]; f = 1;
                } else {
                    data[(j--)*GAME_SIZE] = data[i*GAME_SIZE]; f = 0;
                }
            }
        }
        while (j >= 0) data[(j--)*GAME_SIZE] = 0;
        data++;
    }
}

static int next(int *data)
{
    int empidx[GAME_SIZE*GAME_SIZE];
    int empnum = 0;
    int max    = 0;
    int i, j;

    for (j=0,i=0; i<GAME_SIZE*GAME_SIZE; i++) {
        if (data[i] == 0) {
            empidx[j++] = i;
            empnum++;
        }
        max = max > data[i] ? max : data[i];
    }
    if (empnum) {
        data[empidx[rand()%empnum]] = 1;
        return max == 2048 ? 1 : 0;
    }
    else return -1;
}

static void output(int *data)
{
    int i, sum = 0;

    printf("+--------------------+\n\n");
    for (i=1; i<=GAME_SIZE*GAME_SIZE; i++) {
        if (0 || data[i-1]) {
            printf("%4d %s", data[i-1], i%GAME_SIZE ? "" : "\n\n");
        } else {
            printf("%s %s" , "   ."   , i%GAME_SIZE ? "" : "\n\n");
        }
        sum += data[i-1];
    }
    printf("+--------------------+\n\n");
    printf("分数:%d\n\n", sum);
}

int main(void)
{
    int data[GAME_SIZE * GAME_SIZE] = {0};
    int ret = 0;

    next  (data);
    next  (data);
    output(data);

    while (1) {
        int c = getch();
        switch (c) {
        case 'j': left (data); break;
        case 'k': down (data); break;
        case 'l': right(data); break;
        case 'i': up   (data); break;
        case 'q': return 0;
        default : continue;
        }
        ret = next(data);
        output(data);

        if (ret == -1) printf("game over !\n");
        if (ret ==  1) printf("you  win  !\n");
    }
}


+---------------------------------------------------------------+
linux 下 gcc 编译,解决 getch 问题

删掉:
#include <conio.h>

加上:
#include <termio.h>

int getch(void)
{
    struct termios tm, tm_old;
    int fd = 0, ch;

    if (tcgetattr(fd, &tm) < 0) {
        return -1;
    }

    tm_old = tm;
    cfmakeraw(&tm);
    if (tcsetattr(fd, TCSANOW, &tm) < 0) {
        return -1;
    }

    ch = getchar();
    if (tcsetattr(fd, TCSANOW, &tm_old) < 0) {
        return -1;
    }

    return ch;
}


[此贴子已经被作者于2017-9-29 16:10编辑过]

搜索更多相关主题的帖子: void int data while return 
2017-09-16 11:03
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:5 
收藏~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-09-16 12:43
陌心丶沉沦
Rank: 1
来 自:陕西西安
等 级:新手上路
帖 子:6
专家分:5
注 册:2017-6-18
收藏
得分:5 
2017-09-16 17:01
yu965634383
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:119
专家分:195
注 册:2017-9-1
收藏
得分:5 
收藏一下

菜鸟一枚,求各位大神多多关照。
2017-09-17 08:22
yangfrancis
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:贵宾
威 望:141
帖 子:1510
专家分:7661
注 册:2014-5-19
收藏
得分:5 
规则是什么呢?
2017-09-19 18:48
深夜愛敲代码
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2017-9-20
收藏
得分:0 
,只有代码么。
2017-09-20 12:38
RockCarry
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:13
帖 子:662
专家分:58
注 册:2005-8-5
收藏
得分:0 
规则就是 2084 游戏的规则

j - 左
k - 下
l - 右
i - 上

相同数字移动过程中会合并

只有代码,windows 下可以编译通过,linux 下要改改。

2017-09-20 13:36
ycxfcx
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2017-9-21
收藏
得分:0 
好厉害呀~~
2017-09-21 16:09
chenghuahua
Rank: 2
等 级:论坛游民
威 望:1
帖 子:5
专家分:27
注 册:2017-9-21
收藏
得分:0 
喜欢这样的
2017-09-21 23:23
TXysilence
Rank: 1
等 级:新手上路
帖 子:13
专家分:0
注 册:2017-9-7
收藏
得分:0 
楼主用的是什么软件写的代码?我放在VS2010上报错
2017-09-23 19:26
快速回复:100 行代码撸了一个 2048 的小游戏
数据加载中...
 
   



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

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