linux下的2048小游戏

首先先解决getch在linux下无法正常使用的问题,需要自己写个函数

//分配内存的大小
#define     SIZE    10
//定义按键们的宏
#define     ESC     "\033"
#define     UP      "\033[A"
#define     DOWN    "\033[B"
#define     LEFT    "\033[D"
#define     RIGHT   "\033[C"

 for ( ; ; )
    {
        fgets(get, SIZE, stdin);
        get[strlen(get) - 1] = '\0';

        if (!strcmp(get, ESC)){
            printf("This is \"ESC\" button!\n");
		}
        if (!strcmp(get, UP)){
            printf("This is \"UP\" button!\n");
		}
        if (!strcmp(get, DOWN)){
            printf("This is \"DOWN\" button!\n");
		}
        if (!strcmp(get, LEFT)){
            printf("This is \"LEFT\" button!\n");
		}
        if (!strcmp(get, RIGHT)){
            printf("This is \"RIGHT\" button!\n");
		}

然后开始创建2048这个游戏的底子,我这里是直接定义了一个全局的二维数组,顺便初始化了
最下面放了个传参的源码

int shuzu[4][4];

二一步写一个判断游戏是否结束的函数,即当4*4方格内没有空格时(我这里是用0代替的即没有0时,有需要可以自行更改)游戏结束


int chachong()
{
    int i,j;
    for(i = 0; i < 4; i++){
        for(j = 0; j < 4; j++){
            if(shuzu[i][j] == 0){
                return 1;
            }
        }
    }
    return 0;
}

在主函数里对应if (chachong()) { printf("Game over!\n"); break; }

三一步写随机位置生成2或4

void rad()
{
    if(!chachong()) return;
    int flag;
    flag = 0;
    int i,j;
    i = rand() % 4;
    j = rand() % 4;
    while(!(shuzu[i][j] == 0)){
        i = rand() % 4;
        j = rand() % 4;
        flag = 1;
    }
    int a;
    a = rand() % 2;
    if(a == 0){
        a = 2;
    }
    else{
        a = 4;
    }
    shuzu[i][j] = a;
}

然后左右上下的移动,也是这个小游戏最核心的的地方,这里只拿左移做例子,剩下的明白了原理都可以推出来

void left_go()
     
{
    int j,i,k;//i为行,j,k均为列
    for(i = 0; i < 4; i++){
        for(j = 0; j < 3; j++){//左移依次判断左三列,每一个数均向右找相同数字
            for(k = j+1; k < 4; k++){//从当前列往右找一列
			if(shuzu[i][j] == 0){//当前数值为空时
				if(shuzu[i][k] != 0){//右一列不为空
					shuzu[i][j] = shuzu[i][k];//将右侧的数移动过来
					shuzu[i][k] = 0;//右侧清空
				}
			}
		   else if (shuzu[i][j] != 0 && shuzu[i][k] != 0 && shuzu[i][j] != shuzu[i][k]) {
		   //如果当前位置不为空且右侧不为空,两数不同则直接跳转至下一行
                break;
            }
            else if(flag[i][j] == 0 && shuzu[i][j] == shuzu[i][k]){
                /*falg数组作用为判断本次移动中当前判断位置是否移动过,以避免
                【2】【2】【2】【2】直接变成
                【8】【 】【 】【 】的情况
                */
                  	flag[i][j] = 1;//标记此位置已经移动过
					shuzu[i][j] *= 2;
                    shuzu[i][k] = 0;//移动过来的位置清0
					continue;
                }
            }
        }
    }
}

源代码,定义全局变量的

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

//分配内存的大小
#define     SIZE    10
//定义按键们的宏
#define     ESC     "\033"
#define     UP      "\033[A"
#define     DOWN    "\033[B"
#define     LEFT    "\033[D"
#define     RIGHT   "\033[C"
int shuzu[4][4];
int flag[4][4];

int chachong()
{
    int i,j;
    for(i = 0; i < 4; i++){
        for(j = 0; j < 4; j++){
            if(shuzu[i][j] == 0){
                return 1;
            }
        }
    }
    return 0;
}

void rad()
{
    if(!chachong()) return;
    int flag;
    flag = 0;
    int i,j;
    i = rand() % 4;
    j = rand() % 4;
    while(!(shuzu[i][j] == 0)){
        i = rand() % 4;
        j = rand() % 4;
        flag = 1;
    }
    int a;
    a = rand() % 2;
    if(a == 0){
        a = 2;
    }
    else{
        a = 4;
    }
    shuzu[i][j] = a;
}

void right_go()
{
    int j,i,k;
    for(i = 0; i < 4; i++){
        for(j = 3; j > 0; j--){
            for(k = j-1; k >= 0; k--){
			if(shuzu[i][j] == 0){
				if(shuzu[i][k] != 0){
					shuzu[i][j] = shuzu[i][k];
					shuzu[i][k] = 0;
				}
			}
            else if (shuzu[i][j] != 0 && shuzu[i][k] != 0 && shuzu[i][j] != shuzu[i][k]) {
                break;
            }
            else if(flag[i][j] == 0 && shuzu[i][j] == shuzu[i][k]){
                  	flag[i][j] = 1;
					shuzu[i][j] *= 2;
                    shuzu[i][k] = 0;
					continue;
              		 }
			}
        }
    }
}

void left_go()
     
{
    int j,i,k;
    for(i = 0; i < 4; i++){
        for(j = 0; j < 3; j++){
            for(k = j+1; k < 4; k++){
			if(shuzu[i][j] == 0){
				if(shuzu[i][k] != 0){
					shuzu[i][j] = shuzu[i][k];
					shuzu[i][k] = 0;
				}
			}
            else if (shuzu[i][j] != 0 && shuzu[i][k] != 0 && shuzu[i][j] != shuzu[i][k]) {
                break;
            }
            else if(flag[i][j] == 0 && shuzu[i][j] == shuzu[i][k]){
                  	flag[i][j] = 1;
					shuzu[i][j] *= 2;
                    shuzu[i][k] = 0;
					continue;
                }
            }
        }
    }
}

void down_go()
{
    int j,i,k;
    for(j = 0; j < 4; j++){
		for(i = 3; i>0; i--){
			for(k = i-1; k >= 0; k--){
   				if(shuzu[i][j] == 0 && shuzu[k][j] != 0){
					shuzu[i][j] = shuzu[k][j];
					shuzu[k][j] = 0;
				}
                else if (shuzu[i][j] != 0 && shuzu[k][j] != 0 && shuzu[i][j] != shuzu[k][j]) {
                    break;
                }
				else if(flag[i][j] == 0 && shuzu[i][j] == shuzu[k][j]){
					flag[i][j] = 1;
					shuzu[i][j] *=2;
					shuzu[k][j] = 0;
					continue;
				}
			}
		}
	}
}


void up_go()
{
    int j,i,k;
    for(j = 0; j < 4; j++){
		for(i = 0; i < 3; i++){
			for(k = i+1; k < 4; k++){
   				if(shuzu[i][j] == 0 && shuzu[k][j] != 0){
					shuzu[i][j] = shuzu[k][j];
					shuzu[k][j] = 0;
				}
                else if (shuzu[i][j] != 0 && shuzu[k][j] != 0 && shuzu[i][j] != shuzu[k][j]) {
                    break;
                }
				else if(flag[i][j] == 0 && shuzu[i][j] == shuzu[k][j]){
					flag[i][j] = 1;
					shuzu[i][j] *=2;
					shuzu[k][j] = 0;
					continue;
				}
			}
		}
	}
}

int main()
{
    char *get = (char*)malloc(SIZE);

    int i,j;
    i = rand() % 4;
    j = rand() % 4;
    int a;
    a = rand() % 2;
    if(a == 0){
        a = 2;
    }
    else{
        a = 4;
	}
   	 
	shuzu[i][j] = a;
	for(i = 0; i < 4; i++){
		for(j = 0; j < 4; j++){
			printf("[%d]",shuzu[i][j]);
		}
		printf("\n");
	}
    for ( ; ; )
    {
		for(i = 0; i < 4; i++){
			for(j = 0; j < 4; j++){
				flag[i][j] = 0;
			}
		}
        fgets(get, SIZE, stdin);
        get[strlen(get) - 1] = '\0';

        if (!strcmp(get, ESC)){
            printf("This is \"ESC\" button!\n");
			break;
		}
        if (!strcmp(get, UP)){
            printf("This is \"UP\" button!\n");
			up_go();
		}
        if (!strcmp(get, DOWN)){
            printf("This is \"DOWN\" button!\n");
			down_go();
		}
        if (!strcmp(get, LEFT)){
            printf("This is \"LEFT\" button!\n");
			left_go();
		}
        if (!strcmp(get, RIGHT)){
            printf("This is \"RIGHT\" button!\n");
			right_go();
		}
		for(i = 0; i < 4; i++){
			for(j = 0; j < 4; j++){
				printf("[%5d]",shuzu[i][j]);
			}
			printf("\n");
		}
        if (!chachong()) {
            printf("Game over!\n");
            break;
        }
		rad();
		printf("************\n");	
		for(i = 0; i < 4; i++){
			for(j = 0; j < 4; j++){
				printf("[%5d]",shuzu[i][j]);
			}
			printf("\n");
   		 }
	}

    return 0;
}

源代码,传参的

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

//分配内存的大小
#define     SIZE    10
//定义按键们的宏
#define     ESC     "\033"
#define     UP      "\033[A"
#define     DOWN    "\033[B"
#define     LEFT    "\033[D"
#define     RIGHT   "\033[C"

int chachong(int(*shuzu)[4])
{
    int i, j;
    for (i = 0; i < 4; i++) {
        for (j = 0; j < 4; j++) {
            if (*(shuzu[i] + j) == 0) {
                return 1;
            }
        }
    }
    return 0;
}


void rad(int(*shuzu)[4])
{
    int flag;
    flag = 0;
    int i, j;
    i = rand() % 4;
    j = rand() % 4;
    while (!(*(shuzu[i] + j) == 0)) {
        i = rand() % 4;
        j = rand() % 4;
        flag = 1;
    }
    int a;
    a = rand() % 2;
    if (a == 0) {
        a = 2;
    }
    else {
        a = 4;
    }
    *(shuzu[i] + j) = a;
}

void right_go(int(*shuzu)[4], int(*flag)[4])
{
    int j, i, k;
    for (i = 0; i < 4; i++) {
        for (j = 3; j > 0; j--) {
            for (k = j - 1; k >= 0; k--) {
                if (*(shuzu[i] + j) == 0) {
                    if (*(shuzu[i] + k) != 0) {
                        *(shuzu[i] + j) = *(shuzu[i] + k);
                        *(shuzu[i] + k) = 0;
                    }
                }
                else if (*(shuzu[i] + j) != 0 && *(shuzu[i] + k) != 0 && *(shuzu[i] + j) != *(shuzu[i] + k)) {
                    break;
                }
                else if (*(flag[i] + j) == 0 && *(shuzu[i] + j) == *(shuzu[i] + k)) {
                    *(flag[i] + j) = 1;
                    *(shuzu[i] + j) *= 2;
                    *(shuzu[i] + k) = 0;
                    continue;
                }
            }
        }
    }
}

void left_go(int(*shuzu)[4], int(*flag)[4])

{
    int j, i, k;
    for (i = 0; i < 4; i++) {
        for (j = 0; j < 3; j++) {
            for (k = j + 1; k < 4; k++) {
                if (*(shuzu[i] + j) == 0) {
                    if (*(shuzu[i] + k) != 0) {
                        *(shuzu[i] + j) = *(shuzu[i] + k);
                        *(shuzu[i] + k) = 0;
                    }
                }
                else if (*(shuzu[i] + j) != 0 && *(shuzu[i] + k) != 0 && *(shuzu[i] + j) != *(shuzu[i] + k)) {
                    break;
                }
                else if (*(flag[i] + j) == 0 && *(shuzu[i] + j) == *(shuzu[i] + k)) {
                    *(flag[i] + j) = 1;
                    *(shuzu[i] + j) *= 2;
                    *(shuzu[i] + k) = 0;
                    continue;
                }
            }
        }
    }
}

void down_go(int(*shuzu)[4], int(*flag)[4])
{
    int j, i, k;
    for (j = 0; j < 4; j++) {
        for (i = 3; i > 0; i--) {
            for (k = i - 1; k >= 0; k--) {
                if (*(shuzu[i] + j) == 0 && *(shuzu[k] + j) != 0) {
                    *(shuzu[i] + j) = *(shuzu[k] + j);
                    *(shuzu[k] + j) = 0;
                }
                else if (*(shuzu[i] + j) != 0 && *(shuzu[k] + j) != 0 && *(shuzu[i] + j) != *(shuzu[k] + j)) {
                    break;
                }
                else if (*(flag[i] + j) == 0 && *(shuzu[i] + j) == *(shuzu[k] + j)) {
                    *(flag[i] + j) = 1;
                    *(shuzu[i] + j) *= 2;
                    *(shuzu[k] + j) = 0;
                    continue;
                }
            }
        }
    }
}


void up_go(int(*shuzu)[4], int(*flag)[4])
{
    int j, i, k;
    for (j = 0; j < 4; j++) {
        for (i = 0; i < 3; i++) {
            for (k = i + 1; k < 3; k++) {
                if (*(shuzu[i] + j) == 0 && *(shuzu[k] + j) != 0) {
                    *(shuzu[i] + j) = *(shuzu[k] + j);
                    *(shuzu[k] + j) = 0;
                }
                else if (*(shuzu[i] + j) != 0 && *(shuzu[k] + j) != 0 && *(shuzu[i] + j) != *(shuzu[k] + j)) {
                    break;
                }
                else if (*(flag[i] + j) == 0 && *(shuzu[i] + j) == *(shuzu[k] + j)) {
                    *(flag[i] + j) = 1;
                    *(shuzu[i] + j) *= 2;
                    *(shuzu[k] + j) = 0;
                    continue;
                }
            }
        }
    }
}

int main()
{
    int shuzu[4][4];
    int flag[4][4];
    char* get = (char*)malloc(SIZE);

    int i, j;
    for (i = 0; i < 4; i++) {
        for (j = 0; j < 4; j++) {
            *(shuzu[i] + j) = *(flag[i] + j) = 0;
        }
    }
    i = rand() % 4;
    j = rand() % 4;
    int a;
    a = rand() % 2;
    if (a == 0) {
        a = 2;
    }
    else {
        a = 4;
    }

    *(shuzu[i] + j) = a;
    for (i = 0; i < 4; i++) {
        for (j = 0; j < 4; j++) {
            printf("[%d]", *(shuzu[i] + j));
        }
        printf("\n");
    }
    for (; ; )
    {
        for (i = 0; i < 4; i++) {
            for (j = 0; j < 4; j++) {
                *(flag[i] + j) = 0;
            }
        }
        fgets(get, SIZE, stdin);
        get[strlen(get) - 1] = '\0';

        if (!strcmp(get, ESC)) {
            printf("This is \"ESC\" button!\n");
            break;
        }
        if (!strcmp(get, UP)) {
            printf("This is \"UP\" button!\n");
            up_go(shuzu, flag);
        }
        if (!strcmp(get, DOWN)) {
            printf("This is \"DOWN\" button!\n");
            down_go(shuzu, flag);
        }
        if (!strcmp(get, LEFT)) {
            printf("This is \"LEFT\" button!\n");
            left_go(shuzu, flag);
        }
        if (!strcmp(get, RIGHT)) {
            printf("This is \"RIGHT\" button!\n");
            right_go(shuzu, flag);
        }
        for (i = 0; i < 4; i++) {
            for (j = 0; j < 4; j++) {
                printf("[%5d]", *(shuzu[i] + j));
            }
            printf("\n");
        }
        if (!chachong(shuzu)) {
            printf("Game over!\n");
            break;
        }
        rad(shuzu);
        printf("************\n");
        for (i = 0; i < 4; i++) {
            for (j = 0; j < 4; j++) {
                printf("[%5d]", *(shuzu[i] + j));
            }
            printf("\n");
        }
    }

    return 0;
}


*少了个判断没移动时还会生成随机数的,挺简单的就不补了

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值