资源简介
输入WASD控制人物移动方向,R重置本关卡。
用函数得到人物在输入方向前的第一个和第二个元素的坐标,隐去了在判断是否可以移动时有关WASD的具体细节。
代码片段和文件信息
#include
#include
#include
//三个全局变量,ij代表人物坐标,n代表剩余箱子(目标点)的个数。
//每进入一个关卡,给ijn赋初值。wasd控制人物移动,ijn相应地变化。
//n变为0,代表箱子全部就位,关卡结束。
//优点是,每次移动后,不用全部遍历。
int ijn;
//用二维数组表示地图,枚举类型定义地图的元素。
enum item{SPAWALDESROLBOXBADRAD};
//==output
//设置光标可见与否
void visible_cursor(int para){
HANDLE h=GetStdHandle(STD_OUTPUT_HANDLE);
CONSOLE_CURSOR_INFO CInfo;
GetConsoleCursorInfo(h&CInfo);
CInfo.bVisible=para;
SetConsoleCursorInfo(h&CInfo);
}
//设置控制台颜色
void color(int c){
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE)c);
}
//设置控制台光标位置,目的是根据wasd的操作,有选择地改变
//输出,而不是遍历输出
void setCP(int xint y){
COORD coord;
coord.X=2*y;
coord.Y=x;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE)coord);
}
//根据元素输出控制台字符
void itemout(enum item i){
switch(i){
case SPA:color(7);printf(“ “);break;
case WAL:color(8);printf(“■“);break;
case DES:color(14);printf(“○“);break;
case BOX:color(4);printf(“■“);break;
case BAD:color(4);printf(“●“);break;
case RAD:color(10);printf(“RR“);break;
case ROL:color(10);printf(“PP“);break;
}
}
//==output=end
//==control=to=mov
//根据人物的当前位置,输入的按键,计算出按键方向上,第n个元素的坐标
int getx(char chint a){
switch(ch){
case ‘w‘:return i-a;
case ‘s‘:return i+a;
case ‘a‘:
case ‘d‘:return i;
}
return 0;
}
int gety(char chint a){
switch(ch){
case ‘w‘:
case ‘s‘:return j;
case ‘a‘:return j-a;
case ‘d‘:return j+a;
}
return 0;
}
//如果输入一个wasd,判断可以移动,则用此函数改变全局变量ij
void chij(char ch){
if(ch==‘a‘)j-=1;
else if(ch==‘d‘)j+=1;
else if(ch==‘w‘)i-=1;
else i+=1;
}
//根据输入的wasd按键,判断是否可以移动,并且改变相应的地图元素
int change(enum item map[][10]char ch){
if(ch==‘r‘)return 1;//r键可以重置本关卡
else if(ch!=‘a‘&&ch!=‘d‘&&ch!=‘s‘&&ch!=‘w‘)return 0;
int x1=getx(ch1)x2=getx(ch2)y1=gety(ch1)y2=gety(ch2);//得到人物在按键方向前的第一个和第二个元素的坐标
enum item *this=&map[i][j]*next1=&map[x1][y1]*next2=&map[x2][y2];//用指针指向人物在按键方向前的第一个和第二个元素,以备使用和修改
if(*next1==SPA||*next1==DES){//人物的下一个位置是空或目标位置,可以移动
if(*next1==SPA)*next1=ROL;//修改地图元素
else *next1=RAD;
setCP(x1y1);itemout(*next1);//输出修改后的元素
if(*this==ROL)*this=SPA;//修改地图元素
else *this=DES;
setCP(ij);itemout(*this);//输出修改后的元素
chij(ch);//人物已经移动,遂修改ij
}
else if(*next1==BOX||*next1==BAD)//人物前方是箱子
if(*next2==SPA||*next2==DES){//箱子前方是空白
if(*next2==SPA)*next2=BOX;
else{*next2=BAD;n-=1;}
setCP(x2y2);itemout(*next2);
if(*next1==BAD){*next1=RAD;n+=1;}
- 上一篇:LVGL 英文参考手册
- 下一篇:银行家算法分配资源的模拟实现(main.cpp)
相关资源
- C语言程序设计50例.docx
- 烟花优化算法(c语言版)
- C语言程序设计教材习题参考答案.do
- 数据结构(C语言版)ppt课件,清华,
- c语言编程经典例题100例 word版
- C语言编译器的设计与实现.doc
- C语言基础教程.pdf56620
- C语言优先级
- funcode黄金矿工(C语言)
- 基于ege图形的推箱子游戏
- C语言ege贪吃蛇游戏
- 推箱子小游戏源码
- c语言dos窗口扫雷.c
- C语言简易三国杀
- 2048小游戏c语言实现
- 推箱子 c语言代码
- 职工工资管理系统含流程图
- 现代编译原理-C语言描述
- Linux操作系统下C语言编程从零开始
- ZZULIOJ部分答案C语言免费.7z
- json-c 一个用于c语言的json解析库很强
- C语言写的TS流打包
- TOA/AOA定位算法C语言代码
- C语言刷屏神器1.1窗口版
- C语言彻底理解指针和地址,彻底!
- 连连看源代码C语言版
- C语言深度解剖 第二版 陈正冲
- c语言 malloc函数详解
- C语言面向对象编程
- C语言unistd.h
评论
共有 条评论