基于linux系统下用C语言实现2048小游戏

您所在的位置:网站首页 2048游戏编程详细代码c语言 基于linux系统下用C语言实现2048小游戏

基于linux系统下用C语言实现2048小游戏

2024-06-03 17:07| 来源: 网络整理| 查看: 265

简介:

本文章主要是在linux系统下用C语言还原2048的小游戏。

总体思路为

最初始时在4*4的二维数组的随机两个位置生成两个基础值:2,其他位置为0。用键盘上的wasd操作数字的移动。每次进行操作之后,在为0的位置随机生成2或者4出现2048时显示“you win!”没有可合并的数字且数组被占满,则显示“you lost!” 窗口操作:

        curses是一个在Linux/Unix下广泛应用的图形函数库,作用是可以在终端内绘制简单的图形用户界面。安装库:sudo apt-get install libncurses5-dev。使用时包含头文件:curses.h。编译时应加上链接语句-lcurses,如:gcc main.c -o main -lcurses。

整体操作:

1.初始化终端窗口

        initscr();//初始化屏幕

        curs_set(0); // 隐藏光标

        cbreak();//字符已进入,直接传递给程序

        noecho();//禁止输入显示在屏幕

        keypad(stdscr,TRUE);//启用键盘输入

2.创建窗口

         WINDOW *w_2048 = NULL;

         w_2048 = newwin(4, 20, 7, 20);

3.初始化游戏

        initialize():数组初始化,并在随机两个位置生成2。

4.生成随机值2或4

        addRandom()

5.左移、右移、上移、下移

        MoveLeft();

        MoveRight();

        MoveUp();

        MoveDown();

6.游戏进行函数

        Continue();//返回值为moved,并通过moved判断是否数组出现变化。

7.打印

        PrintfScreen();//将存放数字型数组转化为存放字符串的数组显示在窗口中,并刷新窗口内容。

8.获得2048则会显示you win窗口,数组满且无可合并数则you lost。按住q键退出。

随机数生成:

在随机数生成时,本来使用的是定义一个二维数组a[][]存储原数组num_2048中0的位置,再从a数组中随机xy赋值2或4,代码如下:

int count = 0; int a[4*4][2]; int i, j; for (i = 0; i < 4; i++) { for (j = 0; j < 4; j++) { if (num_2048[i][j] == 0) { a[count][0] = i; a[count][1] = j; count++; } } } if (count > 0) { int index = rand() % count; int x = a[index][0]; int y = a[index][1]; num_2048[x][y] = (rand() % 2 + 1) * 2; }

 在搜索C语言实现2048游戏_2048游戏c语言_The Laughing Uncle的博客-CSDN博客时在发现了更加简便的随机值方法,在此借鉴其方法进行了改进:

int x = 0; int y = 0; do { x = rand() % 4; y = rand() % 4; } while (num_2048[x][y]); num_2048[x][y] = (rand() % 10 ? 2 : 4);  详细代码: #include #include #include #include int num_2048[4][4]; char str[10] = {0};//存放数字转化为字符串 //初始化 void initialize() { // 初始化游戏面板 int i, j; for (i = 0; i < 4; i++) { for (j = 0; j < 4; j++) { num_2048[i][j] = 0; } } srand(time(NULL)); int x1 = rand() % 4; int y1 = rand() % 4; int x2, y2; do { x2 = rand() % 4; y2 = rand() % 4; } while (x1 == x2 && y1 == y2); num_2048[x1][y1] = 2; num_2048[x2][y2] = 2; } // 在空位置随机添加一个2或4 void addRandom() { int x = 0; int y = 0; do { x = rand() % 4; y = rand() % 4; } while (num_2048[x][y]); num_2048[x][y] = (rand() % 10 ? 2 : 4); } //左移 int MoveLeft() { int moved = 0; for (int i = 0; i < 4; i++) { int k = 0; for (int j = 1; j < 4; j++) { if (num_2048[i][j] != 0) { if (num_2048[i][k] == 0) { num_2048[i][k] = num_2048[i][j]; num_2048[i][j] = 0; moved = 1; } else if(num_2048[i][k] == num_2048[i][j]) { num_2048[i][k] = 2 * num_2048[i][k]; num_2048[i][j] = 0; k++; moved = 1; } else { num_2048[i][k+1] = num_2048[i][j]; if (j != k + 1) { num_2048[i][j] = 0; moved = 1; } k =k + 1; } } } } return moved; } int MoveRight() { int moved = 0; for (int i = 0; i < 4; i++) { int j = 2; int k = 3; for (; j >= 0; j--) { if (num_2048[i][j] > 0) { if (num_2048[i][k] == 0) { num_2048[i][k] = num_2048[i][j]; num_2048[i][j] = 0; moved = 1; } else if(num_2048[i][k] == num_2048[i][j]) { num_2048[i][k] = 2 * num_2048[i][k]; num_2048[i][j] = 0; k--; moved = 1; } else { num_2048[i][k-1] = num_2048[i][j]; if (j != k-1) { num_2048[i][j] = 0; moved = 1; } k = k - 1; } } } } return moved; } int MoveUp() { int moved = 0; for (int j = 0; j < 4; j++) { int i = 1; int k = 0; for (; i < 4; i++) { if (num_2048[i][j] > 0) { if (num_2048[k][j] == 0) { num_2048[k][j] = num_2048[i][j]; num_2048[i][j] = 0; moved = 1; } else if(num_2048[k][j] == num_2048[i][j]) { num_2048[k][j] = 2 * num_2048[k][j]; num_2048[i][j] = 0; k++; moved =1; } else { num_2048[k+1][j] = num_2048[i][j]; if (i != k+1) { num_2048[i][j] = 0; moved = 1; } k = k + 1; } } } } return moved; } int MoveDown() { int moved = 0; for (int j = 0; j < 4; j++) { int i = 2; int k = 3; for (; i >= 0; i--) { if (num_2048[i][j] > 0) { if (num_2048[k][j] == 0) { num_2048[k][j] = num_2048[i][j]; num_2048[i][j] = 0; moved = 1; } else if(num_2048[k][j] == num_2048[i][j]) { num_2048[k][j] = 2 * num_2048[k][j]; num_2048[i][j] = 0; k--; moved = 1; } else { num_2048[k-1][j] = num_2048[i][j]; if (i != k-1) { num_2048[i][j] = 0; moved = 1; } k = k - 1; } } } } return moved; } //判断胜利 int IWin() { for (int i = 0; i < 4; i++) { for (int j = 0; j < 4; j++) { if (num_2048[i][j] == 16) { return 1; //表示赢了 } } } for (int i = 0; i < 4; i++) { for (int j = 0; j < 4; j++) { if (num_2048[i][j] == 0) { return 0; //表示继续游戏 } if (i < 3 && num_2048[i][j] == num_2048[i + 1][j]) { return 0; // 相邻位置有相同数字,游戏未结束 } if (j < 3 && num_2048[i][j] == num_2048[i][j + 1]) { return 0; // 相邻位置有相同数字,游戏未结束 } } } return -1; //输了 } //游戏进行 void Continue() { char move; scanf("%c",&move); int moved = 0; switch(move) { case 'w': moved = MoveUp(); break; case 's': moved = MoveDown(); break; case 'a': moved = MoveLeft(); break; case 'd': moved = MoveRight(); break; } if(moved) { addRandom(); } } //打印 void PrintScreen(WINDOW *w_2048) { for(int i = 0; i < 4; i++) { for(int j = 0; j < 4; j++) { sprintf(str, "%-5d", num_2048[i][j]); wmove(w_2048, i, j*5); waddstr(w_2048, str); } } wrefresh(w_2048);//刷新窗口 } int main() { //初始化 initscr();//初始化屏幕 curs_set(0); // 隐藏光标 cbreak();//字符已进入,直接传递给程序 noecho();//禁止输入显示在屏幕 keypad(stdscr,TRUE);//启用键盘输入 //创建窗口 WINDOW *w_2048 = NULL; w_2048 = newwin(4, 20, 7, 20); initialize(); PrintScreen(w_2048); //键盘操作 while(1) { if(IWin() == 1) { mvprintw(5,0,"YOU WIN!"); break; } if(IWin() == -1) { mvprintw(5,0,"YOU LOST!"); break; } else { PrintScreen(w_2048); Continue(); } } while(1) { char quit = getch(); if(quit == 'q') { endwin(); } } return 0; } 补充:

鉴于方便所需要的的兄弟们借鉴引用且代码难点较少。在此不多赘述代码更多细节。看情况根据需求更新后续代码细节讲解或对代码的改进。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3