嗨嗨嗨,又是我!
我又来发博客啦!
最近太闲了,又做了个small游戏:小人-格斗(测试版)
记得加上gamesio.h哦
#include
#include
#include"gamesio.h"
//宏定义一些常量(可更改)
#define BULLETNUM 300//子弹最大数量
#define RUN 1//人物行走速度
#define BULLET_ 5//子弹射击间隔
#define BULLETRUN 2//子弹速度
#define BIGBULLET_TIME 2//手抛式原子弹移动间隔
#define JUMPHIGHT 6//跳跃高度
using namespace std;
using namespace gio;
//结构体
struct bullet{int x;int y;char l; char f;int z;};
struct player{int hp;int s1;int s2;int x;int y;bool jump;int ifjump;char f;
float s1_wait;float s2_wait;bool s1_ok;bool s2_ok;bool ifdown;bool ifinvin;
bool canwalk;float walk_wait;int dwontime;int invintime;bool revert;float reverttime;
bool poison;float poisontime;int energy;};
//函数
char map[22][73],OLDMAP[22][73];
void draw_map_delta(char a[22][73] ){
for(int i=0;i<22;i++){
if (strcmp(a[i],OLDMAP[i])!=0){
go(0,i);
printf("%s",a[i]);
}
}
for(int i=0;i<22;i++){for(int j=0;j<73;j++){OLDMAP[i][j]=a[i][j];}}
}
void clear_map(char map[22][73]){
for(int i=0;i<22;i++){for(int j=0;j<72;j++){map[i][j]=' ';}map[i][72]=0;}
}
void add_line(char map[22][73]){
for(int i=0;i<72;i++){map[20][i]='-';}
}
void add_wall(char map[22][73]){
for(int i=0;i<72;i++){map[21][i]='#';map[0][i]='#';}
for(int i=0;i<21;i++){map[i][0]='#';map[i][71]='#';}
}
player p2;
player p1;
bullet p1_b[BULLETNUM];
bullet p2_b[BULLETNUM];
void p1_s(int l_,float*w,float wait){
int p1_ii=-1;
for(int i=0;i=0){
p1_b[p1_ii].l=l_;
p1_b[p1_ii].z=1;
p1_b[p1_ii].y=p1.y;
if(p1.f=='l'){
p1_b[p1_ii].x=p1.x-1;
}else{
p1_b[p1_ii].x=p1.x+1;
}
p1_b[p1_ii].f=p1.f;
}
*w=wait;
}
void p2_s(int l_,float*w,float wait){
int p2_ii=-1;
for(int i=0;i=0){
p2_b[p2_ii].l=l_;
p2_b[p2_ii].z=1;
p2_b[p2_ii].y=p2.y;
if(p2.f=='l'){
p2_b[p2_ii].x=p2.x-1;
}else{
p2_b[p2_ii].x=p2.x+1;
}
p2_b[p2_ii].f=p2.f;
}
*w=wait;
}
int main(){
srand(time(0));
int good_x;
int good_y;
bool good=false;
hide();
int BIGbullet=0;
windows_tle("小人-格斗(双人游戏)");
//开始界面
windows_size(40,15);
int in=1;
while(true){
system("cls");
go(0,0);
printf("****************************************\n");
go(11,1);
printf("M A N - F I G H T");
if(in==1){
go(13,5);
printf(">1.开始游戏<");
go(14,7);
printf("2.游戏规则");
go(14,9);
printf("3.退出游戏");
}else if(in==2){
go(14,5);
printf("1.开始游戏");
go(13,7);
printf(">2.游戏规则<");
go(14,9);
printf("3.退出游戏");
}else if(in==3){
go(14,5);
printf("1.开始游戏");
go(14,7);
printf("2.游戏规则");
go(13,9);
printf(">3.退出游戏<");
}
go(0,14);
printf("↑↓键选择,Enter键确定");
getch();
if(GetAsyncKeyState(VK_UP)&0x8000){
in--;
if(in==0){in=1;}
}else if(GetAsyncKeyState(VK_DOWN)&0x8000){
in++;
if(in==4){in=3;}
}else if(GetAsyncKeyState(VK_RETURN)&0x8000){
if(in==1){
break;
}else if(in==2){
MessageBox(0,"这是一个双人游戏","游戏规则",MB_OK);
MessageBox(0,"p1是一个实心小人","游戏规则",MB_OK);
MessageBox(0,"p2是一个空心小人","游戏规则",MB_OK);
MessageBox(0,"p1用wsad控制小人","游戏规则",MB_OK);
MessageBox(0,"p2用↑↓←→控制小人","游戏规则",MB_OK);
MessageBox(0,"p1用123键放技能","游戏规则",MB_OK);
MessageBox(0,"p2用BNM键放技能","游戏规则",MB_OK);
MessageBox(0,"按ESC键退出游戏","游戏规则",MB_OK);
}else if(in==3){
return 0;
}
}
Sleep(100);
}
int game=1;
while(true){
system("cls");
go(0,0);
printf("****************************************\n");
go(11,1);
printf("M A N - F I G H T");
if(in==1){
go(13,6);
printf(">1.横版对战<");
go(14,8);
printf("2.平面对战");
}else if(in==2){
go(14,6);
printf("1.横版对战");
go(13,8);
printf(">2.平面对战<");
}
go(0,14);
printf("↑↓键选择,Enter键确定");
getch();
if(GetAsyncKeyState(VK_UP)&0x8000){
in--;
if(in==0){in=1;}
}else if(GetAsyncKeyState(VK_DOWN)&0x8000){
in++;
if(in==3){in=2;}
}else if(GetAsyncKeyState(VK_RETURN)&0x8000){
if(in==1){
game=1;
}else if(in==2){
game=2;
}
break;
}
Sleep(100);
}
if(game==1){
int Bullet=3;
char p1_r;
char p2_r;
p1.x=20;p1.y=10;p1.jump=false;p1.ifjump=JUMPHIGHT+20;p1.f='r';p1.hp=100;
p2.x=52;p2.y=10;p2.jump=false;p2.ifjump=JUMPHIGHT+20;p2.f='l';p2.hp=100;
//选择人物界面
windows_size(75,31);
go(0,0);
printf("p1选择人物:\n\n");
printf("1.普通小人 100血\n技能1:普通射子弹\n技能2:small炸弹(向前飞,直到碰到敌人,伤害7点,CD:3.0s)\n技能3:手扔式\"原子弹\"(发射一个原子弹,伤害为50,CD:15.0s)\n\n");
printf("2.super小人 70血\n技能1:普通射子弹\n技能2:super炸弹(向前飞,速度快,直到碰到敌人,伤害20点!CD:7.0s)\n技能3:super光波(发射一个光波,伤害为25,CD:10.0s)\n\n");
printf("3.胖胖小人 200血\n技能1:普通射子弹\n技能2:small紫砂无人机(向前飞,直到碰到敌人,伤害2点,CD:3.0s)\n技能3:BOB(发射一个B,伤害为0,击中敌人后敌人无法攻击,持续3秒,CD:5.0s)\n\n");
printf("4.耍技小人 50血\n技能1:普通射子弹\n技能2:躲闪时间!(敌人的攻击对你无效,持续3秒,CD:6.0s)\n技能3:翻滚(向前滚动10格,CD:2.0s)\n\n");
printf("5.文明小人 65血\n技能1:普通射子弹\n技能2:口吐芬芳(射出一个速度极快的!,伤害5,CD:4.0s)\n技能3:极快速口吐芬芳(发射一个@,击中敌人后使敌人行动翻转,持续5秒,CD:8.0s)\n\n");
printf("6.魔法小人 60血\n技能1:普通射子弹\n技能2:超级光线(射出一个激光,伤害15,CD:6.0s)\n技能3:剧毒诅咒(发射一个&,击中敌人后使敌人持续扣血,持续0.5秒,CD:6.0s)");
p1_r=getch();
if(p1_r=='1'){
p1.hp=100;
p1.s1=1;//small炸弹
p1.s1_wait=
p1.s2=1;//激光波炸弹
}else if(p1_r=='2'){
p1.hp=70;
p1.s1=2;//super炸弹
p1.s2=2;//super炸弹
}else if(p1_r=='3'){
p1.hp=200;
p1.s1=3;//紫砂无人机
p1.s2=3;//BOB
}else if(p1_r=='4'){
p1.hp=50;
p1.s1=4;//躲闪时间
p1.s2=4;//翻滚
}else if(p1_r=='5'){
p1.hp=65;
p1.s1=5;//口吐芬芳
p1.s2=5;//极快口吐芬芳
}else if(p1_r=='6'){
p1.hp=60;
p1.s1=6;//口吐芬芳
p1.s2=6;//极快口吐芬芳
}
system("cls");
go(0,0);
printf("p2选择人物:\n\n");
printf("1.普通小人 100血\n技能1:普通射子弹\n技能2:small炸弹(向前飞,直到碰到敌人,伤害7点,CD:3.0s)\n技能3:手扔式\"原子弹\"(发射一个原子弹,伤害为50,CD:15.0s)\n\n");
printf("2.super小人 70血\n技能1:普通射子弹\n技能2:super炸弹(向前飞,速度快,直到碰到敌人,伤害20点!CD:7.0s)\n技能3:super光波(发射一个光波,伤害为25,CD:10.0s)\n\n");
printf("3.胖胖小人 200血\n技能1:普通射子弹\n技能2:small紫砂无人机(向前飞,直到碰到敌人,伤害2点,CD:3.0s)\n技能3:BOB(发射一个B,伤害为0,击中敌人后敌人无法攻击,持续3秒,CD:5.0s)\n\n");
printf("4.耍技小人 50血\n技能1:普通射子弹\n技能2:躲闪时间!(敌人的攻击对你无效,持续2秒,CD:6.0s)\n技能3:翻滚(向前滚动10格,CD:2.0s)\n\n");
printf("5.文明小人 65血\n技能1:普通射子弹\n技能2:口吐芬芳(射出一个速度极快的!,伤害5,CD:4.0s)\n技能3:极快速口吐芬芳(发射一个@,击中敌人后使敌人行动翻转,持续5秒,CD:8.0s)\n\n");
printf("6.魔法小人 60血\n技能1:普通射子弹\n技能2:超级光线(射出一个激光,伤害15,CD:6.0s)\n技能3:剧毒诅咒(发射一个&,击中敌人后使敌人持续扣血,持续0.5秒,CD:6.0s)");
p2_r=getch();
if(p2_r=='1'){
p2.hp=100;
p2.s1=1;//small炸弹
p2.s2=1;//手抛式原子弹
}else if(p2_r=='2'){
p2.hp=70;
p2.s1=2;//super炸弹
p2.s2=2;//super光波
}else if(p2_r=='3'){
p2.hp=200;
p2.s1=3;//紫砂无人机
p2.s2=3;//BOB
}else if(p2_r=='4'){
p2.hp=50;
p2.s1=4;//躲闪时间
p2.s2=4;//翻滚
}else if(p2_r=='5'){
p2.hp=65;
p2.s1=5;//口吐芬芳
p2.s2=5;//极快口吐芬芳
}else if(p2_r=='6'){
p2.hp=60;
p2.s1=6;//口吐芬芳
p2.s2=6;//极快口吐芬芳
}
for(int i=0;i70) p1.x=70;
if (p2.x>70) p2.x=70;
if (p1.x<0) p1.x=0;
if (p2.x<0) p2.x=0;
//更改地图
if(!p1.revert && !p1.poison){
if(!p1.ifdown){map[p1.y][p1.x]=1;if(p1.f=='l'){map[p1.y+1][p1.x]=17;}else{map[p1.y+1][p1.x]=16;}}
else{map[p1.y][p1.x]=1;}
}else if(p1.revert){
if(!p1.ifdown){map[p1.y][p1.x]='@';if(p1.f=='l'){map[p1.y+1][p1.x]=17;}else{map[p1.y+1][p1.x]=16;}}
else{map[p1.y][p1.x]=1;}
}else{
if(!p1.ifdown){map[p1.y][p1.x]='*';if(p1.f=='l'){map[p1.y+1][p1.x]=17;}else{map[p1.y+1][p1.x]=16;}}
else{map[p1.y][p1.x]=1;}
}
if(!p2.revert && !p2.poison){
if(!p2.ifdown){map[p2.y][p2.x]=2;if(p2.f=='l'){map[p2.y+1][p2.x]=17;}else{map[p2.y+1][p2.x]=16;}}
else{map[p2.y][p2.x]=2;}
}else if(p2.revert){
if(!p2.ifdown){map[p2.y][p2.x]='@';if(p2.f=='l'){map[p2.y+1][p2.x]=17;}else{map[p2.y+1][p2.x]=16;}}
else{map[p2.y][p2.x]=2;}
}else{
if(!p2.ifdown){map[p2.y][p2.x]='*';if(p2.f=='l'){map[p2.y+1][p2.x]=17;}else{map[p2.y+1][p2.x]=16;}}
else{map[p2.y][p2.x]=2;}
}
for(int i=0;i5 && p1.ifdown){
p1.ifdown=false;
p1.y--;
}
if(p2.dwontime>5 && p2.ifdown){
p2.ifdown=false;
p2.y--;
}
if(p1.reverttime>50){
p1.revert=false;
}
if(p2.reverttime>50){
p2.revert=false;
}
draw_map_delta(map);//对比 map 和 OLDMAP,有差异的行才重新打印画 ,画完map => OLDMAP
go(22,0);
printf("p1血量:%d p2血量:%d ",p1.hp,p2.hp);
//玩家死亡
if(p1.hp<=0){
MessageBox(0,"p2玩家胜利!!","提示",MB_OK);
return 0;
}
if(p2.hp<=0){
MessageBox(0,"p1玩家胜利!!","提示",MB_OK);
return 0;
}
go(1,1);
printf("p1技能2冷却:%.1f ",p1.s1_wait);
printf("p1技能3冷却:%.1f ",p1.s2_wait);
printf("p2技能2冷却:%.1f ",p2.s1_wait);
printf("p2技能3冷却:%.1f",p2.s2_wait);
Sleep(50);
//技能CD冷却
if(p1.s1_wait>0.0){p1.s1_wait-=0.05;p1.s1_ok=false;}
else{p1.s1_ok=true;}
if(p1.s2_wait>0.0){p1.s2_wait-=0.05;p1.s2_ok=false;}
else{p1.s2_ok=true;}
if(p2.s1_wait>0.0){p2.s1_wait-=0.05;p2.s1_ok=false;}
else{p2.s1_ok=true;}
if(p2.s2_wait>0.0){p2.s2_wait-=0.05;p2.s2_ok=false;}
else{p2.s2_ok=true;}
//BOB的不可移动
if(p1.walk_wait>0.0){p1.walk_wait-=0.05;p1.canwalk=false;}
else{p1.canwalk=true;}
if(p2.walk_wait>0.0){p2.walk_wait-=0.05;p2.canwalk=false;}
else{p2.canwalk=true;}
//中毒
if(p1.poisontime>0.0){p1.poisontime-=0.05;p1.hp-=1;p1.poison=true;}
else{p1.poison=false;}
if(p2.poisontime>0.0){p2.poisontime-=0.05;p2.hp-=1;p2.poison=true;}
else{p2.poison=false;}
//子弹移动
for(int i=0;i70 || p1_b[i].x<0){p1_b[i].z=0;}
}
}
if(!p2.ifinvin){
for(int i=0;i70 || p2_b[i].x<0){p2_b[i].z=0;}
}
}
if(!p1.ifinvin){
for(int i=0;i59){
p1.ifinvin=false;
}
if(p2.invintime>59){
p2.ifinvin=false;
}
if(!p1.jump && p1.ifjump>JUMPHIGHT){
p1.y++;
if(map[p1.y+2][p1.x]=='-'){
p1.jump=true;
}
}else if(p1.ifjumpJUMPHIGHT){
p2.y++;
if(map[p2.y+2][p2.x]=='-'){
p2.jump=true;
}
}else if(p2.ifjump=0){
p2_b[p2_ii].z=1;
p2_b[p2_ii].y=p2.y;
if(p2.f=='l'){
p2_b[p2_ii].x=p2.x-1;
}else{
p2_b[p2_ii].x=p2.x+1;
}
p2_b[p2_ii].f=p2.f;
}
}
if(Key('N') && p2.s1_ok){
if(p2.s1==1){
p2_s(1,&p2.s1_wait,3);
}else if(p2.s1==2){
p2_s(3,&p2.s1_wait,7);
}else if(p2.s1==3){
int p2_ii=-1;
for(int i=0;i=0){
p2_b[p2_ii].l=5;
p2_b[p2_ii].z=1;
p2_b[p2_ii].y=p2.y;
if(p2.x>p1.x){
p2_b[p2_ii].x=p2.x-1;
p2_b[p2_ii].f='l';
}else if(p2.x=0){
p1_b[p1_ii].l=0;
p1_b[p1_ii].z=1;
p1_b[p1_ii].y=p1.y;
if(p1.f=='l'){
p1_b[p1_ii].x=p1.x-1;
}else{
p1_b[p1_ii].x=p1.x+1;
}
p1_b[p1_ii].f=p1.f;
}
}
if(Key('2') && p1.s1_ok){
if(p1.s1==1){
p1_s(1,&p1.s1_wait,3);
}else if(p1.s1==2){
p1_s(3,&p1.s1_wait,7);
}else if(p1.s1==3){
int p1_ii=-1;
for(int i=0;i=0){
p1_b[p1_ii].l=5;
p1_b[p1_ii].z=1;
p1_b[p1_ii].y=p1.y;
if(p1.x>p2.x){
p1_b[p1_ii].x=p1.x-1;
p1_b[p1_ii].f='l';
}else if(p1.x70){p1.x=70;}
if(p1.y<1){p1.y=1;}
if(p1.y>20){p1.y=20;}
if(p2.x<1){p2.x=1;}
if(p2.x>70){p2.x=70;}
if(p2.y<1){p2.y=1;}
if(p2.y>20){p2.y=20;}
//更改地图
map[p2.y][p2.x]=2;
map[p1.y][p1.x]=1;
for(int i=0;i=20 || p1_b[i].y<=0 || p1_b[i].x<=0 || p1_b[i].x>=70){
p1_b[i].z=0;
}
}
}
for(int i=0;i=20 || p2_b[i].y<=0 || p2_b[i].x<=0 || p2_b[i].x>=70){
p2_b[i].z=0;
}
}
}
//p1玩家
if(Key('A')){
if(!p1.revert){p1.x-=RUN;p1.f='l';}
else{p1.x+=RUN;p1.f='r';}
}
if(Key('D')){
if(!p1.revert){p1.x+=RUN;p1.f='r';}
else{p1.x-=RUN;p1.f='l';}
}
if(Key('W')){
if(!p1.revert){p1.y-=RUN;p1.f='u';}
else{p1.y+=RUN;p1.f='d';}
}
if(Key('S')){
if(!p1.revert){p1.y+=RUN;p1.f='d';}
else{p1.y-=RUN;p1.f='u';}
}
if(Key('1') && Bullet%BULLET_==0){
int p1_ii=-1;
for(int i=0;i=0){
p1_b[p1_ii].l=0;
p1_b[p1_ii].z=1;
p1_b[p1_ii].y=p1.y;
p1_b[p1_ii].x=p1.x;
if(p1.f=='l'){
p1_b[p1_ii].x=p1.x-1;
}else if(p1.f=='r'){
p1_b[p1_ii].x=p1.x+1;
}else if(p1.f=='u'){
p1_b[p1_ii].y=p1.y-1;
}else if(p1.f=='d'){
p1_b[p1_ii].y=p1.y+1;
}
p1_b[p1_ii].f=p1.f;
}
}
if(Key('2') && p1.energy>=50){
int p1_ii=-1;
for(int i=0;i=0){
p1_b[p1_ii].l=0;
p1_b[p1_ii].z=1;
p1_b[p1_ii].y=p1.y;
p1_b[p1_ii].x=p1.x+1;
p1_b[p1_ii].f='r';
}
p1_ii=-1;
for(int i=0;i=0){
p1_b[p1_ii].l=0;
p1_b[p1_ii].z=1;
p1_b[p1_ii].y=p1.y;
p1_b[p1_ii].x=p1.x-1;
p1_b[p1_ii].f='l';
}
p1_ii=-1;
for(int i=0;i=0){
p1_b[p1_ii].l=0;
p1_b[p1_ii].z=1;
p1_b[p1_ii].y=p1.y+1;
p1_b[p1_ii].x=p1.x;
p1_b[p1_ii].f='d';
}
p1_ii=-1;
for(int i=0;i=0){
p1_b[p1_ii].l=0;
p1_b[p1_ii].z=1;
p1_b[p1_ii].y=p1.y+1;
p1_b[p1_ii].x=p1.x;
p1_b[p1_ii].f='u';
}
p1.energy-=50;
}
//p1玩家
if(Key(VK_LEFT)){
if(!p2.revert){p2.x-=RUN;p2.f='l';}
else{p2.x+=RUN;p2.f='r';}
}
if(Key(VK_RIGHT)){
if(!p2.revert){p2.x+=RUN;p2.f='r';}
else{p2.x-=RUN;p2.f='l';}
}
if(Key(VK_UP)){
if(!p2.revert){p2.y-=RUN;p2.f='u';}
else{p2.y+=RUN;p2.f='d';}
}
if(Key(VK_DOWN)){
if(!p2.revert){p2.y+=RUN;p2.f='d';}
else{p2.y-=RUN;p2.f='u';}
}
if(Key('B') && Bullet%BULLET_==0){
int p2_ii=-1;
for(int i=0;i=0){
p2_b[p2_ii].l=0;
p2_b[p2_ii].z=1;
p2_b[p2_ii].y=p2.y;
p2_b[p2_ii].x=p2.x;
if(p2.f=='l'){
p2_b[p2_ii].x=p2.x-1;
}else if(p2.f=='r'){
p2_b[p2_ii].x=p2.x+1;
}else if(p2.f=='u'){
p2_b[p2_ii].y=p2.y-1;
}else if(p2.f=='d'){
p2_b[p2_ii].y=p2.y+1;
}
p2_b[p2_ii].f=p2.f;
}
}
if(Key('N') && p2.energy>=50){
int p2_ii=-1;
for(int i=0;i=0){
p2_b[p2_ii].l=0;
p2_b[p2_ii].z=1;
p2_b[p2_ii].y=p2.y;
p2_b[p2_ii].x=p2.x+1;
p2_b[p2_ii].f='r';
}
p2_ii=-1;
for(int i=0;i=0){
p2_b[p2_ii].l=0;
p2_b[p2_ii].z=1;
p2_b[p2_ii].y=p2.y;
p2_b[p2_ii].x=p2.x-1;
p2_b[p2_ii].f='l';
}
p2_ii=-1;
for(int i=0;i=0){
p2_b[p2_ii].l=0;
p2_b[p2_ii].z=1;
p2_b[p2_ii].y=p2.y+1;
p2_b[p2_ii].x=p2.x;
p2_b[p2_ii].f='d';
}
p2_ii=-1;
for(int i=0;i=0){
p2_b[p2_ii].l=0;
p2_b[p2_ii].z=1;
p2_b[p2_ii].y=p2.y-1;
p2_b[p2_ii].x=p2.x;
p2_b[p2_ii].f='u';
}
p2.energy-=50;
}
Bullet++;
//判断游戏退出
if(Key(esc)){
return 0;
}
}
}
}