这是最早编写的一个小程序,编程思路源于网络。
关卡设计参考易语言例程,十八个关卡的数组初始值,看图手工填写了两个多小时。
或许是很笨办法,高手请多指教。
编程思路:
一 二维数组指定对象的位置和种类。
二 双缓存消除屏幕闪烁。
三 核心代码 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