⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 play.c

📁 这是我的课程设计 由于时间有限
💻 C
字号:
/*警告!本程序不可以在win2000和xp的CMD(命令提示符)中运行,否则,死机*/
/*建议在win98或纯DOS下中文UCDOS中运行*/
/*在不同的硬件环境下本程序的运行速度有所不同,请调节#define FDELAY 和#define SDELAY 来控制*/
#include<conio.h>
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#define ESC 1
#define LEFT 75
#define RIGHT 77
#define TOP 72
#define DOWN 80
#define FDELAY 300 /*控制游戏速度参数,其值可控制游戏速度,如果在学校机房,建议将之设为400*/
#define SDELAY 50 /*控制游戏速度参数,如果在学校机房,建议之设为150*/
#define UFO_MAX 20 /*UFO开始时的个数*/
#define P_LVN 3 /*定义游戏者生命指数,当被击中一次,其值减1,当其为0时,表示游戏者输*/
#define U_LVN 3 /*定义UFO生命指数,当被击中一次,其值减1,当其为0时,表示游戏者胜*/
typedef struct{
	int x;
	int y;
}pos;    /*定义坐标类型*/
typedef struct{
	pos Mp;  /*自己的位置*/
	int isshoot; /*是否已发子弹*/
	int islive; /*是否存活*/
	int lvN; /*生命指数,被击中时。会自减1,当其值为0时,表示已经死亡*/
	char uShape;
}objply;
typedef struct{
	pos Mp;  /*自己的位置*/
	int isshoot; /*是否已发子弹*/
	int islive; /*是否存活*/
	int lvN; /*生命指数,被击中时。会自减1,当其值为0时,表示已经死亡*/
	char uShape;
}objufo;

/*----定义外部变量开始----*/
	int ch;
	pos Sp,Su[UFO_MAX]; /*游戏者,UFO的子弹的位置*/
	int ufoN=0; /*被打中UFO的个数*/
	objply ply; /*游戏者实例*/
	objufo ufo[UFO_MAX]; /*UFO实例*/
	char pShape=12; /*游戏者形状*/
	char pShot=6;	/*游戏者子弹形状*/
	char uShape=2;/*UFO形状*/
	char uShot='*';	/*UFO子弹形状*/
	int flag; /*检查游戏者是否移到了左尽头*/
	int rdmc; /*随机整数*/
	int s=0;
	int i;
	int winners=0; /*如果其值为1则游戏者胜,为2则ufo胜*/
	int isag=1;/*是否继续游戏*/
	int firex=2,firey=2;/*UFO运动方向,视其正负性而定*/
	int direx=1;
	int PlvN,mym;
/*----定义外部变量结束----*/
void init(){
	clrscr();
	gotoxy(1,24);for(mym=0;mym<80;mym++)cprintf("_");
	ufoN=0;
	for(;abs(firex)!=1;) firex=random(2)-random(2);
	for(;abs(firey)!=1;) firey=random(2)-random(2);
	winners=0;
	ply.Mp.x=39;
	ply.Mp.y=25;
	gotoxy(39,25);
	printf("%c",pShape);
	ply.isshoot=0;
	PlvN=P_LVN;
	ply.islive=1;
	for(i=0;i<UFO_MAX;i++){
		int tem;
		ufo[i].lvN=random(U_LVN);
		if(ufo[i].lvN==0) ufo[i].lvN=3;
		if(ufo[i].lvN==3) ufo[i].uShape=2;
		if(ufo[i].lvN==2) ufo[i].uShape=1;
		if(ufo[i].lvN==1) ufo[i].uShape=3;
		tem=random(72);
		ufo[i].Mp.x=tem+2;
		ufo[i].Mp.y=random(10)+3;
		gotoxy(ufo[i].Mp.x,ufo[i].Mp.y);
		printf("%c",ufo[i].uShape);
		ufo[i].isshoot=0;
		ufo[i].islive=1;
	}
}
char buf[10];
movel(){
	if(ply.Mp.x<=3){
		 flag=1;
		 return 0;
	}
	gotoxy(ply.Mp.x,ply.Mp.y);
	printf(" ");
	gotoxy(ply.Mp.x-1,ply.Mp.y);
	printf("%c",pShape);
	ply.Mp.x=ply.Mp.x-1;
		return 0;
}
mover(){
	if(ply.Mp.x>=75){
		 return 0;
	}
	gotoxy(ply.Mp.x,ply.Mp.y);
	printf(" ");
	gotoxy(ply.Mp.x+1,ply.Mp.y);
	printf("%c",pShape);
	gotoxy(ply.Mp.x-1,ply.Mp.y);
	ply.Mp.x=ply.Mp.x+1;
	return 0;
}
movet(){
	if(ply.Mp.y<=10){
		 return 0;
	}
	
	gotoxy(ply.Mp.x,ply.Mp.y);
	printf(" ");
	gotoxy(ply.Mp.x,ply.Mp.y-1);
	printf("%c",pShape);
	gotoxy(ply.Mp.x-1,ply.Mp.y);
	ply.Mp.y=ply.Mp.y-1;
	return 0;
}
moved(){
	if(ply.Mp.y>=25){
		 return 0;
	}
	gotoxy(ply.Mp.x,ply.Mp.y);
	printf(" ");
	gotoxy(ply.Mp.x,ply.Mp.y+1);
	printf("%c",pShape);
	gotoxy(ply.Mp.x-1,ply.Mp.y);
	ply.Mp.y=ply.Mp.y+1;
	return 0;
}
main(){
	int j,k;
	int tm=1;
for(;isag&&tm<20;){
	init();
	textbackground(1);
	textcolor(14);
	for(;;){
/*----------第一层外循环开始----------*/
	if(s%10==0)clrscr();
	gotoxy(1,24);for(mym=0;mym<80;mym++)cprintf("_");
	if(ply.Mp.y==25){
		gotoxy(55,25);
		cprintf("此为安全区(你不能发弹)!");
	}
	gotoxy(30,1);
	printf("陈欢课程设计--UFO游戏\n");
	printf("    *击中UFO[%d]个",ufoN);
	printf("    *获胜须打中[%d]个UFO",20-ufoN);
	printf("    *最下面为安全区  live:");
	for(k=0;k<PlvN;k++) printf("%c ",pShape);

	gotoxy(ply.Mp.x,ply.Mp.y);
	printf("%c",pShape);
	gotoxy(39,1);
	if(bioskey(1)){
		ch=bioskey(0)>>8;
		if(ch==LEFT){
			movel();
		}
		else if(ch==RIGHT){
			mover();
		}
		else if(ch==TOP){
			movet();
		}
		else if(ch==DOWN){
			moved();
		}
		else if(ch==ESC){
			clrscr();
			printf("\n\n        (Game over)游戏结束!");
			exit(0);
		}
		else if(ch==57){
			if(ply.isshoot==0&&ply.Mp.y!=25){
				Sp.x=ply.Mp.x;
				Sp.y=ply.Mp.y;
				gotoxy(Sp.x,Sp.y);
				printf("%c",pShot);
				ply.isshoot=1;
			}
		}
	}
/*----处理UFO随机运动开始------*/
	for(i=0;i<UFO_MAX;i++){
			delay(FDELAY);/*调节UFO运行具体速度,可以在上面的#define中改变其值以调节速度*/
			if(ufo[i].islive==0) continue;
			if(ufo[i].Mp.x>75){
				firex=-1;
			}
			if(ufo[i].Mp.x<5){
				firex=1;
			}
			if(ufo[i].Mp.y>10){
				firey=-1;
			}
			if(ufo[i].Mp.y<3){
				firey=3;
			}
			if(s%9==0){
				gotoxy(ufo[i].Mp.x,ufo[i].Mp.y);
				printf(" ");
				ufo[i].Mp.x=ufo[i].Mp.x+random(2)*firex;
				ufo[i].Mp.y=ufo[i].Mp.y+random(2)*firey;
		   	}

			gotoxy(ufo[i].Mp.x,ufo[i].Mp.y);
			printf("%c",ufo[i].uShape);
			gotoxy(39,1);
			if(ufo[i].isshoot==0&&s%3==0){
				Su[i].x=ufo[i].Mp.x;
				Su[i].y=ufo[i].Mp.y;
				gotoxy(Su[i].x,Su[i].y);
				printf("%c",uShot);
				gotoxy(39,1);
				ufo[i].isshoot=1;
			}
	}
/*----处理UFO随机运动结束------*/

/*----处理子弹运动开始------*/
	for(i=0;i<UFO_MAX;i++){

		delay(SDELAY);
		if(ufo[i].isshoot==1){
			if(s%9==0){
				gotoxy(Su[i].x,Su[i].y);
				printf(" ");
				Su[i].y=Su[i].y+1;
			}
			if(s%5==0){
				direx=random(2)-random(2);
				gotoxy(Su[i].x,Su[i].y);
				printf(" ");
				Su[i].x=Su[i].x+direx;
				gotoxy(Su[i].x,Su[i].y);
				printf("%c",uShot);
			}
		}
		if(Su[i].y==24){
			ufo[i].isshoot=0;
			gotoxy(Su[i].x,Su[i].y);
			printf(" ");
		}
	}

		if(ply.isshoot==1){
			gotoxy(Sp.x,Sp.y);
			printf(" ");
			Sp.y=Sp.y-2;
			gotoxy(Sp.x,Sp.y);
			printf("%c",pShot);

		}
		if(Sp.y<=2){
			ply.isshoot=0;
			gotoxy(Sp.x,Sp.y);
			printf(" ");
		}

/*----处理子弹运动结束------*/
/*----处理人与UFO大战开始------*/
	for(i=0;i<UFO_MAX;i++){
		if(ufo[i].isshoot==1){
			if(abs(ply.Mp.x-Su[i].x)<2&&abs(ply.Mp.y-Su[i].y)<2){
				PlvN--;
				if(PlvN==0){ winners=2;break;}
				
				gotoxy(29,10);
				cprintf("你被击中啦,怎么这么不小心呢。");
				gotoxy(25,11);
				cprintf("你还有[%d]次机会,还有[%d]个ufo加油啊!",PlvN,20-ufoN);
				gotoxy(35,14);
				cprintf("按[Y]继续");
				for(;;){
					if(bioskey(1)){
						if((bioskey(0)>>8)==21) break;
						

					}
				}
				gotoxy(39,25);
				if(PlvN!=0){
				ply.Mp.x=39;
				ply.Mp.y=25;
				printf("%c",pShape);
				}
			}
		}
		if(abs(ufo[i].Mp.x-Sp.x)<2&&abs(ufo[i].Mp.y-Sp.y)<2){
			ufo[i].lvN--;
			Sp.y=0;
			if(ufo[i].lvN==2) ufo[i].uShape=1;
			if(ufo[i].lvN==1) ufo[i].uShape=3;
			if(ufo[i].lvN==0) {
				ufo[i].islive=0;
				ufo[i].Mp.x=88;
				ufo[i].Mp.y=88;
				ufoN++;
			}
		}
	}
	if(ufoN==20){
		winners=1;
	}
/*----处理人与UFO大战结束------*/
	s++;
	if(s>5000){
		s=1;
	}
	if(winners==1||winners==2) break;
/*---------第一层外循环结束----------*/
	}
	if(winners==1){
		gotoxy(ply.Mp.x+1,ply.Mp.y);
		printf("%c",pShape);
		gotoxy(ply.Mp.x-1,ply.Mp.y);
		printf("%c",pShape);
		gotoxy(ply.Mp.x,ply.Mp.y-1);
		printf("%c",pShape);
		gotoxy(ply.Mp.x,ply.Mp.y+1);
		printf("%c",pShape);
		gotoxy(ply.Mp.x,ply.Mp.y);
		printf("%c",uShape);
		gotoxy(ply.Mp.x+3,ply.Mp.y);
		printf("good,you win!");
		gotoxy(ply.Mp.x+3,ply.Mp.y+1);
		printf("start over?Y/N[ ]\b\b");


	}
	if(winners==2){
		gotoxy(ply.Mp.x+1,ply.Mp.y);
		printf("%c",2);
		gotoxy(ply.Mp.x-1,ply.Mp.y);
		printf("%c",2);
		gotoxy(ply.Mp.x,ply.Mp.y-1);
		printf("%c",2);
		gotoxy(ply.Mp.x,ply.Mp.y+1);
		printf("%c",2);
		gotoxy(ply.Mp.x+3,ply.Mp.y);
		printf("You died here! you lose!");
		gotoxy(ply.Mp.x+3,ply.Mp.y+1);
		printf("start again(Y/N)?[ ]\b\b");



	}
	for(;;){
	if(bioskey(1)){
		ch=bioskey(0)>>8;
		if(ch==21) {isag=1;break;}
		if(ch==49) {isag=0;break;}

	}

	}
	tm++;
}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -