收藏 分销(赏)

C语言编写的推箱子游戏.docx

上传人:二*** 文档编号:4540911 上传时间:2024-09-27 格式:DOCX 页数:19 大小:25.85KB 下载积分:5 金币
下载 相关 举报
C语言编写的推箱子游戏.docx_第1页
第1页 / 共19页
本文档共19页,全文阅读请下载到手机保存,查看更方便
资源描述
/* 一个C语言编写的推箱子游戏源代码7/*本游戏是字符模式的,请不要在中文dos下运行。本游戏在 TURBO C下调试通过*/include <dos.h> include <stdio.h>include <ctype.h> include <conio.h>include <bios.h> include <alloc.h>/*定义二维数组ghouse来记录屏幕上各点的状态, 其中:。表示什么都没有,'b'表示箱子,’w、表示墙壁,’m,表示目的地,T表示箱子 在目的地。*/char ghouse[20][20]; /*以下函数为直接写屏函数,很酷的函数哦!是我朋友告诉我的。*/char far *screen=(char far* )0xb8000000; void putchxy(int y,int x,char ch.char fc,char be){ screen[(x*160)+(y«1 )+0]=ch; screen[(x*160)+(y«1 )+1 ]=(bc*16)+fc;) /*定义判断是否胜利的数据结构7typedef struct winer { int x.y; struct winer *p;Jwiner; /*箱子位置的数据结构*/typedef struct boxs { int x,y; struct boxs *next;}boxs; /*在特定的坐标上画墙壁并用数组记录状态的函数7 default: break;) /*判断特定的坐标上的状态*/int judge(int x,int y) ( inti; switch(ghouse[x][y]) ( case 0: i=1;break; case 'w': i=0;break; case 'b': i=2;break; case T: i=4;break; case'm': i=3;break; default: break; )return i; )/*处理按下键盘后,人物移动的主函数*/ move(int x.int y,char a)( switch(a) (case 'u':if(!judge(x-1 ,y)) {gotoxy(y,x);break;} else ifQudge(x-1 ,y)==1||judge(x-1 ,y)==3) {if(judge(x,y)==3) {printwhither(x,y);printman(x-1 ,y);break;} else {printf(" ");printman(x-1 ,y);break;}) else ifQudge(x-1,y)==2){if(judge(x-2,y)==1) {movebox(xsy;u'); ifQudge(x,y)==3) printwhither(x,y); gotoxy(y,x-1);) else if(judge(x-2,y)==3) { moveboxin(x,y;u,); ifQudge(x,y)==3) printwhither(x,y); gotoxy(y,x-1);) else gotoxy(y,x);break; )else if(judge(x-1,y)==4) {if(judge(x-2,y)==1) {moveinbox(x,y,'u'); if(judge(x,y)==3) printwhither(x,y);gotoxy(y,x-1);) else if(judge(x-2,y)==3) { moveinboxinfx.y/u*); if(judge(x,y)==3) printwhither(x,y);gotoxy(y,x-1);) else gotoxy(y,x);break; ) case 'd':if(!judge(x+1 ,y)) {gotoxy(y,x);break;} else if(judge(x+1 ,y)==1 ||judge(x+1 ,y)==3){if(judge(x,y)==3) {printwhither(xsy);printman(x+1 ,y);break;} else{printf(H M);printman(x+1 ,y);break;} )else if(judge(x+1,y)==2) {if(judge(x+2,y)==1) {movebox(x,y;d'); ifQudge(x,y)==3) printwhither(x,y);gotoxy(y,x+1);) else if(judge(x+2,y)==3) {moveboxin(x,y,'d'); ifQudge(x,y)==3) printwhither(x,y);gotoxy(y,x+1);) else gotoxy(y,x);break; )else if(judge(x+1,y)==4) {if(judge(x+2,y)==1) {moveinbox(x,y;d'); if(judge(x,y)==3) printwhither(x,y);gotoxy(y,x+1);) else if(judge(x+2,y)==3) {moveinboxin(x,y;d'); ifQudge(x,y)==3) printwhither(x,y);gotoxy(y,x+1);) else gotoxy(y,x);break; ) case T:if(!judge(x,y-1)) {gotoxy(y,x);break;} else ifQudge(x,y-1)==1 ||judge(x,y-1)==3){if(judge(x,y)==3) {printwhither(x,y);printman(x,y-1);break;} else {printf(" ");printman(x,y-1 );break;} )else if(judge(x,y-1)==2) {if(judge(x,y-2)==1) {movebox(x,y,T); if(judge(x,y)==3) printwhither(x,y); gotoxy(y-1,x);) else if(judge(x,y-2)==3) {moveboxin(x,y,T); if(judge(x,y)==3) printwhither(x,y); gotoxy(y-1 ,x);) else gotoxy(y,x);break; )else if(judge(x,y-1)==4) {if(judge(x,y-2)==1) {moveinbox(x,y,T); if(judge(x,y)==3) printwhither(x,y); gotoxy(y-1,x);) else if(judge(x,y-2)==3) {moveinboxin(x,y,T); if(judge(x,y)==3) printwhither(x,y); gotoxy(y-1 ,x);) else gotoxy(y,x);break; ) case 'r':if(!judge(x,y+1)) {gotoxy(y,x);break;} else ifQudge(x,y+1 )==1 ||judge(x,y+1)==3){if(judge(x,y)==3) {printwhither(x,y);printman(x,y+1);break;} else{printf(" ");printman(x,y+1 );break;} )else if(judge(x,y+1)==2) {if(judge(x,y+2)==1) {movebox(x,y;r'); if(judge(x,y)==3) printwhither(x,y); gotoxy(y+1,x);) else if(judge(x,y+2)==3) {moveboxin(x,y,'r'); ifQudge(x,y)==3) printwhither(x,y); gotoxy(y+1 ,x);) else gotoxy(y,x);break; )else if(judge(x,y+1)==4) {if(judge(x,y+2)==1) {moveinbox(x5y,'r,); ifQudge(x,y)==3) printwhither(x,y); gotoxy(y+1,x);) else if(judge(x,y+2)==3) {moveinboxin(x,y,'r'); if(judge(x,y)==3) printwhither(x,y); gotoxy(y+1 ,x);) else gotoxy(y,x); break; ) default: break; }) r按下空格键后因到本关开头的函数*/ void reset(int i)( switch(i)( case 0: init(); inithouse1();break; case 1: init(); inithouse2();break;init(); inithouse3();break; case 2: init(); inithouse4();break; default:break; }) /*主函数main*/void main() ( int key,x,y,s,i=0; winer *win,*pw; _AL=3;_AH=0; geninterrupt(OxW); init(); win=inithouse1(); do{ AH=3; geninterrupt(OxlO); x=_DH+1 ;y=_DL+1; while(bioskey(1)==0); key=bioskey(0); switch(key) ( case 0x4800:move(x,y;u');break; /* 按下向上键后 7 case 0x5000:move(x,y;d');break; /* 按下向下健后 7 case 0x4b00:move(x,y,T);break; /* 按下向左键后 7 case 0x4d00:move(x,y,'r');break; /* 按下向右键后 7 case 0x3920:reset(i);break; /* 按下空格键后 */ default:break; ) s=0; pw=win; while(pw) ( if(ghouse[pw->x][pw->y]=='m') s++; pw=pw->p; ) if(s==O) ( free(win); gotoxy(25,2); printf("congratulate! you did a good job!"); getch();i++; switch(i) ( case 1: init(); win=inithouse2();break; case 2: init(); win=inithouse3();break; case 3: init(); win=inithouse4();break; case 4: gotoxy(15,21); printf("My dear Friend, How smart you are! Welcome to play again!"); key=0x011b;getch();break; default: break; ) } }while(key!=OxO11b); AL=3;_AH=O; geninterrupt(OxlO);) 附录资料:不需要的可以自行删除Abstract: Based on the comprehensive analysis on the plastic part's structure service requirement, mounding quality and mould menu factoring cost. A corresponding injection mould of internal side core pulling was designed. By adopting the multi-direction and multi-combination core-pulling. A corresponding injection mould of internal side core pulling was designed, the working process of the mould was introduced C语言详解一枚举类型注:以下全部代码的执行环境为VC++ 6.0 在程序中,可能需要为某些整数定义•个别名,我们可以利用预处理指令#dcfine来完成这 项工作,您的代码可能是: #define MON 1#defineTUE 2 #define WED 3#defineTHU 4 # define FRI 5dcfine SAT 6 # define SUN 7在此,我们定义一种新的数据类型,希望它能完成同样的工作。这种新的数据类型叫枚举型。 1 .定义一种新的数据类型-枚举型 以下代码定义了这种新的数据类型-枚举型enum DAY MON=1,TUE, WED, THU, FRI, SAT, SUN(i)枚举型是一个集合,集合中的元素(枚举成员)是一些命名的整型常量,元素之间用逗号, 隔开。 (2) DAY是一个标识符,可以看成这个集合的名字,是一个可选项,即是可有可无的项。 (3)第一个枚举成员的默认值为整型的0,后续枚举成员的值在前一个成员上加1。 (4)可以人为设定枚举成员的值,从而自定义某个范围内的整数。 (5)枚举型是预处理指令#dMne的替代。 (6)类型定义以分号;结束。 2 .使用枚举类型对变吊进行声明新的数据类型定义完成后,它就可以使用了。我们已经见过最基本的数据类型,如:整型int, 单精度浮点型float,双精度浮点型double,字符型char,短整型short等等。用这些基本数据 类型声明变量通常是这样: chara; 〃变量a的类型均为字符型charcharletter; int x,y, z; 〃变量x,y和z的类型均为整型intint number; double m, n;double result; 〃变量result的类型为双精度浮点型double 既然枚举也是一种数据类型,那么它和基本数据类型一样也可以对变量进行声明。 方法一:枚举类型的定义和变量的声明分开enuni DAY | MON=1,TUE, WED. THU, FRI, SAT, SUN}; enum DAY yesterday;enum DAY today; enum DAY tomorrow; 〃变量 tomorrow 的类型为枚举型 enum DAYenum DAY good_day, bad_day; //变量 good_day 和 bad_day 的类型均为枚举型 enuni DAY 方法二:类型定义与变量声明同时进行: enum//跟第一个定义不同的是,此处的标号DAY省略,这是允许的。 Saturday,sunday = 0, monday, tuesday, Wednesday, thursday, friday } workday; //变量workday的类型为枚举型cnum DAYenum week { Mon=l, Tue, Wed, Thu, Fri Sal, Sun} days; 〃变量 days 的类型为枚举型 enum week enum BOOLEAN { false, (rue } end_flag, maich_flag; 〃定义枚举类型并声明了两个枚举型变 量方法三:用typedef关键字将枚举类型定义成别名,并利用该别名进行变量声明: typedcf enum workday {Saturday, sunday = 0, monday, tuesday, Wednesday, thursday, friday } workday; 〃此处的workday为枚举型enum workday的别名workday loday, tomorrow; 〃变量 uxlay 和 tomorrow 的类型为枚举型 workday,也即 enum workday enum workday 中的 workday 可以省略: typedef enum (Saturday, sunday = 0, monday, tuesday, Wednesday, thursday, friday } workday; //此处的workday为枚举型enum workday的别名workday today, tomorrow; 〃变量 today 和 tomorrow 的类型为枚举型 workday,也即 enum workday 也可以用这种方式: (ypedef enum workdaySaturday, sunday = 0, monday, tuesday, Wednesday, thursday, friday );workday today, tomorrow; 〃变量 today 和 tomorrow 的类型为枚举型 workday,也即 enum workday 注意:同一个程序中不能定义同名的枚举类型,不同的枚举类型中也不能存在同名的命名常 量。错误例如如下所示: 错误声明一:存在同名的枚举类型typedef enum { Wednesday, thursday, friday } workday;typedef enum WEEK { Saturday, sunday = 0, monday, } workday;错误声明二:存在同名的枚举成员 typedef enum { Wednesday, thursday, friday } workday」;typedef enum WEEK { Wednesday, sunday = 0,void printwall(int x,int y) { putchxy(y-1 ,x-1,219,GREEN,BLACK); ghouse[x][y]='w,;) /*在特定的坐标上画箱子并用数组记录状态的函数7void printbox(int x,int y) ( putchxy(y-1 ,x-1,10, WHITE,BLACK); ghouse[x][y]='b,;) /*在特定的坐标上画目的地并用数组记录状态的函数*/void printwhither1(int x,int y,winer **win,winer **pw) ( winer *qw; putchxy(y-1 ,x-1 1YELLOW,BLACK); ghouse[x][y]='m'; if(*win==NULL) ( *win=*pw=qw=(winer* )malloc(sizeof(winer)); (*pw)->x=x;(*pw)->y=y;(*pw)->p=NULL;} else ( qw=(winer* )malloc(sizeof(winer)); qw->x=x;qw->y=y;(*pw)->p=qw;(*pw)=qw;qw->p=NULL; )) /*在特定的坐标上画目的地并用数组记录状态的函数*/void printwhither(int x,int y) ( putchxy(y-1 ,x-1 ;*1,YELLOW,BLACK); ghouse[x][y]='m'; monday, } vvorkday_2;.使用枚举类型的变量 2.1 对枚举型的变量赋值。 实例将枚举类型的赋值与基本数据类型的赋值进行了比照: 方法一:先声明变量,再对变量赋值#include<stdio.h> /*定义枚举类型*/enum DAY { MON= I, TUE, WED, THU, FRI, SAT, SUN ); void main(){ /*使用基本数据类型声明变量,然后对变量赋值*/ int x, y, z;x = 10; y = 20; z = 30; /*使用枚举类型声明变最,再对枚举型变量赋值*/ enum DAY yesterday, today, tomorrow; yesterday = MON; today = TUE; tomorrow = WED; printf("%d %d %d \n", yesterday, today, tomorrow);1 方法二:声明变量的同时赋初值#include <stdio.h> /*定义枚举类型*/enum DAY { MON=1,TUE, WED, THU, FRI, SAT, SUN }; void main() /*使用基本数据类型声明变量同时对变量赋初值*/ int x= 10, y=20, z=30; /*使用枚举类型声明变量同时对枚举型变量赋初值*/ enum DAY yesterday = MON, today = TUE, tomorrow = WED; printf("%d %d %d \n", yesterday, today, tomorrow);} 方法三:定义类型的同时声明变量,然后对变量赋值。 #include <stdio.h>/*定义枚举类型,同时声明该类型的三个变量,它们都为全局变晟*/ enum DAY { MON=I,TUE, WED, THU, FRI, SAT, SUN } yesterday, today, tomorrow;/*定义三个具有基本数据类型的变量,它们都为全局变量*/ int x, y, z;void main() ( /*对基本数据类型的变量赋值*/ x= 10; y = 20; z = 30; /*对枚举型的变量赋值*/ yesterday = MON; today = TUE; tomorrow = WED; printf("%d %d %d \n", x, y, z); 〃输出:10 20 30 printf("%d %d %d \n", yesterday, today, tomorrow); 〃输出:12 31 方法四:类型定义,变显声明,赋初值同时进行。 #include <stdio.h>/*定义枚举类型,同时声明该类型的三个变量,并赋初值。它们都为全局变量*/ enum DAY{ MON=h TUE, WED, THU, FRI, SAT, SUNyesterday = MON, today = TUE, tomorrow = WED; /*定义三个具有基本数据类型的变量,并赋初值。它们都为全局变量*/int x = 10, y = 20, z = 30; void niain(){ printf("%d %d %d \n", x, y, z); 〃输出:10 20 30 printf("%d %d %d \n", yesterday, today, tomorrow); 〃输出:1 2 31 3.2 对枚举型的变量赋整数值时,需要进行类型转换。 #include <stdio.h>enum DAY { MON=1, TUE, WED, THU, FRI, SAT. SUN }; void main()( enum DAY yesterday, today, tomorrow; yesterday = TUE; today = (enum DAY) (yesterday + 1); 〃类型转换 tomorrow = (enum DAY) 30; 〃类型转换 //tomorrow = 3; //错误 printf("%d %d %d \n", yesterday, today, tomorrow); 〃输出:2 3 30} 3.3 使用枚举型变量#includc<stdio.h> enum( BELL= '\a; BACKSPACE = '\b', HTAB= M', RETURN= *\r\ NEWLINE = 'n', VTAB=W, SPACE="enuni BOOLEAN { FALSE = 0. TRUE } match_flag; void main(){ int index = 0; int count_oflletter = 0; int count_oflspace = 0; char strU = "I'm Ely efod";match_flag = FALSE; for(; str[index] != '\0'; index++) if( SPACE != str[index]) count_oUetter++;else (match_flag = (enuni BOOLEAN) 1; count_oLspace++; }printf("%s %d times %c", match_flag ? "match" : "not match", count_of_space, NEWLINE); printf("count of letters: %d %c%c", count_oLlcttcr, NEWLINE, RETURN); 1输出: match 2 timescount of letters: 10 Press any key to continue.枚举类型与sizeof运算符 #includc <stdio.h>enuniescapes ( BELL= '\a', BACKSPACE = '\b', HTAB= '\t; RETURN = '\r; NEWLINE ='\n', VTAB= 'W, SPACE=',enuni BOOLEAN { FALSE = 0. TRUE } match_flag; void main(){ printf("%d bytes \n'\ sizeof(enum escapes)); //4 bytes printf("%d bytes \n", sizeof(escapcs)); //4 bytes printf("%d bytes \n", sizeof(enum BOOLEAN)); //4 bytes printf("%d bytes \n*\ sizeof(BOOLEAN)); //4 bytes printf("%d bytes \n", sizeof(match_flag)); //4 bytes prin(f("%d bytes \n", sizeof(SPACE)); //4 bytes printf("%d bytes \n", sizeof(NEWLINE)); //4 bytes printf("%d bytes \n", sizeof(FALSE)); //4 bytes printf("%d bytes \n", sizeof(0)); //4 bytes) 4 .综合举例#include<stdio.h> enum Season{ spring, summcr=100, fall=96, winter1; (ypedef enum{ Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday }Weekday; void main(){ /* Season */ printf("%d \n", spring); // 0 printf("%d, %c \n”, summer, summer); // 100, d prinif("%d \n'\ fall+winter); // 193 Season mySeason=wintcr; if(winter==my Season)printf("mySeason is winter \n"); // mySeason is winter int x=100; if(x==summer)printf("x is equal to summer\n"); // x is equal to summer printf("%d by(es\n'\ sizeof(spring)); // 4 bytes /* Weekday */ printf("sizcof Weekday is: %d \n", sizeof(Weekday)); //sizeof Weekday is: 4 Weekday today = Saturday; Weekday tomorrow; if(today == Monday)tomorrow = Tuesday; elsetomorrow = (Weekday) (today + 1); //remember to convert from int to Weekday 本文来自CSDN--xiaobai32966博客 )/*在特定的坐标上画人的函数7 void printman(int x,int y)( gotoxy(y,x); AL=02; CX=01; AH=0xa; geninterrupt(OxlO);) /*在特定的坐标上画箱子在目的地上并用数组记录状态的函数*/void printboxin(int x,int y) ( putchxy(y-1 ,x-1,10,YELLOW,BLACK); ghouse[x][y]='i';) /*初始化函数,初始化数组和屏幕7void init() ( int i,j; for(i=0;i<20;i++) for(j=0;j<20;j++) ghouse[i][j]=0; AL=3; AH=0; geninterrupt(OxlO); gotoxy(40,4); printf("Welcome to come box world!**); gotoxy(40,6);printf("Press up,down,left,right to play."); gotoxy(40,8);printf("Press Esc to quit it."); gotoxy(40,10); printf("Press space to reset the game."); gotoxy(40,12);printf("Producer: wangdehao."); gotoxy(40,14);printf("Mar. 30th 2003."); /*第一关的图象初始化7winer *inithouse1() ( int x,y; winer *win=NULL,*pw;for(x=1 ,y=5;y<=9;y++) printwall(x+4,y+10); for(y=5,x=2;x<=5;x++) printwall(x+4,y+10);for(y=9,x=2;x<=5;x++) printwall(x+4,y+10); for(y=1 ,x=3;x<=8;x++) printwall(x+4,y+10); for(x=3,y=3;x<=5;x++) printwall(x+4,y+10); for(x=5,y=8;x<=9;x++) printwall(x+4,y+10); for(x=7,y=4;x<=9;x++) printwall(x+4,y+10); for(x=9,y=5;y<=7;y++) printwall(x+4,y+10); for(x=8,y=2;y<=3;y++) printwall(x+4,y+10); printwall(5+4,4+10); printwall(5+4,7+10); printwall(3+4,2+10); printbox(3+4,6+10); printbox(3+4,7+10); printbox(4+4,7+10); printwhitherl (4+4,2+10,&win,&pw); printwhitherl (5+4,2+10,&win,&pw); printwhitherl (6+4,2+10,&win,&pw); printman(2+4,8+10);return win; /*第三关的图象初始化7winer *inithouse3() {int x,y; winer *win=NULL,*pw; for(x=1 ,y=2;y<=8;y++) printwall(x+4,y+10); for(x=2,y=2;x<=4;x++) printwall(x+4,y+10);for(x=4,y=1 ;y<=3;y++) printwall(x+4,y+10); for(x=5,y=1 ;x<=8;x++) printwall(x+4,y+10); for(x=8,y=2;y<=5;y++) printwall(x+4,y+10); for(x=5,y=5;x<=7;x++) printwall(x+4,y+10); for(x=7,y=6;y<=9;y++) printwall(x+4,y+10); for(x=3,y=9;x<=6;x++) printwall(x+4,y+10); for(x=3,y=6;y<=8;y++) printwall(x+4,y+10); printwall(2+4,8+10); printwall(5+4,7+10); printbox(6+4,3+10); printbox(4+4,4+10); printbox(5+4,6+10); printwhitherl (2+4,5+10,&win,&pw); printwhitherl (2+4,6+10,&win,&pw); printwhitherl (2+4,7+10,&win,&pw); printman(2+4,4+10);return win; )r第二关的图象初始化7 winer *inithouse2(){int x,y; winer *win=NULL,*pw; for(x=1 ,y=4;y<=7;y++) printwall(x+4,y+10); for(x=2,y=2;y<=4;y++) printwall(x+4,y+10); for(x=2,y=7;x<=4;x++) printwall(x+4,y+10); for(x=4,y=1 ;x<=8;x++) printwall(x+4,y+10); for(x=8,y=2;y<=8;y++) printwall(x+4,y+10); for(x=4,y=8;x<=8;x++) printwall(x+4,y+10); for(x=4,y=6;x<=5;x++) printwall(x+4,y+10); for(x=3,y=2;x<=4;x++) printwall(x+4,y+10); for(x=4,y=4;x<=5;x++) printwall(x+4,y+10); printwall(6+4,3+10); printbox(3+4,5+10); printbo
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 通信科技 > 开发语言

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2025 宁波自信网络信息技术有限公司  版权所有

客服电话:4009-655-100  投诉/维权电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服