资源描述
/* 一个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
展开阅读全文