?? 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 + -