虚位以待(AD)
虚位以待(AD)
首页 > 软件编程 > C/C++编程 > C语言实现2048游戏代码

C语言实现2048游戏代码
类别:C/C++编程   作者:码皇   来源:互联网   点击:

这篇文章主要为大家详细介绍了C语言实现2048游戏代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

本文实例为大家分享了C语言实现2048游戏具体代码,供大家参考,具体内容如下

效果图:

使用文本界面的屏幕绘图库 ncurses.

设计思路:

  • 在满足条件情况下消除方块
  • 允许在游戏主界面(16 宫格)中任意一格输出数据

实现代码:

    #include <stdio.h> #include <stdlib.h> #include <curses.h> #include <unistd.h> #include <signal.h> #include <time.h> void draw();
    // 用于绘制游戏界面 void play();
    // 游戏运行的逻辑主体 void init();
    // 初始化函数,用于完成一些必要的初始化操作 void draw_one(int y, int x);
    // 绘制单个数字 void cnt_value(int *new_y, int *new_x);
    //统计(y, x)对应的格子周围一圈的空格的个数 int game_over();
    // 结束游戏 int cnt_one(int y, int x);
    //统计(y, x)对应的格子周围一圈的空格的个数 // 游戏主界面是一个 4*4 的 16 宫格,使用二维数组进行表示,用 0 表示空格 int a[4][4] = {
    0 }
    ;
    // 16 宫格中空格的个数 int empty;
    int old_y, old_x;
    int main() {
    init();
    play();
    endwin();
    return 0;
    }
    void init() {
    int x, y;
    initscr();
    //开启curses模式 cbreak();
    //开启cbreak模式,除 DELETE 或 CTRL 等仍被视为特殊控制字元外一切输入的字元将立刻被一一读取 noecho();
    //echo() and 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);
    //将游标移动至 x,y 的位置 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: //左移 a case 104: // h 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: //右移 d case 108: // l 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: //上移 w case 107: //k 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: //下移 s case 106: //j 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 >= 0) a[y - 1][x - 1] ? 0 : value++;
    if(y - 1 >= 0 && x + 1 < 4) 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);
    //暂停1秒 endwin();
    //关闭curses并重置tty(结束curses编程时,最后调用的一个函数) exit(0);
    }

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

您可能感兴趣的文章:

  • 2048小游戏C语言实现代码
  • C语言实现2048小游戏
  • C语言实现2048游戏
  • 利用C语言实现2048小游戏的方法
  • C语言控制台版2048小游戏
  • 简单实现C语言2048游戏
相关热词搜索: C语言 2048游戏