📄 play.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 + -