当前位置: 首页 > 编程笔记 >

linux控制台下实现2048小游戏

阎冠玉
2023-03-14
本文向大家介绍linux控制台下实现2048小游戏,包括了linux控制台下实现2048小游戏的使用技巧和注意事项,需要的朋友参考一下

废话少说,直接奉上代码:

main.c


#include"2048.h"

int main()

{

    start_game();

    return 0;

}

2048.h


#ifndef _2048_H_

#define _2048_H_

#include<stdio.h>

#include<stdlib.h>

#include<string.h>

#include<termios.h>

//#include<unstd.h>

//#include<time/sys.h>

#define LINE 21

#define ROW   22

#define ARR_L 4

#define ARR_R 4

#define NUM_COLOR 32

#define BACK 49

#define BOLD 31

static int line_location=0;

static int row_location=0;

static int arr[4][4]={0};

static char tmp[5]="\0";

static int end_flag=0;

static int score=0;

static int print_appear_flag=0;

static char start_back0[LINE][ROW]={

    "@@@@@@@@@@@@@@@@@@@@@",

    "@    @    @    @    @",

    "@    @    @    @    @",

    "@    @    @    @    @",

    "@@@@@@@@@@@@@@@@@@@@@",

    "@    @    @    @    @",

    "@    @    @    @    @",

    "@    @    @    @    @",

    "@@@@@@@@@@@@@@@@@@@@@",

    "@    @    @    @    @",

    "@    @    @    @    @",

    "@    @    @    @    @",

    "@@@@@@@@@@@@@@@@@@@@@",

    "@    @    @    @    @",

    "@    @    @    @    @",

    "@    @    @    @    @",

    "@@@@@@@@@@@@@@@@@@@@@",

    "@                   @",

    "@ score:            @",

    "@                   @",

    "@@@@@@@@@@@@@@@@@@@@@"

};

int print_start();

char * itoc_2048(int data);

int print_num();

int  mov_left();

int swap_if0l();

int swap();

int put_to(int line, int row);

#endif

2048.c


#include"2048.h"

int start_game()

{

    system("clear");

    printf("\33[?25l");

    print_start();

    ran_appear();

    print_num();

    print_score();

    print_getchar();

    printf("\33[?25h");

}

int print_getchar()

{

    struct termios old,new;

    int ch;

    tcgetattr(0,&old);

    tcgetattr(0,&new);

    new.c_lflag = new.c_lflag &~(ICANON |ECHO);

    new.c_cc[VTIME]=0;

    new.c_cc[VMIN]=1;

    tcsetattr(0,TCSANOW,&new);

    while(1)

    {

        if(end_flag==1)

            break;

        ch=getchar();

        if(ch=='\33')

        {

            ch=getchar();

            if(ch=='[')

            {

                ch=getchar();

                switch(ch)

                {

                    case 'A':

                        mov_up();

                        is_full();

                        break;

                    case 'B':

                        mov_down();

                        is_full();

                        break;

                    case 'C':

                        mov_right();

                        is_full();

                        break;

                    case 'D':

                        mov_left();

                        is_full();

                        break;

                    default:

                        break;

                }

            }

        }

        if(ch=='q')

            break;

        fflush(NULL);

    }

tcsetattr(0,TCSANOW,&old);

}

int print_start()

{   

    int i,j;

    for(i=0;i<LINE;i++)

    {

        for(j=0;j<ROW;j++)

        {

            if(start_back0[i][j]=='@')

            {

                printf("\33[%dm",BACK);

                printf("%c",start_back0[i][j]);

                printf("\33[0m");

            }

            else

                if(start_back0[i][j]!=' ')

                {

                    printf("\33[%dm",BOLD);

                    printf("%c",start_back0[i][j]);

                    printf("\33[0m");

                }

                else

                {   

                    printf("%c",start_back0[i][j]);

                }

        }

    printf("\n");

    }

}

char *itoc_2048(int data)

{

    int x=0;

    int i=4;

    while(i--)

    {

        tmp[i]=data%10+'0';

        data=data/10;

    }

    return tmp;

}

int is_full()

{

    int i,j;

    int count=0;

    for(i=0;i<ARR_L;i++)

        for(j=0;j<ARR_R;j++)

        {

            if(arr[i][j]==0)

                count++;

        }

    if(count==0)

    {

        for(i=0;i<ARR_L;i++)

            for(j=0;j<ARR_R-1;j++)

            {

            if(arr[i][j]==arr[i][j+1])

                return 0;

            if(arr[j][i]==arr[j+1][i])

                return 0;

            }

        end_flag=1;

    }

    return 1;

}

int put_to(int line, int row)

{

    int x,y;

    int i=0;

    char *p=NULL;

    p=itoc_2048(arr[line][row]);

    printf("\33[%d;%dH",3+line*4,2+row*5);

    printf("    ");

    printf("\33[%d;%dH",3+line*4,2+row*5);

    if(arr[line][row]!=0)

        for(i=0;i<4;i++)

        {

            if(p[i]=='0'&&i<1)

                printf(" ");

            else

            if(p[i]!='0')

            {

                printf("\33[%dm",NUM_COLOR);

                printf("%c",p[i]);

                printf("\33[0m");

            }

        }

    else

        if(arr[line][row]==0)

        printf("    ");

}

int print_num()

{

    int i,j;

    for(i=0;i<4;i++)

        for(j=0;j<4;j++)

    put_to(i,j);

}

print_score()

{

    int x,y;

    printf("\33[19;9H");

    printf("%d",score);

}

int ran_appear()

{

    int line,row;

    int i=0;

    int j=0;

    int x,y;

    int arr1[16][2]={0};

    if(print_appear_flag==1)

        return 0;

    for(x=0;x<4;x++)

        for(y=0;y<4;y++)

        {

            if(arr[x][y]==0)

            {

                arr1[i][0]=x;

                arr1[i][1]=y;

                i++;

            }

        }

    srand(time(NULL));

    j=rand()%i;

    if(rand()%2==0)

      {

        arr[arr1[j][0]][arr1[j][1]]=4;

        //arr[arr1[j][0]][arr1[j][1]]=2;

      }

    else

        arr[arr1[j][0]][arr1[j][1]]=2;

}

int mov_left()

{

    int count=0;

    count=mov_l()+count;

    count=sum_2048_l()+count;

    if(count==-2)

        print_appear_flag=1;

    mov_l();

    ran_appear();

    print_num();

    return 0;

}

int mov_right()

{

    int count=0;

    count=mov_r()+count;

    count=sum_2048_r()+count;

    if(count==-2)

        print_appear_flag=1;

    mov_r();

    ran_appear();

    print_num();

    return 0;

}

int mov_up()

{

    int count=0;

    count=mov_u()+count;

    count=sum_2048_u()+count;

    if(count==-2)

        print_appear_flag=1;

    mov_u();

    ran_appear();

    print_num();

    return 0;

}

int mov_down()

{

    int count=0;

    count=mov_d()+count;

    count=sum_2048_d()+count;

    if(count==-2)

        print_appear_flag=1;

    mov_d();

    ran_appear();

    print_num();

    return 0;

}

int swap(int *a,int *b)

{

    int tmp;

    tmp=*a;

    *a=*b;

    *b=tmp;

}

int mov_l()

{

    int line,row;

    int i=3;

    int count=0;

    while(i--)

    {

        for(line=0;line<4;line++)

         for(row=0;row<3;row++)

        {

            if(arr[line][row]==0&&arr[line][row+1]!=0)

            {   

                swap(&arr[line][row],&arr[line][row+1]);

                count++;

                print_appear_flag=0;

            }

        }

    }

    if(count==0)

        return -1;

    return 0;

}

int sum_2048_l()

{

    int line,row;

    int count=0;

    for(row=1;row<4;row++)

        for(line=0;line<4;line++)

        {

            if(arr[line][row]!=0&&arr[line][row-1]==arr[line][row])

            {

                arr[line][row-1]=arr[line][row]+arr[line][row-1];

                arr[line][row]=0;

                score=score+arr[line][row-1];

                print_score();

                count++;

                print_appear_flag=0;

            }

        }

    if(count==0)

        return -1;

return 0;

}

int mov_r()

{

    int line,row;

    int i=3;

    int count=0;

    while(i--)

    {

        for(line=0;line<4;line++)

         for(row=0;row<3;row++)

        {

            if(arr[line][row]!=0&&arr[line][row+1]==0)

            {   

                swap(&arr[line][row],&arr[line][row+1]);

                count++;

                print_appear_flag=0;

            }

        }

    }

    if(count==0)

        return -1;

    return 0;

}

int sum_2048_r()

{

    int line,row;

    int count=0;

    for(row=2;row>=0;row--)

        for(line=0;line<4;line++)

        {

            if(arr[line][row]!=0&&arr[line][row+1]==arr[line][row])

            {

                arr[line][row+1]=arr[line][row]+arr[line][row+1];

                arr[line][row]=0;

                score=score+arr[line][row+1];

                print_score();

                count++;

                print_appear_flag=0;

            }

        }

    if(count==0)

        return -1;

    return 0;

}

int mov_u()

{   

    int line,row;

    int i=3;

    int count=0;

    while(i--)

    {

        for(line=0;line<3;line++)

         for(row=0;row<4;row++)

        {

            if(arr[line][row]==0&&arr[line+1][row]!=0)

            {   

                swap(&arr[line][row],&arr[line+1][row]);

                count++;

                print_appear_flag=0;

            }

        }

    }

    if(count==0)

        return -1;

    return 0;

}

int sum_2048_u()

{

    int line,row;

    int count=0;

        for(line=1;line<4;line++)

        for(row=0;row<4;row++)

        {

            if(arr[line][row]!=0&&arr[line-1][row]==arr[line][row])

            {

                arr[line-1][row]=arr[line][row]+arr[line-1][row];

                arr[line][row]=0;

                score=score+arr[line-1][row];

                print_score();

                count++;

                print_appear_flag=0;

            }

        }

        if(count==0)

            return -1;

        return 0;

}

int mov_d()

{

    int line,row;

    int i=3;

    int count=0;

    while(i--)

    {

        for(line=0;line<3;line++)

         for(row=0;row<4;row++)

        {

            if(arr[line][row]!=0&&arr[line+1][row]==0)

            {   

                swap(&arr[line][row],&arr[line+1][row]);

                count++;

                print_appear_flag=0;

            }

        }

    }

    if(count==0)

        return -1;

    return 0;

}

int sum_2048_d()

{

    int line,row;

    int count=0;

        for(line=2;line>=0;line--)

        for(row=0;row<4;row++)

        {

            if(arr[line][row]!=0&&arr[line+1][row]==arr[line][row])

            {

                arr[line+1][row]=arr[line][row]+arr[line+1][row];

                arr[line][row]=0;

                score=score+arr[line+1][row];

                print_score();

                count++;

                print_appear_flag=0;

            }

        }

        if(count==0)

            return -1;

        return 0;

}

以上就是本文分享的全部代码了,希望对大家学习Linux控制台能够有所帮助。

 类似资料:
  • 本文向大家介绍用VC++6.0的控制台实现2048小游戏的程序,包括了用VC++6.0的控制台实现2048小游戏的程序的使用技巧和注意事项,需要的朋友参考一下 首先感谢这位大侠的无私分享,仔细学习这个程序以后收获很多,试着添加一些注释 源程序是从开源中国看到的,原作者是 刘地(sir?) 地址为http://www.oschina.net/code/snippet_593413_46040 gee

  • 本文向大家介绍C语言控制台版2048小游戏,包括了C语言控制台版2048小游戏的使用技巧和注意事项,需要的朋友参考一下 效果不好,见谅,没事就写了一个!!! 附上另外一个小伙伴的代码 以上所述就是本文的全部内容了,希望大家能够喜欢。

  • 本文向大家介绍python实现2048小游戏,包括了python实现2048小游戏的使用技巧和注意事项,需要的朋友参考一下 2048的python实现。修改自某网友的代码,解决了原网友版本的两个小bug: 1. 原版游戏每次只消除一次,而不是递归消除。如 [2 ,2 ,2 ,2] 左移动的话应该是 [4, 4, 0, 0] , 而不是[8 , 0 , 0 ,0] 2. 对游戏结束的侦测有bug,已

  • 本文向大家介绍Java控制台实现猜拳游戏小游戏,包括了Java控制台实现猜拳游戏小游戏的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了Java猜拳游戏的具体代码,供大家参考,具体内容如下 先来看一下效果图:  首先我们创建一个Person类,这个类有name和score两个属性,有play这个方法,源代码如下: 接下来是主程序入口: 源代码下载:Java猜拳游戏 以上就是本文的全部内

  • 本文向大家介绍使用graphics.py实现2048小游戏,包括了使用graphics.py实现2048小游戏的使用技巧和注意事项,需要的朋友参考一下 1、过年的时候在手机上下载了2048玩了几天,心血来潮决定用py写一个,刚开始的时候想用QT实现,发现依赖有点大。正好看到graphics.py是基于tkinter做的封装就拿来练手,并借用了CSDN一位朋友封装的model.py(2048逻辑部分

  • 本文向大家介绍C语言控制台实现打飞机小游戏,包括了C语言控制台实现打飞机小游戏的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了C语言实现打飞机小游戏的具体代码,供大家参考,具体内容如下 初学C语言总觉得不能做些什么好玩的,这个小游戏只需 “一点点” (千真万确)C语言知识就能完成! 总计不到200行的非空白代码(没有强行压缩行数) 操作说明: 1.W、S、A、D 控制 上 、下、左、