推箱子游戏-C语言
更新时间:2023-12-21 21:15:01 阅读量: 教育文库 文档下载
/*在这个程序里'm'表示目的地,'w'表示墙,'b'表示箱子,0表示空地,i表示在目的地的箱子,因为在目的地的箱子颜色与不是的是不一样的*/ #include
#include
struct clock {
int hours; int minutes; int seconds; };
char status[20][20];/*定义二维数组status来记录屏幕上各点的状态,*/
char far *printScreen=(char far* )0xB8000000; /*定义了一个远指针,它指向计算机彩色显示器的视频缓冲区地址,用于在屏幕上输出字符,彩色显示器的字符缓冲区首地址为0xB8000000*/
void showtime(); void display(); void update();
void putoutChar(int y,int x,char ch,char fc,char bc); void drawWall(int x,int y); void drawBox(int x,int y);
void drawDestination(int x,int y); void drawMan(int x,int y); void drawBoxDes(int x,int y); void init();
void playgame();
void moveBoxSpacetoSpace(int x,int y,char a);/*人空地移动箱子到空地*/ void moveBoxDestoSpace(int x,int y,char a);/*从目的地移动箱子到空地*/ void moveBoxSpacetoDes(int x,int y,char a);/*从空地移动箱子到目的地*/ void moveBoxDestoDes(int x,int y,char a);/*从目的地移动箱子到目的地*/ void move(int x,int y,char a); /*人移动*/
void main() {
int key;/*记录按下的键*/ int x,y; showtime(); init();
playgame(); do
{
_AH=3; /*设置AH,读取光标位置*/ geninterrupt(0x10);
x=_DH+1; /*读取光标所在的行,加1*/ y=_DL+1; /*读取光标所在的列,加1*/
while(bioskey(1)==0);/*直接使用BIOS服务的键盘接口在头文件bios.h中*/ key=bioskey(0);/*等待键盘输入;bioskey(0)表示按下的键值*/ switch(key) {
case 0x4800: /*如果按下向上键*/ move(x,y,'u'); break;
case 0x5000: /*如果按下向下键*/ move(x,y,'d'); break;
case 0x4b00: /*如果按下向左键*/ move(x,y,'l'); break; case 0x4d00:
move(x,y,'r');/*如果按下向右键*/ break; default: break; }
if(status[6][12]=='i'&&status[6][13]=='i'&&status[6][14]=='i') /*如果所有的目的地的'm',都变为'i'时,说明已经赢了*/ {
gotoxy(15,20);
printf(\ gotoxy(15,22);
printf(\ getch(); /*按任意键结束*/ break; }
}while(key!=0x011b); display();
key=bioskey(0);/*接收按键*/
if(key==0x011b)/*按ESC键退出*/ return; }
void showtime() {
int key; while(1)
{
while(!kbhit()) {
update(); display(); sleep(1); if(kbhit()) break; }
key=bioskey(0); if(key==0x011b) break; }
return; }
void display() {
time_t nowtime; struct tm *timeinfo;
time( &nowtime ); /*获取时间,以秒计从1970年1月一日起算,存于nowtime*/ timeinfo = localtime( &nowtime ); /*转为当地时间,tm时间结构asctime() 转为标准ASCII时间格式*/
printf(\ return; }
void update() {
struct clock times; times.seconds=0;
if(times.seconds==60)/*秒针达到60秒时*/ {
times.seconds=0; /*秒针重设为0*/ times.minutes++; /*把分针自加*/ }
if(times.minutes==60)/*分针到达60时*/ {
times.minutes=0;/*分针重设为0*/ times.hours++; /*把时钟自加*/ }
if(times.hours==24) /*当时钟达到24时*/ {
times.hours=0; /*把时钟重设为0*/ }
times.seconds++;
return; }
void putoutChar(int y,int x,char ch,char fc,char bc) /*一个字符在视频缓冲区里占两个字节,屏幕上文本显示格式一行80个字符,所以*160时字符变动一行,视频缓冲区里位置变动160个字节,第一个字节,存的是显示字符的ASCII码 ch 第二个字节 高四位 存的是 显示字符的背景色 bc,低四位存的是 字符的颜色 fh */ {
printScreen[(x*160)+(y<<1)+0]=ch;
printScreen[(x*160)+(y<<1)+1]=(bc*16)+fc; return; }
void drawWall(int x,int y) /*这个function用来画墙*/ {
putoutChar(y-1,x-1,219,GREEN,BLACK); /*用小方块表示墙(ASCII值为219),墙的颜色为绿色,以黑色为背景*/
status[x][y]='w'; /*把这位置设为w*/ return; }
void drawBox(int x,int y) /*这个function是在非目的地画箱子*/ {
putoutChar(y-1,x-1,10,WHITE,BLACK);/*用ASCII值为10的字符表示箱子*/ status[x][y]='b'; /*这位置设为b*/ return; }
void drawDestination(int x,int y) /*用于画目的地*/ {
putoutChar(y-1,x-1,003,YELLOW,BLACK); /*以黑色为背景画黄色目的地,用心型表示(ASCII值为003)*/ status[x][y]='m'; return; }
void drawMan(int x,int y)/*画人*/ {
gotoxy(y,x);
_AL=02; /*设置寄存器低位02(ASCII值),表示输出的字符*/
_CX=01; /*设置寄存器CX为01,表示重复输出的次数,这里只输出一次*/
_AH=0xa; /*,设置寄存器高位0xa表示在光标位置显示字符*/ geninterrupt(0x10); /*产生类型为0x10的中断,表示显示器输出*/ return; }
void drawBoxDes(int x,int y)/*在目的地画箱子*/ {
putoutChar(y-1,x-1,10,YELLOW,BLACK);/*以黑色为背景画黄色箱子,仍用ASCII值为
10的字符表示箱子*/ status[x][y]='i'; return; }
void init() /*初始化屏幕*/ {
int i,j;
for(i=0;i<20;i++) for(j=0;j<20;j++)
status[i][j]=0; /*首先将屏幕20*20范围内的状态初始化为0,然后根据具体情况,在画箱子时,将箱子所在点的状态改为\ gotoxy(41,4);
printf(\
gotoxy(41,6); /*移动光标到指定位置输出屏幕信息*/
printf(\ \ /*也就是说在第41行,第6列的地方输出*/
gotoxy(41,8);
printf(\ \ /*同理*/ gotoxy(41,10);
printf(\ \ gotoxy(41,12);
printf(\ gotoxy(40,16);
printf(\ gotoxy(40,18);
printf(\ return; }
void playgame() {
int x,y;
for(x=1,y=1;x<=14;x++) drawWall(x+4,y+10); for(x=1,y=9;x<=14;x++) drawWall(x+4,y+10); for(y=2,x=1;y<=8;y++) drawWall(x+4,y+10); for(y=2,x=14;y<=8;y++) drawWall(x+4,y+10); for(x=3,y=2;y<=6;y++) drawWall(x+4,y+10); for(x=6,y=4;x<=13;x++) drawWall(x+4,y+10);
for(x=6,y=6;y<=8;y++) drawWall(x+4,y+10); drawWall(10,12); drawBox(10,13); drawBox(12,16); drawBox(14,17);
drawDestination(6,12); drawDestination(6,13); drawDestination(6,14); drawMan(7,18); return; }
void moveBoxSpacetoSpace(int x,int y,char a)/*人空地移动箱子到空地*/ {
switch(a) {
case 'u': /*'u'表示up,如果按向上键*/ status[x-1][y]=0;/*重设((x-1),y)位置的状态为0*/ printf(\ /*清空(x,y)处原有的小人*/ drawBox(x-2,y); /*在((x-2),y)处重新画箱子*/ drawMan(x-1,y); /*在((x-1),y)处重新画小人*/ status[x-2][y]='b'; /*重设((x-2),y)位置的状态为箱子*/ break;
case 'd': /*'d'表示down,如果按向下键*/ status[x+1][y]=0;
printf(\ /*同上*/ drawBox(x+2,y); drawMan(x+1,y); status[x+2][y]='b'; break;
case 'l': /*left,向左键*/ status[x][y-1]=0; printf(\ drawBox(x,y-2); drawMan(x,y-1); status[x][y-2]='b'; break;
case 'r': /*right,向右键*/ status[x][y+1]=0; printf(\
drawBox(x,y+2); drawMan(x,y+1); status[x][y+2]='b'; break;
default: break; }
return; }
void moveBoxDestoSpace(int x,int y,char a) /*从目的地移动箱子到空地*/ {
switch(a) {
case 'u':
status[x-1][y]='m'; /*重设((x-1),y)位置的状态为'm'*/ printf(\ drawBox(x-2,y);
drawMan(x-1,y); /*同上个function*/ status[x-2][y]='b'; break; case 'd':
status[x+1][y]='m'; printf(\
drawBox(x+2,y); drawMan(x+1,y); status[x+2][y]='b'; break; case 'l':
status[x][y-1]='m'; printf(\ drawBox(x,y-2); drawMan(x,y-1); status[x][y-2]='b'; break; case 'r':
status[x][y+1]='m'; printf(\
drawBox(x,y+2); drawMan(x,y+1); status[x][y+2]='b'; break; default: break; }
return; }
void moveBoxSpacetoDes(int x,int y,char a)/*从空地移动箱子到目的地*/ {
switch(a) {
case 'u':
status[x-1][y]=0; printf(\
drawBoxDes(x-2,y); drawMan(x-1,y); status[x-2][y]='i'; break; case 'd':
status[x+1][y]=0; printf(\
drawBoxDes(x+2,y); drawMan(x+1,y); status[x+2][y]='i'; break; case 'l':
status[x][y-1]=0; printf(\
drawBoxDes(x,y-2); drawMan(x,y-1); status[x][y-2]='i'; break; case 'r':
status[x][y+1]=0; printf(\
drawBoxDes(x,y+2); drawMan(x,y+1); status[x][y+2]='i'; break; default: break; }
return; }
void moveBoxDestoDes(int x,int y,char a) /*从目的地移动箱子到目的地*/ {
switch(a) {
case 'u':
status[x-1][y]='m'; printf(\
drawBoxDes(x-2,y); drawMan(x-1,y);
status[x-2][y]='i'; break; case 'd':
status[x+1][y]='m'; printf(\
drawBoxDes(x+2,y); drawMan(x+1,y); status[x+2][y]='i'; break; case 'l':
status[x][y-1]='m'; printf(\
drawBoxDes(x,y-2); drawMan(x,y-1); status[x][y-2]='i'; break; case 'r':
status[x][y+1]='m'; printf(\
drawBoxDes(x,y+2); drawMan(x,y+1); status[x][y+2]='i'; break; default: break; }
return; }
void move(int x,int y,char a) /*人移动*/ {
switch(a) {
case 'u': /*如果按向上键*/
if(status[x-1][y]=='w') /*如果(x-1,y)即小人的下一步状态为墙*/ {
gotoxy(y,x); /*则跳转到(y,x),并跳出循环*/ break; }
else if(status[x-1][y]==0||status[x-1][y]=='m')/*如果小人的下一步状态为什么都没有或者是目的地*/ {
if(status[x][y]=='m') /*如果当前状态为目的地*/ {
drawDestination(x,y);/*画目的地*/
drawMan(x-1,y); /*在新位置重新画小人*/ break; }
else /*如果当前状态为0*/ {
printf(\输出空字符,覆盖当前状态的小人*/ drawMan(x-1,y);/*在下一步重新画小人*/ break; } }
else if(status[x-1][y]=='b') /*如果下一步状态是箱子*/ {
if(status[x-2][y]==0) /*如果下下一步为空*/ {
moveBoxSpacetoSpace(x,y,'u');/*则将箱子从空地向上移动到空地*/ if(status[x][y]=='m') /*如果当前状态为目的地*/ drawDestination(x,y); /*画目的地*/ gotoxy(y,x-1); }
else if(status[x-2][y]=='m') /*如果下下一步为目的地*/ {
moveBoxSpacetoDes(x,y,'u'); /*则将箱子从空地向上移动到目的地*/ if(status[x][y]=='m')
drawDestination(x,y); gotoxy(y,x-1); } else
gotoxy(y,x); /*以下都同上的方法*/ break; }
else if(status[x-1][y]=='i') {
if(status[x-2][y]==0) {
moveBoxDestoSpace(x,y,'u'); if(status[x][y]=='m')
drawDestination(x,y); gotoxy(y,x-1); }
else if(status[x-2][y]=='m') {
moveBoxDestoDes(x,y,'u'); if(status[x][y]=='m')
drawDestination(x,y);
gotoxy(y,x-1); } else
gotoxy(y,x); break; } case 'd':
if(status[x+1][y]=='w') {
gotoxy(y,x); break; }
else if(status[x+1][y]==0||status[x+1][y]=='m') {
if(status[x][y]=='m') {
drawDestination(x,y); drawMan(x+1,y); break; } else {
printf(\
drawMan(x+1,y); break; } }
else if(status[x+1][y]=='b') {
if(status[x+2][y]==0) {
moveBoxSpacetoSpace(x,y,'d'); if(status[x][y]==3)
drawDestination(x,y); gotoxy(y,x+1); }
else if(status[x+2][y]=='m') {
moveBoxSpacetoDes(x,y,'d'); if(status[x][y]=='m') drawDestination(x,y); gotoxy(y,x+1); } else
gotoxy(y,x); break; }
else if(status[x+1][y]=='i') {
if(status[x+2][y]==0) {
moveBoxDestoSpace(x,y,'d'); if(status[x][y]=='m')
drawDestination(x,y); gotoxy(y,x+1); }
else if(status[x+2][y]=='m') {
moveBoxDestoDes(x,y,'d'); if(status[x][y]=='m') drawDestination(x,y); gotoxy(y,x+1); } else
gotoxy(y,x); break; } case 'l':
if(status[x][y-1]=='w') {
gotoxy(y,x); break; }
else if(status[x][y-1]==0||status[x][y-1]=='m') {
if(status[x][y]=='m') {
drawDestination(x,y); drawMan(x,y-1); break; } else {
printf(\
drawMan(x,y-1); break; } }
else if(status[x][y-1]=='b') {
if(status[x][y-2]==0) {
moveBoxSpacetoSpace(x,y,'l'); if(status[x][y]=='m')
drawDestination(x,y); gotoxy(y-1,x); }
else if(status[x][y-2]=='m') {
moveBoxSpacetoDes(x,y,'l'); if(status[x][y]=='m') drawDestination(x,y); gotoxy(y-1,x); } else
gotoxy(y,x); break; }
else if(status[x][y-1]=='i') {
if(status[x][y-2]==0) {
moveBoxDestoSpace(x,y,'l'); if(status[x][y]=='m')
drawDestination(x,y); gotoxy(y-1,x); }
else if(status[x][y-2]=='m') {
moveBoxDestoDes(x,y,'l'); if(status[x][y]=='m')
drawDestination(x,y); gotoxy(y-1,x); } else
gotoxy(y,x); break; } case 'r':
if(status[x][y+1]=='w') {
gotoxy(y,x);
break; }
else if(status[x][y+1]==0||status[x][y+1]=='m') {
if(status[x][y]=='m') {
drawDestination(x,y); drawMan(x,y+1); break; } else {
printf(\
drawMan(x,y+1); break; } }
else if(status[x][y+1]=='b') {
if(status[x][y+2]==0) {
moveBoxSpacetoSpace(x,y,'r'); if(status[x][y]=='m')
drawDestination(x,y); gotoxy(y+1,x); }
else if(status[x][y+2]=='m') {
moveBoxSpacetoDes(x,y,'r'); if(status[x][y]=='m')
drawDestination(x,y); gotoxy(y+1,x); } else
gotoxy(y,x); break; }
else if(status[x][y+1]=='i') {
if(status[x][y+2]==0 ) {
moveBoxDestoSpace(x,y,'r'); if(status[x][y]=='m')
drawDestination(x,y);
gotoxy(y+1,x); }
else if(status[x][y+2]=='m') {
moveBoxDestoDes(x,y,'r'); if(status[x][y]=='m')
drawDestination(x,y); gotoxy(y+1,x); } else
gotoxy(y,x); break; } default: break; } return; }
正在阅读:
推箱子游戏-C语言12-21
趣味乒乓球作文800字06-30
复数与复变函数题库12-09
净月潭游记作文600字07-11
教案235 植物的一生105-18
《金工实习》第6章 切削加工的基本知识05-21
高性能计算中心高性能计算中心项目详细设计方案 - 图文12-09
信息采集系统标准电子版照片PS制作教程04-13
陕西省西安市2011届高三五大名校第一次模拟考试(数学理)12-23
中专校 高一第二学期期末数学试卷01-28
- exercise2
- 铅锌矿详查地质设计 - 图文
- 厨余垃圾、餐厨垃圾堆肥系统设计方案
- 陈明珠开题报告
- 化工原理精选例题
- 政府形象宣传册营销案例
- 小学一至三年级语文阅读专项练习题
- 2014.民诉 期末考试 复习题
- 巅峰智业 - 做好顶层设计对建设城市的重要意义
- (三起)冀教版三年级英语上册Unit4 Lesson24练习题及答案
- 2017年实心轮胎现状及发展趋势分析(目录)
- 基于GIS的农用地定级技术研究定稿
- 2017-2022年中国医疗保健市场调查与市场前景预测报告(目录) - 图文
- 作业
- OFDM技术仿真(MATLAB代码) - 图文
- Android工程师笔试题及答案
- 生命密码联合密码
- 空间地上权若干法律问题探究
- 江苏学业水平测试《机械基础》模拟试题
- 选课走班实施方案
- 推箱子
- 语言
- 游戏
- C语言试题六套
- 通信原理复习指南(重庆理工大学) - 图文
- 世之君子志在天下
- 商务谈判中的语言艺术
- 会计实操经验增值税税控系统技术维护费用抵减税额如何会计处理
- 貔貅认主方法
- 推荐-浙江省宁波市2018-2018学年第二学期期初八校联考高三数学试题理科 精品
- 妊娠各期保健要点
- 二年级简单推理
- 2018版高考语文(江苏专用)小说阅读 小说探究题 含解析
- 中班数学活动《我会整理》教学反思
- 安全生产及文明施工方案 - 图文
- 组工业务300题6.29
- 实验小学举行“我看‘追星’”主题班队会
- 2018年煤制天然气行业现状及发展趋势分析(目录)
- 云南省5州市边境游异地办证12月16日正式启动
- 一事一议管理制度
- 新视野 大学英语 二 试卷
- 流速流量管径之间的关系
- 四川省成都市2016年中考生物真题试题Word版含答案 - 图文