用C语言实现小游戏-----2048

我在只前的博客里完成了没有界面的小游戏和电脑对弈的三子棋,用C语言实现小游戏–三子棋
以及充满我们同年回忆的小游戏扫雷用C语言实现小游戏–扫雷
接下来,我们再写一个同样比较简单的,无界面,小游戏,电脑操作的游戏2048
这里写图片描述
虽然没有界面,但是我们要显示一个框架,对应显示各个位置的数,要从键盘接受上下左右,来实现整个块的上,下,左,右移动,增大积分,以及判断是否还有空位,是否游戏继续等,

#define Row 4 //行
#define Col 4 //列
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<time.h>
#include<windows.h>

void menu();
int game();
void PlayerGo(int arr[Row][Col], int row, int col);
void Display(int arr[Row][Col], int row, int col);
void Init(int arr[Row][Col], int row, int col, char f);
char IsWin(int arr[Row][Col], int row, int col);
void ComputerGo(int arr[Row][Col], int row, int col);
#endif // __GAME_H__
#include"game.h"
void menu()//菜单
{
    system("color F9");
    printf("\n\n\n\n\t\t欢迎来到2048");
    Sleep(2000);
    system("cls");
    printf("\n\n\t****************************\n");
    printf("\t****   1.开始游戏      *****\n");
    printf("\t****   0.退出          *****\n");
}
void Init(int arr[Row][Col], int rows, int cols, char f)//数组初始化
{
    memset(arr, f, rows*cols*16);
}
void Display(int arr[Row][Col], int row, int col)//显示
{
    int i = 0;
    int j = 0;
    printf("\t\t\t");
    for (i = 0; i < row; i++)
    {
        printf(" ______");
    }
    for (i = 0; i < row; i++)
    {
        printf("\n\t\t\t|");
        for (j = 0; j < col; j++)
        {
            if (arr[i][j] == 0)
                printf("_    _|");
            else
                printf("_%4d_|", arr[i][j]);
        }
    }
}
void NumMoveup(int arr[Row][Col], int row, int col,int ud)
{
    int i = 0;
    int j = 0;
    for (i = row-1; i >0; i--)
    {
        for (j = 0; j < col; j++)
        {
            if (arr[i - ud][j] == 0)
            {
                arr[i - ud][j] = arr[i][j];
                arr[i][j] = 0;
            }
            else if (arr[i - ud][j] == arr[i][j])
            {
                arr[i - ud][j] = 2 * arr[i][j];
                arr[i][j] = 0;
            }
        }
    }
}
void NumMovedown(int arr[Row][Col], int row, int col, int ud)
{
    int i = 0;
    int j = 0;
    for (i = 0; i < row-1; i++)
    {
        for (j = 0; j < col; j++)
        {
            if (arr[i +ud][j] == 0)
            {
                arr[i +ud][j] = arr[i][j];
                arr[i][j] = 0;
            }
            else if (arr[i + ud][j] == arr[i][j])
            {
                arr[i + ud][j] = 2 * arr[i][j];
                arr[i][j] = 0;
            }
        }
    }
}
void NumMoveleft(int arr[Row][Col], int row, int col, int lr)
{
    int i = 0;
    int j = 0;
    for (i = 0; i < row; i++)
    {
        for (j = col-1; j >0; j--)
        {
            if (arr[i][j-lr] == 0)
            {
                arr[i][j-lr] = arr[i][j];
                arr[i][j] = 0;
            }
            else if (arr[i][j-lr] == arr[i][j])
            {
                arr[i][j-lr] = 2 * arr[i][j];
                arr[i][j] = 0;
            }
        }
    }
}
void NumMoveright(int arr[Row][Col], int row, int col, int lr)
{
    int i = 0;
    int j = 0;
    for (i = 0; i < row; i++)
    {
        for (j = 0; j < col-1; j++)
        {
            if (arr[i][j + lr] == 0)
            {
                arr[i][j + lr] = arr[i][j];
                arr[i][j] = 0;
            }
            else if (arr[i][j + lr] == arr[i][j])
            {
                arr[i][j + lr] = 2 * arr[i][j];
                arr[i][j] = 0;
            }
        }
    }
}
void  PlayerGo(int arr[Row][Col], int row, int col)
{
    int  n = 0;
    char a=0;
    while (1)
    {
        if(getchar()=='\n')
            printf("\n\n\t\t请玩家输入上下左右以此对应(WSAD):>");
        scanf("%c", &a);
        if (a == 'A' || a == 'a')n = 3;
        else if (a == 'S' || a == 's')n = 2;
        else if (a == 'd' || a == 'D')n = 4;
        else if (a == 'w' || a == 'W')n = 1;
        switch (n)
        {
        case 1: NumMoveup(arr,row,col,1); break;
        case 2:NumMovedown(arr,row,col,1); break;
        case 3:NumMoveleft(arr, row, col, 1); break;
        case 4:NumMoveright(arr, row, col, 1); break;
        default:printf("输入错误请重新输入\n"); n = 0; break;
        }
        if(n!=0)break;
    }
}
char IsWin(int arr[Row][Col], int row, int col)
{
    int i = 0; int j = 0;
    int count=0;
    for (i = 0; i < row; i++)
        for (j = 0; j < col; j++)
        {
            if (arr[i][j] == 2048)
                return 'Y';
            else if (arr[i][j] == 0)
                count++;
        }
    if (count == 0) return 'N';
    return '0';
}
void ComputerGo(int arr[Row][Col], int row, int col)
{
    int r = 0;
    int c = 0;
    //printf("\n\n\t\t请电脑走:>\n");
    while (1)
    {
        r = rand() % row;
        c = rand() % col;
        if (arr[r][c] == 0)
        {
            arr[r][c] = 2; 
            Display(arr, row, col);
            break;
        }
    }
}

界限来显示开始界面,退出界面。给个开始int main 就好了

#include"game.h"
int game() //游戏
{
    int show[Row][Col];
    Init(show, Row, Col,0);
    char fin = '0';
    while (1)
    {
        if(fin='0')
            ComputerGo(show, Row, Col);
        fin = IsWin(show, Row, Col);
        if (fin != '0')break;
        PlayerGo(show, Row, Col);
        fin = IsWin(show, Row, Col);
        if (fin != '0')break;
    }
    if (IsWin(show, Row, Col) != 'N')
    {
        system("cls");
        system("color F2");
        Display(show, Row, Col);
        printf("\n\n\n\t\t恭喜您,您赢了哦*★*:.☆( ̄▽ ̄)/$:*.°★* 。\n");
    }
    else 
    printf("\n\n\n\t\t很遗憾您输了。\n");
    system("pause");
    exit(0);
}
int main()
{
    srand((unsigned int)time(NULL));
    int input = 0;
    do {
        menu();
        printf("请输入您的选择:>");
        scanf("%d", &input);
        if (input == 1)
        {
            game(); 
        }
        else 
            if (input == 0) printf("\t退出游戏\n");
    } while (input != 0);
    return 0;
}

这个游戏实现,较为简单,没有贪吃蛇这样的游戏,那么庞大,适合只有c语言基础的新手尝试。自娱自乐嘛

猜你喜欢

转载自blog.csdn.net/weixin_40921797/article/details/81449155