c语言控制台推箱子小游戏

本文介绍了一个使用C语言编写的控制台推箱子小游戏。编程思路来源于网络,关卡设计参考易语言例程,包含18个关卡。代码通过双缓冲消除闪烁,利用switch语句进行逻辑处理。程序具有一定的局限性,如在CodeBlocks的Debug模式下可能出现问题。
摘要由CSDN通过智能技术生成

这是最早编写的一个小程序,编程思路源于网络。

用CodeBlocks16.01编绎通过。

关卡设计参考易语言例程,十八个关卡的数组初始值,看图手工填写了两个多小时。

或许是很笨办法,高手请多指教。

 编程思路:

     二维数组指定对象的位置和种类。

二   双缓存消除屏幕闪烁。

    核心代码 switch语句计算出字符的逻辑变化。

有了思路,代码就容易写了,下面是界面图:


十八关图,好多箱子,眼都花了,对得起推箱仙人的称号:


主程序代码:

/********************************
名称:推箱子
描述:用控制台程序实现推箱子小游戏
编译:codeblocks16.01 vs2010
创建:零千刻
日期:170502
*********************************/
#include <windows.h>//Sleep(100)
#include <stdlib.h>//system()
#include <stdio.h>
#include <conio.h> //getch需要
extern int map1[14][16], map2[14][16], map3[14][16], map4[14][16],map5[14][16],
       map6[14][16], map7[14][16], map8[14][16],map9[14][16], map10[14][16],
       map11[14][16], map12[14][16],map13[14][16], map14[14][16], map15[14][16],
       map16[14][16],map17[14][16], map18[14][16];
void DrawMap();
void PlayGame();
void TextManage();
void DrawMapBase();
void nextMap();
void TextChange();
void stopFlash();
HANDLE hOutput;
HANDLE hOutBuf;
COORD coord= {0,0}; //COORD是Windows API中定义的一种结构,表示一个字符在控制台屏幕上的坐标。
int stra=strlen("┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n");
int map[14][16]= {};
bool mapNumWait=true;//地图关卡数
int mapNumGoing=1;//地图关卡数
int mapNumGoingC=1;//地图关卡数副本
bool nextm=true;
bool textc=false;
bool nextK=true;
int iox=0;
int jox=0;
char data[720];//控制台默认一行为80个半角字符,
DWORD bytes=0;


int main()
{


    //获取默认标准显示缓冲区句柄
    hOutput=GetStdHandle(STD_OUTPUT_HANDLE);
    // 获取标准输出设备句柄
    //CONSOLE_SCREEN_BUFFER_INFO bInfo; // 窗口缓冲区信息
    //GetConsoleScreenBufferInfo(hOutput, bInfo );
    // 获取窗口缓冲区信息
    //char strTitle[255];
    //GetConsoleTitle(strTitle, 255); // 获取窗口标题
    //printf("当前窗口标题是:%s\n", strTitle);
    //_getch();
    SetConsoleTitle(TEXT("推箱子")); // 获取窗口标题
    //_getch();
    COORD size = {80-20, 25+2};
    SetConsoleScreenBufferSize(hOutput,size); // 重新设置缓冲区大小
    //_getch();
    SMALL_RECT rc = {0,0, 80-20, 25+2}; // 重置窗口位置和大小
    SetConsoleWindowInfo(hOutput,true,&rc);
    //CloseHandle(hOutput); // 关闭标准输出设备句柄
    //创建新的缓冲区
    hOutBuf = CreateConsoleScreenBuffer(
                  GENERIC_READ | GENERIC_WRITE,
                  FILE_SHARE_READ | FILE_SHARE_WRITE,
                  NULL,
                  CONSOLE_TEXTMODE_BUFFER,
                  NULL
              );


    //设置新的缓冲区为活动显示缓冲
    SetConsoleActiveScreenBuffer(hOutBuf);


    //隐藏两个缓冲区的光标
    CONSOLE_CURSOR_INFO cci;
    cci.bVisible=0;
    cci.dwSize=1;
    SetConsoleCursorInfo(hOutput, &cci);
    SetConsoleCursorInfo(hOutBuf, &cci);


    //双缓冲处理显示
    SetConsoleTextAttribute(hOutBuf,0|11);


    TextManage();


    while (1)
    {


        stopFlash();
        DrawMapBase();
        DrawMap();
        ReadConsoleOutputCharacterA(hOutBuf, data, 720, coord, &bytes);
        Sleep(30);
        WriteConsoleOutputCharacterA(hOutput, data,720, coord, &bytes);


        nextMap(); //函数调用顺序很重要,若放最后,会有推箱未完就换图之状
        TextChange();
        PlayGame();
    }
    return 0;


}


void DrawMapBase()
{
    if(mapNumWait)//bool判断中勿再赋值
    {


        for(int m=0; m<14; m++)
        {
            for(int n=0; n<16; n++)
            {
                switch(mapNumGoing)
                {
                case 1:
                    map[m][n]=map1[m][n];
                    break;
                case 2:
                    map[m][n]=map2[m][n];
                    break;
                case 3:
                    map[m][n]=map3[m][n];
                    break;
                case 4:
                    map[m][n]=map4[m][n];
                    break;
                case 5:
                    map[m][n]=map5[m][n];
                    break;
                case 6:
                    map[m][n]=map6[m][n];
                    break;
                case 7:
                    map[m][n]=map7[m][n];
                    break;
                case 8:
                    map[m][n]=map8[m][n];
                    break;
                case 9:
                    map[m][n]=map9[m][n];
                    break;
                case 10:
                    map[m][n]=map10[m][n];
                    break;
                case 11:
                    map[m][n]=map11[m][n];
                    break;
                case 12:
                    map[m][n]=map12[m][n];
                    break;
                case 13:
                    map[m][n]=map

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值