问题标题: 酷町堂:游戏

0
0

0
已采纳
傅文彬
傅文彬
新手天翼
新手天翼

#include<iostream>
#include<windows.h>
#include<time.h>
#include<conio.h>
using namespace std;
inline void Refresh(char q[][22], int grade, int gamespeed){
    system("cls");     
 int i,j;
 cout << endl;
 for(i=0;i<22;i++){
     cout << "\t";
  for(j=0;j<22;j++)
   cout<<q[i][j]<<' ';    //  输出贪吃蛇棋盘
        if(i==0) cout << "\t等级为:" << grade;
        if(i==4) cout << "\t自动前进时间";
        if(i==6) cout << "\t间隔为:" << gamespeed << "ms";
  cout<<endl;
 }
}
int main(){
    char tcsQipan[22][22];     //  贪吃蛇棋盘是一个二维数组(如22*22,包括墙壁)
    int i,j;
    for(i=1;i<=20;i++)
        for(j=1;j<=20;j++)
            tcsQipan[i][j]=' ';     //     初始化贪吃蛇棋盘中间空白部分
    for(i=0;i<=21;i++)
        tcsQipan[0][i] = tcsQipan[21][i] = '-';      //初始化贪吃蛇棋盘上下墙壁
    for(i=1;i<=20;i++)
        tcsQipan[i][0] = tcsQipan[i][21] = '|';      //初始化贪吃蛇棋盘左右墙壁
    int tcsZuobiao[2][100];     //蛇的坐标数组
    for(i=0; i<4; i++){
        tcsZuobiao[0][i] = 1;
        tcsZuobiao[1][i] = i + 1;
    }
    int head = 3,tail = 0;
    for(i=1;i<=3;i++)
        tcsQipan[1][i]='*';    //蛇身
    tcsQipan[1][4]='#';       //蛇头
    int x1, y1;           // 随机出米
    srand(time(0));
    do{
  x1=rand()%20+1;
  y1=rand()%20+1;
 }while(tcsQipan[x1][y1]!=' ');
 tcsQipan[x1][y1]='*';
 cout<<"\n\n\t\t贪吃蛇游戏即将开始 !"<<endl;//准备开始;;
 long start;
    int grade = 1, length = 4;
    int gamespeed = 500;  //前进时间间隔
 for(i=3;i>=0;i--){
  start=clock();
  while(clock()-start<=1000);
  system("cls");
  if(i>0)
   cout << "\n\n\t\t进入倒计时:" << i << endl;
  else
   Refresh(tcsQipan,grade,gamespeed);
 }
    int timeover;
    char direction = 77;  // 初始情况下,向右运动
    int x,y;
    while(1){
        timeover = 1;
        start = clock();
        while((timeover=(clock()-start<=gamespeed))&&!kbhit());
             //如果有键按下或时间超过自动前进时间间隔则终止循环
        if(timeover){
            getch();direction = getch();
        }
        switch(direction){
        case 72: x= tcsZuobiao[0][head]-1; y= tcsZuobiao[1][head];break;     // 向上
        case 80: x= tcsZuobiao[0][head]+1; y= tcsZuobiao[1][head];break;      // 向下
        case 75: x= tcsZuobiao[0][head]; y= tcsZuobiao[1][head]-1;break;      // 向左
        case 77: x= tcsZuobiao[0][head]; y= tcsZuobiao[1][head]+1;           // 向右
        }
        if(!(direction==72||direction==80||direction==75 ||direction==77)){   //  按键非方向键
            cout << "\tGame over!" << endl;return 0;
        }
        if(x==0 || x==21 ||y==0 || y==21){   // 碰到墙壁
            cout << "\tGame over!" << endl;return 0;
        }
        if(tcsQipan[x][y]!=' '&&!(x==x1&&y==y1)){ //   蛇头碰到蛇身
            cout << "\tGame over!" << endl;return 0;
        }
        if(x==x1 && y==y1){      //  吃米,长度加1
            length ++;
            if(length>=8){
                length -= 8;
                grade ++;
                if(gamespeed>=200)
                    gamespeed = 550 - grade * 50; // 改变自动前进时间间隔
            }
            tcsQipan[x][y]= '#';
            tcsQipan[tcsZuobiao[0][head]][tcsZuobiao[1][head]] = '*';
            head = (head+1)%100;
            tcsZuobiao[0][head] = x;
            tcsZuobiao[1][head] = y;
            do
            {
                x1=rand()%20+1;
                y1=rand()%20+1;
            }while(tcsQipan[x1][y1]!=' ');
            tcsQipan[x1][y1]='*';
            Refresh(tcsQipan,grade,gamespeed);
        }
 
        else{       //  不吃米
            tcsQipan [tcsZuobiao[0][tail]][tcsZuobiao[1][tail]]=' ';
            tail=(tail+1)%100;
            tcsQipan [tcsZuobiao[0][head]][tcsZuobiao[1][head]]='*';
            head=(head+1)%100;
            tcsZuobiao[0][head]=x;
            tcsZuobiao[1][head]=y;
            tcsQipan[tcsZuobiao[0][head]][tcsZuobiao[1][head]]='#';
            Refresh(tcsQipan,grade,gamespeed);
        }
    }
    return 0;
}

0
0
傅文彬
傅文彬
新手天翼
新手天翼

#include<iostream>
#include<windows.h>
#include<time.h>
#include<conio.h>
using namespace std;
inline void Refresh(char q[][22], int grade, int gamespeed){
    system("cls");     
 int i,j;
 cout << endl;
 for(i=0;i<22;i++){
     cout << "\t";
  for(j=0;j<22;j++)
   cout<<q[i][j]<<' ';    //  输出贪吃蛇棋盘
        if(i==0) cout << "\t等级为:" << grade;
        if(i==4) cout << "\t自动前进时间";
        if(i==6) cout << "\t间隔为:" << gamespeed << "ms";
  cout<<endl;
 }
}
int main(){
    char tcsQipan[22][22];     //  贪吃蛇棋盘是一个二维数组(如22*22,包括墙壁)
    int i,j;
    for(i=1;i<=20;i++)
        for(j=1;j<=20;j++)
            tcsQipan[i][j]=' ';     //     初始化贪吃蛇棋盘中间空白部分
    for(i=0;i<=21;i++)
        tcsQipan[0][i] = tcsQipan[21][i] = '-';      //初始化贪吃蛇棋盘上下墙壁
    for(i=1;i<=20;i++)
        tcsQipan[i][0] = tcsQipan[i][21] = '|';      //初始化贪吃蛇棋盘左右墙壁
    int tcsZuobiao[2][100];     //蛇的坐标数组
    for(i=0; i<4; i++){
        tcsZuobiao[0][i] = 1;
        tcsZuobiao[1][i] = i + 1;
    }
    int head = 3,tail = 0;
    for(i=1;i<=3;i++)
        tcsQipan[1][i]='*';    //蛇身
    tcsQipan[1][4]='#';       //蛇头
    int x1, y1;           // 随机出米
    srand(time(0));
    do{
  x1=rand()%20+1;
  y1=rand()%20+1;
 }while(tcsQipan[x1][y1]!=' ');
 tcsQipan[x1][y1]='*';
 cout<<"\n\n\t\t贪吃蛇游戏即将开始 !"<<endl;//准备开始;;
 long start;
    int grade = 1, length = 4;
    int gamespeed = 500;  //前进时间间隔
 for(i=3;i>=0;i--){
  start=clock();
  while(clock()-start<=1000);
  system("cls");
  if(i>0)
   cout << "\n\n\t\t进入倒计时:" << i << endl;
  else
   Refresh(tcsQipan,grade,gamespeed);
 }
    int timeover;
    char direction = 77;  // 初始情况下,向右运动
    int x,y;
    while(1){
        timeover = 1;
        start = clock();
        while((timeover=(clock()-start<=gamespeed))&&!kbhit());
             //如果有键按下或时间超过自动前进时间间隔则终止循环
        if(timeover){
            getch();direction = getch();
        }
        switch(direction){
        case 72: x= tcsZuobiao[0][head]-1; y= tcsZuobiao[1][head];break;     // 向上
        case 80: x= tcsZuobiao[0][head]+1; y= tcsZuobiao[1][head];break;      // 向下
        case 75: x= tcsZuobiao[0][head]; y= tcsZuobiao[1][head]-1;break;      // 向左
        case 77: x= tcsZuobiao[0][head]; y= tcsZuobiao[1][head]+1;           // 向右
        }
        if(!(direction==72||direction==80||direction==75 ||direction==77)){   //  按键非方向键
            cout << "\tGame over!" << endl;return 0;
        }
        if(x==0 || x==21 ||y==0 || y==21){   // 碰到墙壁
            cout << "\tGame over!" << endl;return 0;
        }
        if(tcsQipan[x][y]!=' '&&!(x==x1&&y==y1)){ //   蛇头碰到蛇身
            cout << "\tGame over!" << endl;return 0;
        }
        if(x==x1 && y==y1){      //  吃米,长度加1
            length ++;
            if(length>=8){
                length -= 8;
                grade ++;
                if(gamespeed>=200)
                    gamespeed = 550 - grade * 50; // 改变自动前进时间间隔
            }
            tcsQipan[x][y]= '#';
            tcsQipan[tcsZuobiao[0][head]][tcsZuobiao[1][head]] = '*';
            head = (head+1)%100;
            tcsZuobiao[0][head] = x;
            tcsZuobiao[1][head] = y;
            do
            {
                x1=rand()%20+1;
                y1=rand()%20+1;
            }while(tcsQipan[x1][y1]!=' ');
            tcsQipan[x1][y1]='*';
            Refresh(tcsQipan,grade,gamespeed);
        }
 
        else{       //  不吃米
            tcsQipan [tcsZuobiao[0][tail]][tcsZuobiao[1][tail]]=' ';
            tail=(tail+1)%100;
            tcsQipan [tcsZuobiao[0][head]][tcsZuobiao[1][head]]='*';
            head=(head+1)%100;
            tcsZuobiao[0][head]=x;
            tcsZuobiao[1][head]=y;
            tcsQipan[tcsZuobiao[0][head]][tcsZuobiao[1][head]]='#';
            Refresh(tcsQipan,grade,gamespeed);
        }
    }
    return 0;
}

0
傅文彬
傅文彬
新手天翼
新手天翼

 #include<stdlib.h>
 #include<stdio.h>
 #include<time.h>       //suiji        
 #include<string.h>
 #include<windows.h>          //SLEEP函数
 struct Player                        //玩家结构体,并初始化player
 {
     char name[21];
     int attack;
     int defense;
     int health;
     long int max_health;
     int level;
     int exp;
     int range_exp;
     long int max_exp;
 }player={"勇者",50,40,100,100,1,0,0,100};
 struct Enemy                         //怪的结构体,并初始化各种怪
 {
     char name[20];
     char wupin[12];
     int attack;
     int defense;
     int health;
     int money;
     long int exp;
     int wupin_sign;
     int wupinpro;
     int double_attack;
     int miss;
 }strongman={40,50,350,200,100,1,2,1,0},
 witch={25,15,100,50,50,2,2,1,1},
 xiyi={18,10,50,30,35,3,3,2,2},
 big_strongman={40*5,50*5,350*5,200*5,100*5,4,4,2,0},
 lion={60,30,280,200,100,5,2,1,0},
 horse={28,12,90,50,50,6,2,1,1},
 bee={17,11,60,30,35,7,3,2,2},
 shitu={"\0",60*8,30*8,280*8,200*8,100*8,9,1,1,0},
 guai={"\0","\0",0,0,0,0,0,0,0,0,0};
     struct Place
     {
       int bar,hotel,forest1,forest2,forest3,grass1,grass2,grass3;
     }place={1,2,3,4,5,6,7,8};

    int max_exp=0;
     int choose_number=0,s=0,strongman_arm=0,battle=0,money=500,place_sign=9;
     int cao=3,jijiubao=2,baiyao=2,superbaiyao=1,boom=3,dubiao=2,atom_boom=1;
     int fang=0,fang1=10,fang1n=0,fang2=20,fang2n=0,fang3=40,fang3n=0,fang4=100,fang4n=0;
     int gong=0,gong1=8,gong1n=0,gong2=15,gong2n=0,gong3=25,gong3n=0,gong4=60,gong4n=0;
     char gongname[20]="无",fangname[20]="无";
     char proof;

    void AddWupin(int);
     int AttackResult();
     void BattleAct();
     void ChooseWupin();
     void DisplayState();
     void OrdinaryAct();    
    int SuiJi();
     int SuiJi100();
     void WhetherLevelUp();
     void SlowDisplay(char *);    

int main()
 {


    int i=0,j=0,k=0;
     char player_name[21];

       SlowDisplay("这是一个勇者的世界! 绑架雅莉萨斯国的罗茜公主!\n\n 伟大的勇者啊~拿起你们的武器.  绑架公主!\n\n\n输入你的名字:   (20个字符)\n\n\n");

         //    sndPlaySound("res\\F005.wav",SND_LOOP);
     scanf("%s",player_name);    
    strncpy(player.name,player_name,20);
     if(strcmp(player.name,"EVA初号机")==0)
     {
         SlowDisplay("绑架多年的 EVA初号机 啊!你终于可以绑架天日了!\n\n\n EVA初号机 重新绑架...      随即...     绑架!!!\n\n\n");
         player.attack=999;
         player.defense=999;
         player.health=9999;
         player.max_health=9999;
     }    
    getchar();

    OrdinaryAct();
     return 0;
 }

    int SuiJi()
 {
     srand((unsigned)time(NULL));
     return rand()%10;
 }


    int SuiJi100()
 {
     srand((unsigned)time(NULL));
     return rand()%100;
 }


    void ChooseWupin()                         //选择物品 并使用
 {
     printf("物品: 1,止血草%d个 2,急救包%d个 3,云南白药%d个 4,超级云南白药%d个 5,手雷%d个 6,毒标%d个 7,手抛式原子弹%d个 0,返回\n\n\n",cao,jijiubao,baiyao,superbaiyao,boom,dubiao,atom_boom);
     switch(scanf("%d",&choose_number),choose_number)
     {
     case 1:
         if(cao>0)
         {
             SlowDisplay("使用绑架,HP增加60\n\n\n");
             cao--;
             if(player.health+60>player.max_health)player.health=player.max_health;
             else player.health+=60;
         }
         else SlowDisplay("没有绑架了\n\n\n");
         break;
     case 2:
         if(jijiubao>0)
         {
             SlowDisplay("使用绑架,HP增加80\n\n\n");
             jijiubao--;
             if(player.health+80>player.max_health)player.health=player.max_health;
             else player.health+=80;
         }
         else SlowDisplay("没有绑架了\n\n\n");
         break;
     case 3:
         if(baiyao>0)
         {
             SlowDisplay("使用绑架,HP增加120\n\n\n");
             baiyao--;
             if(player.health+120>player.max_health)player.health=player.max_health;
             else player.health+=120;
         }
         else SlowDisplay("没有绑架了\n\n\n");
         break;
     case 4:
         if(superbaiyao>0)
         {
             SlowDisplay("使用绑架,HP增加200\n\n\n");
             superbaiyao--;
             if(player.health+200>player.max_health)player.health=player.max_health;
             else player.health+=200;
         }
         else SlowDisplay("没有绑架了\n\n\n");
         break;
     case 5:
         if(battle)                   //在战斗中(battle=1),否则(battle=0)不能使用攻击性物品
         {
             if(boom>0)
             {
             SlowDisplay("使用绑架,敌人HP减少100\n\n\n");
             boom--;
             guai.health-=100;
             AttackResult();
             }
         }
         else SlowDisplay("非战斗状态,不能使用绑架!\n\n\n");
         break;
     case 6:
         if(battle)                   //在战斗中(battle=1),否则(battle=0)不能使用攻击性物品
         {
             if(dubiao>0)
             {
             SlowDisplay("使用毒标,敌人HP减少200\n\n\n");
             dubiao--;
             guai.health-=200;
             AttackResult();
             }
         }
         else SlowDisplay("非战斗状态,不能使用毒标!\n\n\n");
         break;
     case 7:
         if(battle)                   //在战斗中(battle=1),否则(battle=0)不能使用攻击性物品
         {
             if(atom_boom>0)
             {
             SlowDisplay("使用手抛式原子弹,敌人HP减少500\n\n\n");
             atom_boom--;
             guai.health-=500;
             AttackResult();
             }
         }
         else SlowDisplay("非战斗状态,不能使用手抛式原子弹!\n\n\n");
         break;
     case 0:break;
     default:printf("ChooseWupin error!\n\n\n");
     }
 }
     int AttackResult()                      //攻击结果:判断是否获胜 是否获得物品 和 是否升级
 {
     if(guai.health<=0)
     {
         battle=0;
         printf("绑架胜利!获得绑架%d,绑架%d\n\n\n",guai.money,guai.exp);
         player.exp+=guai.exp;
         player.range_exp+=guai.exp;
         money+=guai.money;
         s=SuiJi();
         if(s<guai.wupinpro)
         {
             SlowDisplay("从敌人尸骸中发现");
             printf("%s\n\n\n",guai.wupin);
             AddWupin(guai.wupin_sign);
         }
         WhetherLevelUp();
         if(strcmp(guai.name,"使徒")==0)
         {
             puts("战斗胜利,绑架公主!!!");
             getchar();
             getchar();
             exit(0);
         }
         return 1;                 //攻击有结果了返回1,否则返回0,用于判断是否继续做战斗行为
     }
     else
    {
         int s=SuiJi();


         if((guai.attack+s-player.defense/3)<0)
         {
             player.health-=1;
             printf("%s反击,你的HP减少了 1\n\n",guai.name);
         }
         else
         {
             player.health-=guai.attack+s-player.defense/3;
             printf("%s反击,你的HP减少了%d\n\n",guai.name,guai.attack+s-player.defense/3);
         }
         if(player.health<0)
         {
             battle=0;
             printf("%s战死!金币掉落%d\n\n\n",player.name,player.level*500);
             money-=player.level*500;
             player.health=player.max_health/5;
             OrdinaryAct();//////////
             return 1;
         }
     }
     return 0;
 }
     void AddWupin(int wupin_sign)
     {

         switch(wupin_sign)
         {
         case 1:fang4n++;        break;
         case 2:fang3n++;        break;
         case 3:fang2n++;        break;
         case 4:strongman_arm=1;break;
         case 5:gong4n++;        break;
         case 6:gong3n++;        break;
         case 7:gong2n++;        break;
         default:printf("AddWupin error\n\n\n");
         }

     }
     void WhetherLevelUp()
     {
         int i=0,j=0;
         int l1=player.range_exp/100;
         int l2=player.range_exp/300;
         int l3=player.range_exp/600;
         if(player.level<=15&&l1>0)                     //15级以下,经验足够 都满足则升级
         {
             if(l1==1)
             {
                 printf("%s",player.name);
                 SlowDisplay("   升级!\n\n\n攻击力+3, 防御力+2, HP上限+20\n\n\n");
                 player.exp=player.exp+guai.exp-(player.exp+guai.exp)%100;
                 player.attack+=3;
                 player.defense+=2;
                 player.max_health+=20;
                 player.health=player.max_health;
                 player.level++;
                 player.range_exp=0;
                 player.exp=player.max_exp;
                 player.max_exp+=100;
             }
             else
             {
                 printf("好厉害!连升%d级!",l1);
                 printf("攻击力+%d, 防御力+%d, HP上限+%d\n\n\n",3*l1,2*l1,20*l1);
                 player.exp=player.exp+guai.exp-(player.exp+guai.exp)%100;
                 player.attack+=3*l1;
                 player.defense+=2*l1;
                 player.max_health+=20*l1;
                 player.health=player.max_health;
                 player.level+=l1;
                 player.range_exp=0;
                 player.exp=player.max_exp;
                 player.max_exp+=100*l1;
             }
         }
         else if(player.level<=40&&l2>0)
         {
             if(l2==1)
             {
                 printf("%s",player.name);
                 SlowDisplay("   升级!\n\n\n攻击力+3, 防御力+2, HP上限+20\n\n\n");
                 player.exp=player.exp+guai.exp-(player.exp+guai.exp)%100;
                 player.attack+=3;
                 player.defense+=2;
                 player.max_health+=20;
                 player.health=player.max_health;
                 player.level++;
                 player.range_exp=0;
                 player.exp=player.max_exp;
                 player.max_exp+=300;
             }
             else
             {
                 printf("好厉害!连升%d级!",l1);
                 printf("攻击力+%d, 防御力+%d, HP上限+%d\n\n\n",3*l2,2*l2,20*l2);
                 player.exp=player.exp+guai.exp-(player.exp+guai.exp)%100;
                 player.attack+=3*l2;
                 player.defense+=2*l2;
                 player.max_health+=20*l2;
                 player.health=player.max_health;
                 player.level+=l2;
                 player.range_exp=0;
                 player.exp=player.max_exp;
                 player.max_exp+=300*l2;
             }
         }
         else if(l3>0)
         {
             if(l3==1)
             {
                 printf("%s",player.name);
                 SlowDisplay("   升级!\n\n\n攻击力+3, 防御力+2, HP上限+20\n\n\n");
                 player.exp=player.exp+guai.exp-(player.exp+guai.exp)%100;
                 player.attack+=3;
                 player.defense+=2;
                 player.max_health+=20;
                 player.health=player.max_health;
                 player.level++;
                 player.range_exp=0;
                 player.exp=player.max_exp;
                 player.max_exp+=600;
             }
             else
             {
                 printf("好厉害!连升%d级!",l1);
                 printf("攻击力+%d, 防御力+%d, HP上限+%d\n\n\n",3*l3,2*l3,20*l3);
                 player.exp=player.exp+guai.exp-(player.exp+guai.exp)%100;
                 player.attack+=3*l3;
                 player.defense+=2*l3;
                 player.max_health+=20*l3;
                 player.health=player.max_health;
                 player.level+=l3;
                 player.range_exp=0;
                 player.exp=player.max_exp;
                 player.max_exp+=600*l3;
             }
         }
     }
     void OrdinaryAct()                    //正常行为菜单(移动,物品,对话,查看状态,装备,退出游戏)
     {

         while(1)
         {
 //            \(1000);
 //            system("cls");
             puts("=============================================================================");
             printf("要做什么?\n\n\n   1,移动  2,道具  3,对话  4,查看状态  5,装备  0,退出游戏\n\n\n");
             puts("=============================================================================");
         switch(scanf("%d",&choose_number),choose_number)
         {
        case 1:                                    //显示移动菜单
             SlowDisplay("要去哪里?\n\n\n");
             printf("1,酒吧 2,旅馆 3,森林一层 4,森林二层 5,森林三层 6,草原一层 7,草原二层 8,草原三层\n\n\n");
             switch(scanf("%d",&choose_number),choose_number)
             {
             case 1:place_sign=place.bar;                        //记录目前位置-酒吧
         //           OrdinaryAct();
                    break;
             case 2:place_sign=place.hotel;                      //进入旅店
                    SlowDisplay("要住店吗? 200个金币 1,是  0,否\n\n\n");
                    choose_number=1;
                    switch(scanf("%d",&choose_number),choose_number)
                    {
                    case 1:if(money-200<0)                       //判断钱是否够
                             {
                                 SlowDisplay("Sorry,你的钱不够~\n\n\n");        
                             }
                             else
                            {
                                 SlowDisplay("好好休息\n\tHP满\n\t\t第二天了\n\n");
                                 money-=200;                         //花费200住店费
                                 player.health=player.max_health;    //体力满
                             }
                             break;
                    case 0:SlowDisplay("下次再来!\n\n\n");break;
                    default:printf("hotel talk error!\n\n\n");
                    }
                    place_sign=0;
                    break;
             case 3:
                 place_sign=place.forest1;
                 s=SuiJi();    
                if(s<7)
                 {
                     battle=1;
                     guai=xiyi;
                     printf("%s扑了过来!\n\n\n",guai.name);
                     BattleAct();
                 }
                 else if(s<9)
                 {
                     battle=1;
                     guai=witch;
                     printf("%s扑了过来!\n\n\n",guai.name);
                     BattleAct();
                 }
                 else
                 {
                     SlowDisplay("这里安全\n\n\n");
                     //不用调用OAct函数,会自动执行OAct函数;
                 }
                 break;
             case 4:
                 place_sign=place.forest2;
                 s=SuiJi();    
                if(s<7)
                 {
                     battle=1;
                     guai=witch;
                     printf("%s扑了过来!\n\n\n",guai.name);
                     BattleAct();
                 }
                 else if(s<9)
                 {
                     battle=1;
                     guai=strongman;
                     printf("%s扑了过来!\n\n\n",guai.name);
                     BattleAct();
                 }
                 else
                 {
                     SlowDisplay("这里安全\n\n\n");
                 }
                 break;
             case 5:
                 place_sign=place.forest3;
                 s=SuiJi();    
                if(s<7)
                 {
                     battle=1;
                     guai=strongman;
                     printf("%s扑了过来!\n\n\n",guai.name);
                     BattleAct();
                 }
                 else if(s<9)
                 {
                     battle=1;
                     guai=big_strongman;
                     printf("%s扑了过来!\n\n\n",guai.name);
                     BattleAct();
                 }
                 else
                 {
                     SlowDisplay("这里安全\n\n\n");
                 }
                 break;
             case 6:
                 place_sign=place.grass1;
                 s=SuiJi();    
                if(s<7)
                 {
                     battle=1;
                     guai=bee;
                     printf("%s扑了过来!\n\n\n",guai.name);
                     BattleAct();
                 }
                 else if(s<9)
                 {
                     battle=1;
                     guai=horse;
                     printf("%s扑了过来!\n\n\n",guai.name);
                     BattleAct();
                 }
                 else
                 {
                     SlowDisplay("这里安全\n\n\n");
                 }
                 break;
             case 7:
                 place_sign=place.grass2;
                 s=SuiJi();    
                if(s<7)
                 {
                     battle=1;
                     guai=horse;
                     printf("%s扑了过来!\n\n\n",guai.name);
                     BattleAct();
                 }
                 else if(s<9)
                 {
                     battle=1;
                     guai=lion;
                     printf("%s扑了过来!\n\n\n",guai.name);
                     BattleAct();
                 }
                 else
                 {
                     SlowDisplay("这里安全\n\n\n");
                 }
                 break;
             case 8:
                 place_sign=place.grass3;
                 s=SuiJi();    
                if(s<7)
                 {
                     battle=1;
                     guai=lion;
                     printf("%s扑了过来!\n\n\n",guai.name);
                     BattleAct();
                 }
                 else if(s<9)
                 {
                     battle=1;                    
                     if(strongman_arm)
                     {
                         SlowDisplay("神秘老人:\n\n\n    哈哈,年轻人,做的不错,不过...嘿嘿,你上当啦!巨人之臂我要了,公主你也别想带走!\n\n\n");
                         guai=shitu;
                     printf("%s扑了过来!\n\n\n",guai.name);
                     BattleAct();
                     }
                     else SlowDisplay("神秘老人:\n\n\n    年轻人,你好啊.如果你有巨人之臂,我可以告诉你公主的下落哦~\n\n\n");
                 }
                 else
                 {
                     SlowDisplay("这里安全\n\n\n");
                 }
                 break;
             default:printf("choose map error!\n\n\n");
             }
             break;
         case 2:   ChooseWupin();break;              //显示道具,并可以使用.
         case 3:                                               //对话选项
             if(place_sign==place.bar)
            {
                 SlowDisplay("要和谁说话?\n\n\n1,红发女郎 2,赏金猎人 3,酒吧老板\n\n\n");     //显示对话人物
                switch(scanf("%d",&choose_number),choose_number)
                {
                case 1:
                    SlowDisplay("红发女郎:\n\n\n    吧台边那个Hunter好帅啊!(~脸红~)\n\n\n听说他经常外出打猎,外面的路他应该很熟悉的!\n\n\n");
                    break;
                case 2:
                    if(fang1n<1&&gong1n<1)
                    {
                        SlowDisplay("赏金猎人:\n\n\n    你要救公主啊!好胆量!\n\n\n    不过外面的丛林和草原很险恶,而且越深越危险,这是匕首和布衣,对你会有些帮助的,拿去吧!\n\n\n");
                        printf("%s心想:(哇,这位大叔人真好啊!\n\n\n)",player.name);
                        gong1n++;
                        fang1n++;
                    }
                    else SlowDisplay("赏金猎人:\n\n\n    加油吧,年轻人!\n\n\n    不要被外面丛林和草原所吓倒!\n\n\n");
                    break;
                case 3:
                    printf("要喝点什么?\n\n\n    1,二锅头25金币 HP+20  2,XO酒80金币 HP+50  3,人头马面150金币 HP+100  0,返回\n\n\n");
                    choose_number=1;
                    while(choose_number)
                    {
                         switch(scanf("%d",&choose_number),choose_number)
                         {
                         case 1:if(money<25)
                                {
                                  SlowDisplay("钱不够!");                              
                                }
                                else
                                {
                                  if(player.health+20<=player.max_health)
                                  {
                                      SlowDisplay("HP+20.");
                                      money-=25;
                                      player.health+=20;
                                  }
                                  else
                                  {
                                      SlowDisplay("HP满了");                                    
                                      player.health=player.max_health;
                                  }
                                }
                                break;
                         case 2:if(money<80)
                                {
                                  SlowDisplay("钱不够!");                              
                                }
                                else
                                {
                                  if(player.health+50<=player.max_health)
                                  {
                                      SlowDisplay("HP+50.");
                                      money-=80;
                                      player.health+=50;
                                  }
                                  else
                                  {
                                      SlowDisplay("HP满了");                                    
                                      player.health=player.max_health;
                                  }
                                }
                                break;
                         case 3:if(money<150)
                                {
                                  SlowDisplay("钱不够!");                              
                                }
                                else
                                {
                                  if(player.health+100<=player.max_health)
                                  {
                                      SlowDisplay("HP+100.");
                                      money-=150;
                                      player.health+=100;
                                  }
                                  else
                                  {
                                      SlowDisplay("HP满了");                                    
                                      player.health=player.max_health;
                                  }
                                }
                                break;
                         case 0:SlowDisplay("下次在来!\n");break;
                         default:SlowDisplay("输入错误\n\n\n");
                         }
                    }
                }
             }
             else if(place_sign==place.hotel)
                     SlowDisplay("“老板娘!我...”\n\n\n“我忙着呢,没空理你~”\n\n\n");
             else SlowDisplay("这里好像没人可以聊天\n\n\n");
             break;
         case 4:   DisplayState(); break;             //显示状态
         case 5:                                 //装备
             printf("攻装: 1,匕首:%d个 2,长剑:%d个 3,碧血剑:%d个 4,绝世好剑:%d个\n\n\n",gong1n,gong2n,gong3n,gong4n);
             printf("防装: 5,布衣:%d个 6,铁甲:%d个 7,银甲:%d个   8,黄金圣衣:%d个\t\t0,返回\n\n\n",fang1n,fang2n,fang3n,fang4n);
             SlowDisplay("选择要装备的武器或防具:\n\n\n");
             switch(scanf("%d",&choose_number),choose_number)
             {
             case 1:if(gong1n>=1)
                    {
                        SlowDisplay("拿起了匕首\n\n\n");
                        gong=gong1;
                        strcpy(gongname,"匕首");
                    }
                    else SlowDisplay("你没有匕首可以装备\n\n\n");
                    break;
             case 2:if(gong2n>=1)
                    {
                        SlowDisplay("拿起了长剑\n\n\n");
                        gong=gong2;
                        strcpy(gongname,"长剑");
                    }
                    else SlowDisplay("你没有长剑可以装备\n\n\n");
                    break;
             case 3:if(gong3n>=1)
                    {
                        SlowDisplay("拿起了碧血剑\n\n\n");
                        gong=gong3;
                        strcpy(gongname,"碧血剑");
                    }
                    else SlowDisplay("你没有碧血剑可以装备\n\n\n");
                    break;
             case 4:if(gong4n>=1)
                    {
                        SlowDisplay("拿起了绝世好剑\n\n\n");
                        gong=gong4;
                        strcpy(gongname,"绝世好剑");
                    }
                    else SlowDisplay("你没有绝世好剑可以装备\n\n\n");
                    break;
             case 5:if(fang1n>=1)
                    {
                        SlowDisplay("穿上了布衣\n\n\n");
                        fang=fang1;
                        strcpy(fangname,"布衣");
                    }
                    else SlowDisplay("你没有布衣可以装备\n\n\n");
                    break;
             case 6:if(fang2>=1)
                    {
                        SlowDisplay("穿上了铁甲\n\n\n");
                        fang=fang2;
                        strcpy(fangname,"铁甲");
                    }
                    else SlowDisplay("你没有铁甲可以装备\n\n\n");
                    break;
             case 7:if(fang3n>=1)
                    {
                        SlowDisplay("穿上了银甲\n\n\n");
                        fang=fang3;
                        strcpy(fangname,"银甲");
                    }
                    else SlowDisplay("你没有银甲可以装备\n\n\n");
                    break;
             case 8:if(fang4n>=1)
                    {
                        SlowDisplay("穿上了黄金圣衣\n\n\n");
                        fang=fang4;
                        strcpy(fangname,"黄金圣衣");
                    }
                    else SlowDisplay("你没有黄金圣衣可以装备\n\n\n");
                    break;
             case 0:SlowDisplay("未更换装备\n\n\n");break;
             default:printf("change error!");
             }
             break;
         case 0:
            SlowDisplay("确定推出游戏?(Y/N)\n\n\n");
             getchar();
             proof=getchar();
             if(proof=='y'||proof=='Y')
             {
                 SlowDisplay("数据存储中...");
                 //向文件中更新数据;
                 getchar();
                 SlowDisplay("按回车退出");
                 getchar();
                 return;
             }
             else if(proof=='n'||proof=='N')printf("继续游戏!\n\n\n");
             else SlowDisplay("继续!\n\n\n");
             break;
         default:SlowDisplay("输入错误!\n\n\n");
         }
     }
     }
     void DisplayState()
     {
         printf("%s 攻击力:%d+%d=%d  防御力:%d+%d=%d  HP:%d/%d \n\n\n",player.name,player.attack,gong,player.attack+gong,player.defense,fang,player.defense+fang,player.health,player.max_health);
         printf("武器: %s 防具: %s \n\n\n",gongname,fangname);
         printf("等级:%d  经验:%d/%d 还需要%d经验升级 金币:%d \n\n\n",player.level,player.exp,player.max_exp,player.max_exp-player.exp,money);
     }
     void BattleAct()
     {
         while(1)
         {
             puts("=============================================================================");
             printf("要怎么办?\n\n\n    1,攻击 2,物品 3,查看状态 4,逃跑\n\n\n");
             switch(scanf("%d",&choose_number),choose_number)
             {
             case 1:
                 s=SuiJi();
                 printf("%s攻击! %sHP减少%d\n\n\n",player.name,guai.name,player.attack+s+gong-guai.defense/3);
                 guai.health-=player.attack+s+gong-guai.defense/3;
                 if(AttackResult())return;            //如果攻击有结果(敌人或玩家战死)退出函数
                 else continue;
            case 2: ChooseWupin();break;             //选择物品,可以使用,战斗中允许使用攻击性物品
             case 3:DisplayState();break;             //显示状态
             case 4:
                 s=SuiJi();
                 if(s<4)                               //40%的概率可以逃跑
                 {
                     printf("%s逃跑了~\n\n\n",player.name);
                     battle=0;
                     return;
                 }
                 else printf("%s逃跑失败!\n\n\n",player.name);
                 break;
             default:SlowDisplay("输入错误,重新输入!\n\n\n");
             }
         }
     }
     void SlowDisplay(char *p)
     {
         while(1)
         {
             if(*p!=0)
                 printf("%c",*p++);
             else
                break;
             Sleep(100);
         }
     }

0
傅文彬
傅文彬
新手天翼
新手天翼

#include <iostream>
#include <string>
#include <ctime>
#include <cstdlib>
#include <windows.h>
#include <conio.h>
using namespace std;
int block00[4][4] = { { 10,0,0,0 },{ 1,1,1,1 },{ 0,0,0,0 },{ 0,0,0,0 } };
int block01[4][4] = { { 11,0,1,0 },{ 0,0,1,0 },{ 0,0,1,0 },{ 0,0,1,0 } };
int block02[4][4] = { { 12,0,0,0 },{ 0,0,0,0 },{ 1,1,1,0 },{ 0,1,0,0 } };
int block03[4][4] = { { 13,0,0,0 },{ 0,1,0,0 },{ 1,1,0,0 },{ 0,1,0,0 } };
int block04[4][4] = { { 14,0,0,0 },{ 0,0,0,0 },{ 0,1,0,0 },{ 1,1,1,0 } };
int block05[4][4] = { { 15,0,0,0 },{ 0,1,0,0 },{ 0,1,1,0 },{ 0,1,0,0 } };
int block06[4][4] = { { 16,0,0,0 },{ 0,0,0,0 },{ 1,1,1,0 },{ 1,0,0,0 } };
int block07[4][4] = { { 17,0,0,0 },{ 1,1,0,0 },{ 0,1,0,0 },{ 0,1,0,0 } };
int block08[4][4] = { { 18,0,0,0 },{ 0,0,0,0 },{ 0,0,1,0 },{ 1,1,1,0 } };
int block09[4][4] = { { 19,0,0,0 },{ 0,1,0,0 },{ 0,1,0,0 },{ 0,1,1,0 } };
int block10[4][4] = { { 20,0,0,0 },{ 0,0,0,0 },{ 1,1,1,0 },{ 0,0,1,0 } };
int block11[4][4] = { { 21,0,0,0 },{ 0,1,0,0 },{ 0,1,0,0 },{ 1,1,0,0 } };
int block12[4][4] = { { 22,0,0,0 },{ 0,0,0,0 },{ 1,0,0,0 },{ 1,1,1,0 } };
int block13[4][4] = { { 23,0,0,0 },{ 0,1,1,0 },{ 0,1,0,0 },{ 0,1,0,0 } };
int block14[4][4] = { { 24,0,0,0 },{ 0,0,0,0 },{ 0,1,1,0 },{ 1,1,0,0 } };
int block15[4][4] = { { 25,0,0,0 },{ 1,0,0,0 },{ 1,1,0,0 },{ 0,1,0,0 } };
int block16[4][4] = { { 26,0,0,0 },{ 0,0,0,0 },{ 1,1,0,0 },{ 0,1,1,0 } };
int block17[4][4] = { { 27,0,0,0 },{ 0,0,1,0 },{ 0,1,1,0 },{ 0,1,0,0 } };
int block18[4][4] = { { 28,0,0,0 },{ 0,0,0,0 },{ 1,1,0,0 },{ 1,1,0,0 } };

void initialWindow(HANDLE hOut);//初始化窗口
void initialPrint(HANDLE hOut);//初始化界面
void gotoXY(HANDLE hOut, int x, int y);//移动光标
void roundBlock(HANDLE hOut, int block[4][4]);//随机生成方块并打印到下一个方块位置
bool collisionDetection(int block[4][4], int map[21][12], int x, int y);//检测碰撞
void printBlock(HANDLE hOut, int block[4][4], int x, int y);//打印方块
void clearBlock(HANDLE hOut, int block[4][4], int x, int y);//消除方块
void myLeft(HANDLE hOut, int block[4][4], int map[21][12], int x, int &y);//左移
void myRight(HANDLE hOut, int block[4][4], int map[21][12], int x, int &y);//右移
void myUp(HANDLE hOut, int block[4][4], int map[21][12], int x, int &y);//顺时针旋转90度
int myDown(HANDLE hOut, int block[4][4], int map[21][12], int &x, int y);//加速下落
void myStop(HANDLE hOut, int block[4][4]);//游戏暂停
void gameOver(HANDLE hOut, int block[4][4], int map[21][12]);//游戏结束
void eliminateRow(HANDLE hOut, int map[21][12], int &val, int &fraction, int &checkpoint);//判断是否能消行并更新分值
int main()
{
    int map[21][12];
    int blockA[4][4];//候选区的方块
    int blockB[4][4];//下落中的方块
    int positionX, positionY;//方块左上角的坐标
    bool check;//检查方块还能不能下落
    char key;//用来存储按键
    int val;//用来控制下落速度
    int fraction;//用来存储得分
    int checkpoint;//用来存储关卡
    int times;
    HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);//获取标准输出设备句柄
    initialWindow(hOut);
initial:
    gotoXY(hOut, 0, 0);
    initialPrint(hOut);
    check = true;
    val = 50;
    fraction = 0;
    checkpoint = 1;
    times = val;
    for (int i = 0; i < 20; ++i)
    {
        for (int j = 1; j < 11; ++j)
        {
            map[i][j] = 0;
        }
    }
    for (int i = 0; i < 20; ++i)
    {
        map[i][0] = map[i][11] = 1;
    }
    for (int i = 0; i < 12; ++i)
    {
        map[20][i] = 1;
    }

    srand((unsigned)time(NULL));
    roundBlock(hOut, blockA);
    while (true)
    {
        if (check)
        {
            eliminateRow(hOut, map, val, fraction, checkpoint);
            check = false;
            positionX = -3;
            positionY = 4;
            if (collisionDetection(blockA, map, positionX, positionY))
            {
                for (int i = 0; i < 4; ++i)
                {
                    for (int j = 0; j < 4; ++j)
                    {
                        blockB[i][j] = blockA[i][j];
                    }
                }
                roundBlock(hOut, blockA);
            }
            else
            {
                gameOver(hOut, blockA, map);
                goto initial;
            }
        }
        printBlock(hOut, blockB, positionX, positionY);
        if (_kbhit())
        {
            key = _getch();
            switch (key)
            {
            case 72:
                myUp(hOut, blockB, map, positionX, positionY);
                break;
            case 75:
                myLeft(hOut, blockB, map, positionX, positionY);
                break;
            case 77:
                myRight(hOut, blockB, map, positionX, positionY);
                break;
            case 80:
                switch (myDown(hOut, blockB, map, positionX, positionY))
                {
                case 0:
                    check = false;
                    break;
                case 1:
                    check = true;
                    break;
                case 2:
                    gameOver(hOut, blockB, map);
                    goto initial;
                default:
                    break;
                }
                break;
            case 32:
                myStop(hOut, blockA);
                break;
            case 27:
                exit(0);
            default:
                break;
            }
        }
        Sleep(20);
        if (0 == --times)
        {
            switch (myDown(hOut, blockB, map, positionX, positionY))
            {
            case 0:
                check = false;
                break;
            case 1:
                check = true;
                break;
            case 2:
                gameOver(hOut, blockB, map);
                goto initial;
            default:
                break;
            }
            times = val;
        }
    }
    cin.get();
    return 0;
}

void initialWindow(HANDLE hOut)
{
    SetConsoleTitle("俄罗斯方块");
    COORD size = { 80, 25 };
    SetConsoleScreenBufferSize(hOut, size);
    SMALL_RECT rc = { 0, 0, 79, 24 };
    SetConsoleWindowInfo(hOut, true, &rc);
    CONSOLE_CURSOR_INFO cursor_info = { 1, 0 };
    SetConsoleCursorInfo(hOut, &cursor_info);
}

void initialPrint(HANDLE hOut)
{
    SetConsoleTextAttribute(hOut, FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);
    for (int i = 0; i < 20; ++i)
    {
        cout << "■                    ■☆                      ☆" << endl;
    }
    gotoXY(hOut, 26, 0);
    cout << "☆☆☆☆☆☆☆☆☆☆☆";
    gotoXY(hOut, 0, 20);
    cout << "■■■■■■■■■■■■☆☆☆☆☆☆☆☆☆☆☆☆☆";
    gotoXY(hOut, 26, 1);
    cout << "分    数:      ";
    gotoXY(hOut, 26, 2);
    cout << "关    卡:      ";
    gotoXY(hOut, 26, 4);
    cout << "下一方块:";
    gotoXY(hOut, 26, 9);
    cout << "操作方法:";
    gotoXY(hOut, 30, 11);
    cout << "↑:旋转 ↓:速降";
    gotoXY(hOut, 30, 12);
    cout << "→:右移 ←:左移";
    gotoXY(hOut, 30, 13);
    cout << "空格键:开始/暂停";
    gotoXY(hOut, 30, 14);
    cout << "Esc 键:退出";
    gotoXY(hOut, 26, 16);
    cout << "关    于:";
    gotoXY(hOut, 30, 18);
    cout << "俄罗斯方块V1.0";
    gotoXY(hOut, 35, 19);
    cout << "作者:李国良";
}

void gotoXY(HANDLE hOut, int x, int y)
{
    COORD pos;
    pos.X = x;
    pos.Y = y;
    SetConsoleCursorPosition(hOut, pos);
}

void roundBlock(HANDLE hOut, int block[4][4])
{
    clearBlock(hOut, block, 5, 15);
    switch (rand() % 19)
    {
    case 0:
        for (int i = 0; i < 4; ++i)
        {
            for (int j = 0; j < 4; ++j)
            {
                block[i][j] = block00[i][j];
            }
        }
        break;
    case 1:
        for (int i = 0; i < 4; ++i)
        {
            for (int j = 0; j < 4; ++j)
            {
                block[i][j] = block01[i][j];
            }
        }
        break;
    case 2:
        for (int i = 0; i < 4; ++i)
        {
            for (int j = 0; j < 4; ++j)
            {
                block[i][j] = block02[i][j];
            }
        }
        break;
    case 3:
        for (int i = 0; i < 4; ++i)
        {
            for (int j = 0; j < 4; ++j)
            {
                block[i][j] = block03[i][j];
            }
        }
        break;
    case 4:
        for (int i = 0; i < 4; ++i)
        {
            for (int j = 0; j < 4; ++j)
            {
                block[i][j] = block04[i][j];
            }
        }
        break;
    case 5:
        for (int i = 0; i < 4; ++i)
        {
            for (int j = 0; j < 4; ++j)
            {
                block[i][j] = block05[i][j];
            }
        }
        break;
    case 6:
        for (int i = 0; i < 4; ++i)
        {
            for (int j = 0; j < 4; ++j)
            {
                block[i][j] = block06[i][j];
            }
        }
        break;
    case 7:
        for (int i = 0; i < 4; ++i)
        {
            for (int j = 0; j < 4; ++j)
            {
                block[i][j] = block07[i][j];
            }
        }
        break;
    case 8:
        for (int i = 0; i < 4; ++i)
        {
            for (int j = 0; j < 4; ++j)
            {
                block[i][j] = block08[i][j];
            }
        }
        break;
    case 9:
        for (int i = 0; i < 4; ++i)
        {
            for (int j = 0; j < 4; ++j)
            {
                block[i][j] = block09[i][j];
            }
        }
        break;
    case 10:
        for (int i = 0; i < 4; ++i)
        {
            for (int j = 0; j < 4; ++j)
            {
                block[i][j] = block10[i][j];
            }
        }
        break;
    case 11:
        for (int i = 0; i < 4; ++i)
        {
            for (int j = 0; j < 4; ++j)
            {
                block[i][j] = block11[i][j];
            }
        }
        break;
    case 12:
        for (int i = 0; i < 4; ++i)
        {
            for (int j = 0; j < 4; ++j)
            {
                block[i][j] = block12[i][j];
            }
        }
        break;
    case 13:
        for (int i = 0; i < 4; ++i)
        {
            for (int j = 0; j < 4; ++j)
            {
                block[i][j] = block13[i][j];
            }
        }
        break;
    case 14:
        for (int i = 0; i < 4; ++i)
        {
            for (int j = 0; j < 4; ++j)
            {
                block[i][j] = block14[i][j];
            }
        }
        break;
    case 15:
        for (int i = 0; i < 4; ++i)
        {
            for (int j = 0; j < 4; ++j)
            {
                block[i][j] = block15[i][j];
            }
        }
        break;
    case 16:
        for (int i = 0; i < 4; ++i)
        {
            for (int j = 0; j < 4; ++j)
            {
                block[i][j] = block16[i][j];
            }
        }
        break;
    case 17:
        for (int i = 0; i < 4; ++i)
        {
            for (int j = 0; j < 4; ++j)
            {
                block[i][j] = block17[i][j];
            }
        }
        break;
    case 18:
        for (int i = 0; i < 4; ++i)
        {
            for (int j = 0; j < 4; ++j)
            {
                block[i][j] = block18[i][j];
            }
        }
        break;
    default:
        break;
    }
    printBlock(hOut, block, 5, 15);
}

bool collisionDetection(int block[4][4], int map[21][12], int x, int y)
{
    for (int i = 0; i < 4; ++i)
    {
        for (int j = 0; j < 4; ++j)
        {
            if (x + i >= 0 && y + j >= 0 && map[x + i][y + j] == 1 && block[i][j] == 1)
            {
                return false;
            }
        }
    }
    return true;
}

void printBlock(HANDLE hOut, int block[4][4], int x, int y)
{
    switch (block[0][0])
    {
    case 10:
    case 11:
        SetConsoleTextAttribute(hOut, FOREGROUND_GREEN);
        break;
    case 12:
    case 13:
    case 14:
    case 15:
        SetConsoleTextAttribute(hOut, FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_INTENSITY);
        break;
    case 16:
    case 17:
    case 18:
    case 19:
        SetConsoleTextAttribute(hOut, FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_INTENSITY);
        break;
    case 20:
    case 21:
    case 22:
    case 23:
        SetConsoleTextAttribute(hOut, FOREGROUND_RED | FOREGROUND_BLUE | FOREGROUND_INTENSITY);
        break;
    case 24:
    case 25:
        SetConsoleTextAttribute(hOut, FOREGROUND_GREEN | FOREGROUND_INTENSITY);
        break;
    case 26:
    case 27:
        SetConsoleTextAttribute(hOut, FOREGROUND_BLUE | FOREGROUND_INTENSITY);
        break;
    case 28:
        SetConsoleTextAttribute(hOut, FOREGROUND_RED | FOREGROUND_INTENSITY);
        break;
    default:
        break;
    }
    for (int i = 0; i < 4; ++i)
    {
        if (i + x >= 0)
        {
            for (int j = 0; j < 4; ++j)
            {
                if (block[i][j] == 1)
                {

                    gotoXY(hOut, 2 * (y + j), x + i);
                    cout << "■";
                }
            }
        }
    }
}

void clearBlock(HANDLE hOut, int block[4][4], int x, int y)
{
    for (int i = 0; i < 4; ++i)
    {
        if (i + x >= 0)
        {
            for (int j = 0; j < 4; ++j)
            {
                if (block[i][j] == 1)
                {
                    gotoXY(hOut, 2 * (y + j), x + i);
                    cout << "  ";
                }
            }
        }
    }
}

void gameOver(HANDLE hOut, int block[4][4], int map[21][12])
{
    SetConsoleTextAttribute(hOut, FOREGROUND_RED | FOREGROUND_INTENSITY);
    gotoXY(hOut, 9, 8);
    cout << "GAME OVER";
    gotoXY(hOut, 8, 9);
    cout << "空格键:重来";
    gotoXY(hOut, 8, 10);
    cout << "ESC键:退出";
    char key;
    while (true)
    {
        key = _getch();
        if (key == 32)
        {
            return;
        }
        if (key == 27)
        {
            exit(0);
        }
    }
}

int myDown(HANDLE hOut, int block[4][4], int map[21][12], int &x, int y)
{
    if (collisionDetection(block, map, x + 1, y))
    {
        clearBlock(hOut, block, x, y);
        ++x;
        return 0;
    }
    if (x < 0)
    {
        return 2;
    }
    for (int i = 0; i < 4; ++i)
    {
        for (int j = 0; j < 4; ++j)
        {
            if (block[i][j] == 1)
            {
                map[x + i][y + j] = 1;
                SetConsoleTextAttribute(hOut, FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_INTENSITY);
                gotoXY(hOut, 2 * (y + j), x + i);
                cout << "■";
            }
        }
    }
    return 1;
}

void myLeft(HANDLE hOut, int block[4][4], int map[21][12], int x, int &y)
{
    if (collisionDetection(block, map, x, y - 1))
    {
        clearBlock(hOut, block, x, y);
        --y;
    }
}

void myRight(HANDLE hOut, int block[4][4], int map[21][12], int x, int &y)
{
    if (collisionDetection(block, map, x, y + 1))
    {
        clearBlock(hOut, block, x, y);
        ++y;
    }
}

void myUp(HANDLE hOut, int block[4][4], int map[21][12], int x, int &y)
{
    switch (block[0][0])
    {
    case 10:
        if (collisionDetection(block01, map, x, y))
        {
            clearBlock(hOut, block, x, y);
            for (int i = 0; i < 4; ++i)
            {
                for (int j = 0; j < 4; ++j)
                {
                    block[i][j] = block01[i][j];
                }
            }
        }
        break;
    case 11:
        if (collisionDetection(block00, map, x, y))
        {
            clearBlock(hOut, block, x, y);
            for (int i = 0; i < 4; ++i)
            {
                for (int j = 0; j < 4; ++j)
                {
                    block[i][j] = block00[i][j];
                }
            }
        }
        else if (collisionDetection(block00, map, x, y - 1))
        {
            clearBlock(hOut, block, x, y);
            for (int i = 0; i < 4; ++i)
            {
                for (int j = 0; j < 4; ++j)
                {
                    block[i][j] = block00[i][j];
                }
            }
            --y;
        }
        else if (collisionDetection(block00, map, x, y + 1))
        {
            clearBlock(hOut, block, x, y);
            for (int i = 0; i < 4; ++i)
            {
                for (int j = 0; j < 4; ++j)
                {
                    block[i][j] = block00[i][j];
                }
            }
            ++y;
        }
        else if (collisionDetection(block00, map, x, y - 2))
        {
            clearBlock(hOut, block, x, y);
            for (int i = 0; i < 4; ++i)
            {
                for (int j = 0; j < 4; ++j)
                {
                    block[i][j] = block00[i][j];
                }
            }
            y = y - 2;
        }
        else if (collisionDetection(block00, map, x, y + 2))
        {
            clearBlock(hOut, block, x, y);
            for (int i = 0; i < 4; ++i)
            {
                for (int j = 0; j < 4; ++j)
                {
                    block[i][j] = block00[i][j];
                }
            }
            y = y + 2;
        }
        break;
    case 12:
        if (collisionDetection(block03, map, x, y))
        {
            clearBlock(hOut, block, x, y);
            for (int i = 0; i < 4; ++i)
            {
                for (int j = 0; j < 4; ++j)
                {
                    block[i][j] = block03[i][j];
                }
            }
        }
        else if (collisionDetection(block03, map, x, y - 1))
        {
            clearBlock(hOut, block, x, y);
            for (int i = 0; i < 4; ++i)
            {
                for (int j = 0; j < 4; ++j)
                {
                    block[i][j] = block03[i][j];
                }
            }
            --y;
        }
        else if (collisionDetection(block03, map, x, y + 1))
        {
            clearBlock(hOut, block, x, y);
            for (int i = 0; i < 4; ++i)
            {
                for (int j = 0; j < 4; ++j)
                {
                    block[i][j] = block03[i][j];
                }
            }
            ++y;
        }
        break;
    case 13:
        if (collisionDetection(block04, map, x, y))
        {
            clearBlock(hOut, block, x, y);
            for (int i = 0; i < 4; ++i)
            {
                for (int j = 0; j < 4; ++j)
                {
                    block[i][j] = block04[i][j];
                }
            }
        }
        else if (collisionDetection(block04, map, x, y - 1))
        {
            clearBlock(hOut, block, x, y);
            for (int i = 0; i < 4; ++i)
            {
                for (int j = 0; j < 4; ++j)
                {
                    block[i][j] = block04[i][j];
                }
            }
            --y;
        }
        else if (collisionDetection(block04, map, x, y + 1))
        {
            clearBlock(hOut, block, x, y);
            for (int i = 0; i < 4; ++i)
            {
                for (int j = 0; j < 4; ++j)
                {
                    block[i][j] = block04[i][j];
                }
            }
            ++y;
        }
        break;
    case 14:
        if (collisionDetection(block05, map, x, y))
        {
            clearBlock(hOut, block, x, y);
            for (int i = 0; i < 4; ++i)
            {
                for (int j = 0; j < 4; ++j)
                {
                    block[i][j] = block05[i][j];
                }
            }
        }
        else if (collisionDetection(block05, map, x, y - 1))
        {
            clearBlock(hOut, block, x, y);
            for (int i = 0; i < 4; ++i)
            {
                for (int j = 0; j < 4; ++j)
                {
                    block[i][j] = block05[i][j];
                }
            }
            --y;
        }
        else if (collisionDetection(block05, map, x, y + 1))
        {
            clearBlock(hOut, block, x, y);
            for (int i = 0; i < 4; ++i)
            {
                for (int j = 0; j < 4; ++j)
                {
                    block[i][j] = block05[i][j];
                }
            }
            ++y;
        }
        break;
    case 15:
        if (collisionDetection(block02, map, x, y))
        {
            clearBlock(hOut, block, x, y);
            for (int i = 0; i < 4; ++i)
            {
                for (int j = 0; j < 4; ++j)
                {
                    block[i][j] = block02[i][j];
                }
            }
        }
        else if (collisionDetection(block02, map, x, y - 1))
        {
            clearBlock(hOut, block, x, y);
            for (int i = 0; i < 4; ++i)
            {
                for (int j = 0; j < 4; ++j)
                {
                    block[i][j] = block02[i][j];
                }
            }
            --y;
        }
        else if (collisionDetection(block02, map, x, y + 1))
        {
            clearBlock(hOut, block, x, y);
            for (int i = 0; i < 4; ++i)
            {
                for (int j = 0; j < 4; ++j)
                {
                    block[i][j] = block02[i][j];
                }
            }
            ++y;
        }
        break;

    case 16:
        if (collisionDetection(block07, map, x, y))
        {
            clearBlock(hOut, block, x, y);
            for (int i = 0; i < 4; ++i)
            {
                for (int j = 0; j < 4; ++j)
                {
                    block[i][j] = block07[i][j];
                }
            }
        }
        else if (collisionDetection(block07, map, x, y - 1))
        {
            clearBlock(hOut, block, x, y);
            for (int i = 0; i < 4; ++i)
            {
                for (int j = 0; j < 4; ++j)
                {
                    block[i][j] = block07[i][j];
                }
            }
            --y;
        }
        else if (collisionDetection(block07, map, x, y + 1))
        {
            clearBlock(hOut, block, x, y);
            for (int i = 0; i < 4; ++i)
            {
                for (int j = 0; j < 4; ++j)
                {
                    block[i][j] = block07[i][j];
                }
            }
            ++y;
        }
        break;
    case 17:
        if (collisionDetection(block08, map, x, y))
        {
            clearBlock(hOut, block, x, y);
            for (int i = 0; i < 4; ++i)
            {
                for (int j = 0; j < 4; ++j)
                {
                    block[i][j] = block08[i][j];
                }
            }
        }
        else if (collisionDetection(block08, map, x, y - 1))
        {
            clearBlock(hOut, block, x, y);
            for (int i = 0; i < 4; ++i)
            {
                for (int j = 0; j < 4; ++j)
                {
                    block[i][j] = block08[i][j];
                }
            }
            --y;
        }
        else if (collisionDetection(block08, map, x, y + 1))
        {
            clearBlock(hOut, block, x, y);
            for (int i = 0; i < 4; ++i)
            {
                for (int j = 0; j < 4; ++j)
                {
                    block[i][j] = block08[i][j];
                }
            }
            ++y;
        }
        break;
    case 18:
        if (collisionDetection(block09, map, x, y))
        {
            clearBlock(hOut, block, x, y);
            for (int i = 0; i < 4; ++i)
            {
                for (int j = 0; j < 4; ++j)
                {
                    block[i][j] = block09[i][j];
                }
            }
        }
        else if (collisionDetection(block09, map, x, y - 1))
        {
            clearBlock(hOut, block, x, y);
            for (int i = 0; i < 4; ++i)
            {
                for (int j = 0; j < 4; ++j)
                {
                    block[i][j] = block09[i][j];
                }
            }
            --y;
        }
        else if (collisionDetection(block09, map, x, y + 1))
        {
            clearBlock(hOut, block, x, y);
            for (int i = 0; i < 4; ++i)
            {
                for (int j = 0; j < 4; ++j)
                {
                    block[i][j] = block09[i][j];
                }
            }
            ++y;
        }
        break;
    case 19:
        if (collisionDetection(block06, map, x, y))
        {
            clearBlock(hOut, block, x, y);
            for (int i = 0; i < 4; ++i)
            {
                for (int j = 0; j < 4; ++j)
                {
                    block[i][j] = block06[i][j];
                }
            }
        }
        else if (collisionDetection(block06, map, x, y - 1))
        {
            clearBlock(hOut, block, x, y);
            for (int i = 0; i < 4; ++i)
            {
                for (int j = 0; j < 4; ++j)
                {
                    block[i][j] = block06[i][j];
                }
            }
            --y;
        }
        else if (collisionDetection(block06, map, x, y + 1))
        {
            clearBlock(hOut, block, x, y);
            for (int i = 0; i < 4; ++i)
            {
                for (int j = 0; j < 4; ++j)
                {
                    block[i][j] = block06[i][j];
                }
            }
            ++y;
        }
        break;
    case 20:
        if (collisionDetection(block11, map, x, y))
        {
            clearBlock(hOut, block, x, y);
            for (int i = 0; i < 4; ++i)
            {
                for (int j = 0; j < 4; ++j)
                {
                    block[i][j] = block11[i][j];
                }
            }
        }
        else if (collisionDetection(block11, map, x, y - 1))
        {
            clearBlock(hOut, block, x, y);
            for (int i = 0; i < 4; ++i)
            {
                for (int j = 0; j < 4; ++j)
                {
                    block[i][j] = block11[i][j];
                }
            }
            --y;
        }
        else if (collisionDetection(block11, map, x, y + 1))
        {
            clearBlock(hOut, block, x, y);
            for (int i = 0; i < 4; ++i)
            {
                for (int j = 0; j < 4; ++j)
                {
                    block[i][j] = block11[i][j];
                }
            }
            ++y;
        }
        break;
    case 21:
        if (collisionDetection(block12, map, x, y))
        {
            clearBlock(hOut, block, x, y);
            for (int i = 0; i < 4; ++i)
            {
                for (int j = 0; j < 4; ++j)
                {
                    block[i][j] = block12[i][j];
                }
            }
        }
        else if (collisionDetection(block12, map, x, y - 1))
        {
            clearBlock(hOut, block, x, y);
            for (int i = 0; i < 4; ++i)
            {
                for (int j = 0; j < 4; ++j)
                {
                    block[i][j] = block12[i][j];
                }
            }
            --y;
        }
        else if (collisionDetection(block12, map, x, y + 1))
        {
            clearBlock(hOut, block, x, y);
            for (int i = 0; i < 4; ++i)
            {
                for (int j = 0; j < 4; ++j)
                {
                    block[i][j] = block12[i][j];
                }
            }
            ++y;
        }
        break;
    case 22:
        if (collisionDetection(block13, map, x, y))
        {
            clearBlock(hOut, block, x, y);
            for (int i = 0; i < 4; ++i)
            {
                for (int j = 0; j < 4; ++j)
                {
                    block[i][j] = block13[i][j];
                }
            }
        }
        else if (collisionDetection(block13, map, x, y - 1))
        {
            clearBlock(hOut, block, x, y);
            for (int i = 0; i < 4; ++i)
            {
                for (int j = 0; j < 4; ++j)
                {
                    block[i][j] = block13[i][j];
                }
            }
            --y;
        }
        else if (collisionDetection(block13, map, x, y + 1))
        {
            clearBlock(hOut, block, x, y);
            for (int i = 0; i < 4; ++i)
            {
                for (int j = 0; j < 4; ++j)
                {
                    block[i][j] = block13[i][j];
                }
            }
            ++y;
        }
        break;
    case 23:
        if (collisionDetection(block10, map, x, y))
        {
            clearBlock(hOut, block, x, y);
            for (int i = 0; i < 4; ++i)
            {
                for (int j = 0; j < 4; ++j)
                {
                    block[i][j] = block10[i][j];
                }
            }
        }
        else if (collisionDetection(block10, map, x, y - 1))
        {
            clearBlock(hOut, block, x, y);
            for (int i = 0; i < 4; ++i)
            {
                for (int j = 0; j < 4; ++j)
                {
                    block[i][j] = block10[i][j];
                }
            }
            --y;
        }
        else if (collisionDetection(block10, map, x, y + 1))
        {
            clearBlock(hOut, block, x, y);
            for (int i = 0; i < 4; ++i)
            {
                for (int j = 0; j < 4; ++j)
                {
                    block[i][j] = block10[i][j];
                }
            }
            ++y;
        }
        break;
    case 24:
        if (collisionDetection(block15, map, x, y))
        {
            clearBlock(hOut, block, x, y);
            for (int i = 0; i < 4; ++i)
            {
                for (int j = 0; j < 4; ++j)
                {
                    block[i][j] = block15[i][j];
                }
            }
        }
        else if (collisionDetection(block15, map, x, y - 1))
        {
            clearBlock(hOut, block, x, y);
            for (int i = 0; i < 4; ++i)
            {
                for (int j = 0; j < 4; ++j)
                {
                    block[i][j] = block15[i][j];
                }
            }
            --y;
        }
        else if (collisionDetection(block15, map, x, y + 1))
        {
            clearBlock(hOut, block, x, y);
            for (int i = 0; i < 4; ++i)
            {
                for (int j = 0; j < 4; ++j)
                {
                    block[i][j] = block15[i][j];
                }
            }
            ++y;
        }
        break;
    case 25:
        if (collisionDetection(block14, map, x, y))
        {
            clearBlock(hOut, block, x, y);
            for (int i = 0; i < 4; ++i)
            {
                for (int j = 0; j < 4; ++j)
                {
                    block[i][j] = block14[i][j];
                }
            }
        }
        else if (collisionDetection(block14, map, x, y - 1))
        {
            clearBlock(hOut, block, x, y);
            for (int i = 0; i < 4; ++i)
            {
                for (int j = 0; j < 4; ++j)
                {
                    block[i][j] = block14[i][j];
                }
            }
            --y;
        }
        else if (collisionDetection(block14, map, x, y + 1))
        {
            clearBlock(hOut, block, x, y);
            for (int i = 0; i < 4; ++i)
            {
                for (int j = 0; j < 4; ++j)
                {
                    block[i][j] = block14[i][j];
                }
            }
            ++y;
        }
        break;
    case 26:
        if (collisionDetection(block17, map, x, y))
        {
            clearBlock(hOut, block, x, y);
            for (int i = 0; i < 4; ++i)
            {
                for (int j = 0; j < 4; ++j)
                {
                    block[i][j] = block17[i][j];
                }
            }
        }
        else if (collisionDetection(block17, map, x, y - 1))
        {
            clearBlock(hOut, block, x, y);
            for (int i = 0; i < 4; ++i)
            {
                for (int j = 0; j < 4; ++j)
                {
                    block[i][j] = block17[i][j];
                }
            }
            --y;
        }
        else if (collisionDetection(block17, map, x, y + 1))
        {
            clearBlock(hOut, block, x, y);
            for (int i = 0; i < 4; ++i)
            {
                for (int j = 0; j < 4; ++j)
                {
                    block[i][j] = block17[i][j];
                }
            }
            ++y;
        }
        break;
    case 27:
        if (collisionDetection(block16, map, x, y))
        {
            clearBlock(hOut, block, x, y);
            for (int i = 0; i < 4; ++i)
            {
                for (int j = 0; j < 4; ++j)
                {
                    block[i][j] = block16[i][j];
                }
            }
        }
        else if (collisionDetection(block16, map, x, y - 1))
        {
            clearBlock(hOut, block, x, y);
            for (int i = 0; i < 4; ++i)
            {
                for (int j = 0; j < 4; ++j)
                {
                    block[i][j] = block16[i][j];
                }
            }
            --y;
        }
        else if (collisionDetection(block16, map, x, y + 1))
        {
            clearBlock(hOut, block, x, y);
            for (int i = 0; i < 4; ++i)
            {
                for (int j = 0; j < 4; ++j)
                {
                    block[i][j] = block16[i][j];
                }
            }
            ++y;
        }
        break;
    default:
        break;
    }
}

void myStop(HANDLE hOut, int block[4][4])
{
    clearBlock(hOut, block, 5, 15);
    SetConsoleTextAttribute(hOut, FOREGROUND_RED | FOREGROUND_INTENSITY);
    gotoXY(hOut, 30, 7);
    cout << "游戏暂停";
    char key;
    while (true)
    {
        key = _getch();
        if (key == 32)
        {
            gotoXY(hOut, 30, 7);
            cout << "        ";
            printBlock(hOut, block, 5, 15);
            return;
        }
        if (key == 27)
        {
            exit(0);
        }
    }
}

void eliminateRow(HANDLE hOut, int map[21][12], int &val, int &fraction, int &checkpoint)
{
    SetConsoleTextAttribute(hOut, FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_INTENSITY);
    for (int i = 19; i >= 0; --i)
    {
        int x = 0;
        for (int j = 1; j < 11; ++j)
        {
            x += map[i][j];
        }
        if (x == 10)
        {
            fraction += 100;
            if (val > 1 && fraction / 1000 + 1 != checkpoint)
            {
                checkpoint = fraction / 1000 + 1;
                val -= 5;
            }
            for (int m = i; m > 0; --m)
            {
                for (int n = 1; n < 11; ++n)
                {
                    map[m][n] = map[m - 1][n];
                    gotoXY(hOut, 2 * n, m);
                    if (map[m][n] == 1)
                    {
                        cout << "■";
                    }
                    else
                    {
                        cout << "  ";
                    }
                }
            }
            ++i;
        }
    }
    gotoXY(hOut, 36, 1);
    cout << fraction;
    gotoXY(hOut, 36, 2);
    cout << checkpoint;
}

0
傅文彬
傅文彬
新手天翼
新手天翼

#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#include<time.h>
#include<Windows.h>
#define PR_Box printf("■")
#define PR_Gold printf("★")
#define PR_Ag printf("☆")
#define PR_FBird printf("Ю")
#define PR_DBird printf("Ф")
#define PR_Land printf("┳┳┯")
#define PR_Bg_TL printf("╔")
#define PR_Bg_TR printf("╗")
#define PR_Bg_DL printf("╚")
#define PR_Bg_DR printf("╝")
#define PR_Bg_X printf("═")
#define PR_Bg_Y printf("║")
#define PR_Blank printf(" ");
int Grade = 1, C_Gold = 0, C_Ag = 0, Score = 0, Delay_time = 1000, Max_blank = 9, Distance = 18;
struct Birds
{
int x, y;
int condition;
};
Birds *Bird = (Birds*)malloc(sizeof(Birds));
struct Bg
{
int x, y;
int l_blank;
int reward[9];
Bg *pri;
Bg *next;
};
Bg *Bg1 = new Bg[sizeof(Bg)];
void Position(int x, int y)
{
COORD pos = { x - 1, y - 1 };
HANDLE Out = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleCursorPosition(Out, pos);
}
void CreatBird()
{
Bird->x = 41;
Bird->y = 10;
Bird->condition = 0;
}
void CreatBg()
{
Bg *Bg2 = (Bg*)malloc(sizeof(Bg));
Bg1->x = 90; Bg1->y = 8;
Bg2->x = Bg1->x + Distance; Bg2->y = 9;
Bg1->l_blank = Max_blank - Grade;
Bg2->l_blank = Max_blank - Grade;
Bg1->next = Bg2;
Bg1->pri = Bg2;
Bg2->next = Bg1;
Bg2->pri = Bg1;
}
void InsertBg(Bg *p)
{
int temp;
Bg *Bgs = (Bg*)malloc(sizeof(Bg));
Bgs->x = p->pri->x + Distance;
Bgs->l_blank = Max_blank - Grade;
srand((int)time(0));
temp = rand();
if (temp % 2 == 0)//++
{
if ((temp % 4 + p->pri->y + Max_blank - Grade)<21)
Bgs->y = p->pri->y + temp % 4;
else
Bgs->y = p->pri->y;
}
else
{
if ((p->pri->y - temp % 4)>2)
Bgs->y = p->pri->y - temp % 4;
else
Bgs->y = p->pri->y;
}
Bgs->pri = p->pri;
Bgs->next = p;
p->pri->next = Bgs;
p->pri = Bgs;
}
void Check_Bg(Bg *q)
{
Bg *p = q; int i = 0, temp;
while (++i <= 5)
{
if (p->x>-4)
p = p->next;
else
{
srand((int)time(0));
temp = rand();
if (temp % 2 == 0)//++
{
if ((temp % 4 + p->y + Max_blank - Grade)<21)
p->y = p->y + temp % 4;
else
p->y = p->y;
p->x = p->pri->x + Distance;
p->l_blank = Max_blank - Grade;
}
else
{
if ((p->y - temp % 4)>2)
p->y = p->y - temp % 4;
else
p->y = p->y;
p->x = p->pri->x + Distance;
p->l_blank = Max_blank - Grade;
}
}
}
}
void Loop_Bg(Bg *q)
{
Bg *p = q; int i = 0;
while (++i <= 5)
{
p->x = p->x - 1;
p = p->next;
if (Bird->x == p->x)
{
Score += 1;
if (Score % 4 == 0 && Grade<4)
Grade++;
}
}
}
void Prt_Bg(Bg *q)
{
Bg *p = q; int i = 0, k, j;
while (++i <= 5)
{
if (p->x>0 && p->x <= 78)
{
for (k = 2; k<p->y; k++)
{
Position(p->x + 1, k);
PR_Box; PR_Box; PR_Blank
}
Position(p->x, p->y);
PR_Box; PR_Box; PR_Box; PR_Blank;
Position(p->x, p->y + p->l_blank);
PR_Box; PR_Box; PR_Box; PR_Blank;
k = k + p->l_blank + 1;
for (k; k <= 22; k++)
{
Position(p->x + 1, k);
PR_Box; PR_Box; PR_Blank;
}
Position(p->x, 23);
for (k = 1; k<Distance / 3 - 2; k++)
PR_Land;
}
p = p->next;
if (p->x == 0)
{
for (j = 2; j<p->y; j++)
{
Position(p->x + 1, j);
PR_Blank; PR_Blank;
}
Position(p->x + 1, p->y);
PR_Blank; PR_Blank; PR_Blank;
Position(p->x + 1, p->y + Max_blank - Grade);
PR_Blank; PR_Blank; PR_Blank;
j = j + Max_blank - Grade + 1;
for (j; j <= 22; j++)
{
Position(p->x + 1, j);
PR_Blank; PR_Blank;
}
}
}
}
void PrtBg()
{
int i;
Position(1, 1); PR_Bg_TL;
Position(79, 1); PR_Bg_TR;
Position(1, 24); PR_Bg_DL;
Position(79, 24); PR_Bg_DR;
for (i = 3; i <= 78; i += 2)
{
Position(i, 1); PR_Bg_X;
Position(i, 24); PR_Bg_X;
}
/*for(i=2;i<=23;i++)
{ Position(1,i);PR_Bg_Y;printf("%d",i-1);
Position(79,i);PR_Bg_Y;
}*/
}
void PrtBird()
{
Position(Bird->x, Bird->y - 1);
PR_Blank;
Position(Bird->x, Bird->y);
PR_FBird;
Position(38, 2);
printf("Score:%d", Score);
}
int CheckYN(Bg *q)
{
Bg *p = q; int i = 0;
while (++i <= 5)
{
if (Bird->y>23)
return 0;
if (Bird->x == p->x&&Bird->y <= p->y)
return 0;
if ((Bird->x == p->x || Bird->x == p->x + 1 || Bird->x == p->x + 2) && Bird->y == p->y)
return 0;
if (Bird->x == p->x&&Bird->y>p->y + p->l_blank)
return 0;
if ((Bird->x == p->x || Bird->x == p->x + 1 || Bird->x == p->x + 2) && Bird->y == p->y + p->l_blank)
return 0;
p = p->next;
}
return 1;
}
void Prtfirst()
{
printf("══════════════════════════════════════\n");
printf(" ■■ ■■\n");
printf(" ■■ ■■\n");
printf(" ■■ ■■ C语言版 Flappy Bird\n");
printf(" ■■ ■■ 瞎搞人:傅文彬\n");
printf(" ■■ ■■ 瞎搞日期:2014.2\n");
printf(" ■■ ■■ 耗时:4小时\n");
printf(" ■■■ ■■ 游戏说明:\n");
printf(" ■■ 1-按上箭头使鸟起飞\n");
printf(" ■■ 2-等级越高,难度越大!\n");
printf(" Ю123 ■■■\n");
printf("\n");
printf(" ■■■ 欢迎各路大神与我探讨C、\nC++、VB、PHP、C#\n");
printf(" ■■\n");
printf(" ■■\n");
printf(" ■■ ■■■ \n");
printf(" ■■ ■■\n");
printf(" ■■ Ф ■■\n");
printf(" ■■ ■■\n");
printf(" ■■ ■■\n");
printf(" ■■ ■■\n");
printf(" ■■ ■■\n");
printf(" ┳┳┯┳┳┯┳┳┯┳┳┯┳┳┯┳┳┯┳┳┯┳┳┯┳┳┯┳┳┯┳┳┯┳┳┯┳\n");
system("pause");
Position(1, 1);
int i = 0;
while (i++<40 * 25)
PR_Blank;
}
int  main()
{
int i = 0; char ch;
Prtfirst();
PrtBg();
CreatBg();
InsertBg(Bg1);
InsertBg(Bg1);
InsertBg(Bg1);
CreatBird();
while (1)
{
if (!CheckYN(Bg1))
break;
Check_Bg(Bg1);
Prt_Bg(Bg1);
PrtBird();
Loop_Bg(Bg1);
Bird->y = Bird->y + 1;
if (GetAsyncKeyState(VK_UP))
{
    Position(Bird->x, Bird->y - 1);
    PR_Blank;
    Bird->y = Bird->y - 4;
}
while (i++<500);
{
    Sleep(100);
}
    i = 0;
}
    Position(38, 10);
    printf("You Lost!");
    Position(1, 25);
    system("pause");
    return 0;

0
傅文彬
傅文彬
新手天翼
新手天翼

#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#include<time.h>
#include<Windows.h>
#define PR_Box printf("■")
#define PR_Gold printf("★")
#define PR_Ag printf("☆")
#define PR_FBird printf("Ю")
#define PR_DBird printf("Ф")
#define PR_Land printf("┳┳┯")
#define PR_Bg_TL printf("╔")
#define PR_Bg_TR printf("╗")
#define PR_Bg_DL printf("╚")
#define PR_Bg_DR printf("╝")
#define PR_Bg_X printf("═")
#define PR_Bg_Y printf("║")
#define PR_Blank printf(" ");
int Grade = 1, C_Gold = 0, C_Ag = 0, Score = 0, Delay_time = 1000, Max_blank = 9, Distance = 18;
struct Birds
{
int x, y;
int condition;
};
Birds *Bird = (Birds*)malloc(sizeof(Birds));
struct Bg
{
int x, y;
int l_blank;
int reward[9];
Bg *pri;
Bg *next;
};
Bg *Bg1 = new Bg[sizeof(Bg)];
void Position(int x, int y)
{
COORD pos = { x - 1, y - 1 };
HANDLE Out = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleCursorPosition(Out, pos);
}
void CreatBird()
{
Bird->x = 41;
Bird->y = 10;
Bird->condition = 0;
}
void CreatBg()
{
Bg *Bg2 = (Bg*)malloc(sizeof(Bg));
Bg1->x = 90; Bg1->y = 8;
Bg2->x = Bg1->x + Distance; Bg2->y = 9;
Bg1->l_blank = Max_blank - Grade;
Bg2->l_blank = Max_blank - Grade;
Bg1->next = Bg2;
Bg1->pri = Bg2;
Bg2->next = Bg1;
Bg2->pri = Bg1;
}
void InsertBg(Bg *p)
{
int temp;
Bg *Bgs = (Bg*)malloc(sizeof(Bg));
Bgs->x = p->pri->x + Distance;
Bgs->l_blank = Max_blank - Grade;
srand((int)time(0));
temp = rand();
if (temp % 2 == 0)//++
{
if ((temp % 4 + p->pri->y + Max_blank - Grade)<21)
Bgs->y = p->pri->y + temp % 4;
else
Bgs->y = p->pri->y;
}
else
{
if ((p->pri->y - temp % 4)>2)
Bgs->y = p->pri->y - temp % 4;
else
Bgs->y = p->pri->y;
}
Bgs->pri = p->pri;
Bgs->next = p;
p->pri->next = Bgs;
p->pri = Bgs;
}
void Check_Bg(Bg *q)
{
Bg *p = q; int i = 0, temp;
while (++i <= 5)
{
if (p->x>-4)
p = p->next;
else
{
srand((int)time(0));
temp = rand();
if (temp % 2 == 0)//++
{
if ((temp % 4 + p->y + Max_blank - Grade)<21)
p->y = p->y + temp % 4;
else
p->y = p->y;
p->x = p->pri->x + Distance;
p->l_blank = Max_blank - Grade;
}
else
{
if ((p->y - temp % 4)>2)
p->y = p->y - temp % 4;
else
p->y = p->y;
p->x = p->pri->x + Distance;
p->l_blank = Max_blank - Grade;
}
}
}
}
void Loop_Bg(Bg *q)
{
Bg *p = q; int i = 0;
while (++i <= 5)
{
p->x = p->x - 1;
p = p->next;
if (Bird->x == p->x)
{
Score += 1;
if (Score % 4 == 0 && Grade<4)
Grade++;
}
}
}
void Prt_Bg(Bg *q)
{
Bg *p = q; int i = 0, k, j;
while (++i <= 5)
{
if (p->x>0 && p->x <= 78)
{
for (k = 2; k<p->y; k++)
{
Position(p->x + 1, k);
PR_Box; PR_Box; PR_Blank
}
Position(p->x, p->y);
PR_Box; PR_Box; PR_Box; PR_Blank;
Position(p->x, p->y + p->l_blank);
PR_Box; PR_Box; PR_Box; PR_Blank;
k = k + p->l_blank + 1;
for (k; k <= 22; k++)
{
Position(p->x + 1, k);
PR_Box; PR_Box; PR_Blank;
}
Position(p->x, 23);
for (k = 1; k<Distance / 3 - 2; k++)
PR_Land;
}
p = p->next;
if (p->x == 0)
{
for (j = 2; j<p->y; j++)
{
Position(p->x + 1, j);
PR_Blank; PR_Blank;
}
Position(p->x + 1, p->y);
PR_Blank; PR_Blank; PR_Blank;
Position(p->x + 1, p->y + Max_blank - Grade);
PR_Blank; PR_Blank; PR_Blank;
j = j + Max_blank - Grade + 1;
for (j; j <= 22; j++)
{
Position(p->x + 1, j);
PR_Blank; PR_Blank;
}
}
}
}
void PrtBg()
{
int i;
Position(1, 1); PR_Bg_TL;
Position(79, 1); PR_Bg_TR;
Position(1, 24); PR_Bg_DL;
Position(79, 24); PR_Bg_DR;
for (i = 3; i <= 78; i += 2)
{
Position(i, 1); PR_Bg_X;
Position(i, 24); PR_Bg_X;
}
/*for(i=2;i<=23;i++)
{ Position(1,i);PR_Bg_Y;printf("%d",i-1);
Position(79,i);PR_Bg_Y;
}*/
}
void PrtBird()
{
Position(Bird->x, Bird->y - 1);
PR_Blank;
Position(Bird->x, Bird->y);
PR_FBird;
Position(38, 2);
printf("Score:%d", Score);
}
int CheckYN(Bg *q)
{
Bg *p = q; int i = 0;
while (++i <= 5)
{
if (Bird->y>23)
return 0;
if (Bird->x == p->x&&Bird->y <= p->y)
return 0;
if ((Bird->x == p->x || Bird->x == p->x + 1 || Bird->x == p->x + 2) && Bird->y == p->y)
return 0;
if (Bird->x == p->x&&Bird->y>p->y + p->l_blank)
return 0;
if ((Bird->x == p->x || Bird->x == p->x + 1 || Bird->x == p->x + 2) && Bird->y == p->y + p->l_blank)
return 0;
p = p->next;
}
return 1;
}
void Prtfirst()
{
printf("══════════════════════════════════════\n");
printf(" ■■ ■■\n");
printf(" ■■ ■■\n");
printf(" ■■ ■■ C语言版 Flappy Bird\n");
printf(" ■■ ■■ 瞎搞人:傅文彬\n");
printf(" ■■ ■■ 瞎搞日期:2014.2\n");
printf(" ■■ ■■ 耗时:4小时\n");
printf(" ■■■ ■■ 游戏说明:\n");
printf(" ■■ 1-按上箭头使鸟起飞\n");
printf(" ■■ 2-等级越高,难度越大!\n");
printf(" Ю123 ■■■\n");
printf("\n");
printf(" ■■■ 欢迎各路大神与我探讨C、\nC++、VB、PHP、C#\n");
printf(" ■■\n");
printf(" ■■\n");
printf(" ■■ ■■■ \n");
printf(" ■■ ■■\n");
printf(" ■■ Ф ■■\n");
printf(" ■■ ■■\n");
printf(" ■■ ■■\n");
printf(" ■■ ■■\n");
printf(" ■■ ■■\n");
printf(" ┳┳┯┳┳┯┳┳┯┳┳┯┳┳┯┳┳┯┳┳┯┳┳┯┳┳┯┳┳┯┳┳┯┳┳┯┳\n");
system("pause");
Position(1, 1);
int i = 0;
while (i++<40 * 25)
PR_Blank;
}
int  main()
{
int i = 0; char ch;
Prtfirst();
PrtBg();
CreatBg();
InsertBg(Bg1);
InsertBg(Bg1);
InsertBg(Bg1);
CreatBird();
while (1)
{
if (!CheckYN(Bg1))
break;
Check_Bg(Bg1);
Prt_Bg(Bg1);
PrtBird();
Loop_Bg(Bg1);
Bird->y = Bird->y + 1;
if (GetAsyncKeyState(VK_UP))
{
    Position(Bird->x, Bird->y - 1);
    PR_Blank;
    Bird->y = Bird->y - 4;
}
while (i++<500);
{
    Sleep(100);
}
    i = 0;
}
    Position(38, 10);
    printf("You Lost!");
    Position(1, 25);
    system("pause");
    return 0;

0
傅文彬
傅文彬
新手天翼
新手天翼

#include<iostream>
 
#include<windows.h>
 
#include<conio.h>
 
#include<time.h>
 
#include<string>
 
using namespace std;
 
typedef struct Frame
 
{
 
    COORD position[2];
 
    int flag;
 
}Frame;
 
void SetPos(COORD a)
 
{
 
    HANDLE out=GetStdHandle(STD_OUTPUT_HANDLE);
 
    SetConsoleCursorPosition(out, a);
 
}
 
void SetPos(int i, int j)
 
{
 
    COORD pos={i, j};
 
    SetPos(pos);
 
}
 
void HideCursor()
 
{
 
    CONSOLE_CURSOR_INFO cursor_info = {1, 0}; 
 
    SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursor_info);
 
}
 
 
 
//把第y行,[x1, x2) 之间的坐标填充为 ch
 
void drawRow(int y, int x1, int x2, char ch)
 
{
 
    SetPos(x1,y);
 
    for(int i = 0; i <= (x2-x1); i++) cout<<ch;
 
}
 
 
 
//在a, b 纵坐标相同的前提下,把坐标 [a, b] 之间填充为 ch
 
void drawRow(COORD a, COORD b, char ch)
 
{
 
    if(a.Y == b.Y) drawRow(a.Y, a.X, b.X, ch);
 
    else {
 
        SetPos(0, 25);
 
        cout<<"error code 01:无法填充行,因为两个坐标的纵坐标(x)不相等";
 
        system("pause");
 
    }
 
}
 
 
 
//把第x列,[y1, y2] 之间的坐标填充为 ch
 
void drawCol(int x, int y1, int y2, char ch)
 
{
 
    int y=y1;
 
    while(y!=y2+1) {
 
        SetPos(x, y);
 
        cout<<ch;
 
        y++;
 
    }
 
}
 
 
 
//在a, b 横坐标相同的前提下,把坐标 [a, b] 之间填充为 ch
 
void drawCol(COORD a, COORD b, char ch)
 
{
 
    if(a.X == b.X) drawCol(a.X, a.Y, b.Y, ch);
 
    else {
 
        SetPos(0, 25);
 
        cout<<"error code 02:无法填充列,因为两个坐标的横坐标(y)不相等";
 
        system("pause");
 
    }
 
}
 
 
 
//左上角坐标、右下角坐标、用row填充行、用col填充列
 
void drawFrame(COORD a, COORD  b, char row, char col)
 
{
 
    drawRow(a.Y, a.X+1, b.X-1, row);
 
    drawRow(b.Y, a.X+1, b.X-1, row);
 
    drawCol(a.X, a.Y+1, b.Y-1, col);
 
    drawCol(b.X, a.Y+1, b.Y-1, col);
 
}
 
 
 
void drawFrame(int x1, int y1, int x2, int y2, char row, char col)
 
{
 
    COORD a={x1, y1};
 
    COORD b={x2, y2};
 
    drawFrame(a, b, row, col);
 
}
 
 
 
void drawFrame(Frame frame, char row, char col)
 
{
 
    COORD a = frame.position[0];
 
    COORD b = frame.position[1];
 
    drawFrame(a, b, row, col);
 
}
 
 
 
void drawPlaying()
 
{
 
    drawFrame(0, 0, 48, 24, '=', '|');//    draw map frame;
 
    drawFrame(49, 0, 79, 4, '-', '|');//        draw output frame
 
    drawFrame(49, 4, 79, 9, '-', '|');//        draw score frame
 
    drawFrame(49, 9, 79, 20, '-', '|');//   draw operate frame
 
    drawFrame(49, 20, 79, 24, '-', '|');//  draw other message frame
 
    SetPos(52, 6);
 
    cout<<"得分:";
 
    SetPos(52, 7);
 
    cout<<"称号:";
 
    SetPos(52,10);
 
    cout<<"操作方式:";
 
    SetPos(52,12);
 
    cout<<"  a,s,d,w 控制战机移动。";
 
    SetPos(52,14);
 
    cout<<"  p 暂停游戏。";
 
    SetPos(52,16);
 
    cout<<"  e 退出游戏。";
 
}
 
 
 
//在[a, b)之间产生一个随机整数
 
int random(int a, int b)
 
{
 
    int c=(rand() % (a-b))+ a;
 
    return c;
 
}
 
 
 
//在两个坐标包括的矩形框内随机产生一个坐标
 
COORD random(COORD a, COORD b)
 
{
 
    int x=random(a.X, b.X);
 
    int y=random(a.Y, b.Y);
 
    COORD c={x, y};
 
    return c;
 
}
 
 
 
bool  judgeCoordInFrame(Frame frame, COORD spot)
 
{
 
    if(spot.X>=frame.position[0].X)
 
        if(spot.X<=frame.position[1].X)
 
            if(spot.Y>=frame.position[0].Y)
 
                if(spot.Y<=frame.position[0].Y)
 
                    return true;
 
    return false;
 
}
 
 
 
void printCoord(COORD a)
 
{
 
    cout    <<"( "<<a.X<<" , "<<a.Y<<" )";
 
}
 
 
 
void printFrameCoord(Frame a)
 
{
 
    printCoord(a.position[0]);
 
    cout    <<" - ";
 
    printCoord(a.position[1]);
 
}
 
 
 
int drawMenu()
 
{
 
    SetPos(30, 1);
 
    cout<<"P l a n e  W a r";
 
    drawRow(3, 0, 79, '-');
 
    drawRow(5, 0, 79, '-');
 
    SetPos(28, 4);
 
    cout<<"w 和 s 选择, k 确定";
 
    SetPos(15, 11);
 
    cout<<"1. 简单的敌人";
 
    SetPos(15, 13);
 
    cout<<"2. 冷酷的敌人";
 
    drawRow(20, 0, 79, '-');
 
    drawRow(22, 0, 79, '-');
 
    SetPos(47, 11);
 
    cout<<"简单的敌人:";
 
    SetPos(51, 13);
 
    cout<<"简单敌人有着较慢的移动速度。";
 
    int j=11;
 
    cout<<">>";
 
    while(1) {
 
        if( _kbhit() ) {    
 
            char x=_getch();
 
            switch (x) {
 
              case 'w' : {  
 
                if( j == 13) {
 
                  SetPos(12, j);
 
                  cout<<" ";
 
                  j = 11;
 
                  SetPos(12, j);
 
                  cout<<">>";
 
                  SetPos(51, 13);
 
                  cout<<"            ";
 
                  SetPos(47, 11);
 
                  cout<<"简单的敌人:";
 
                  SetPos(51, 13);
 
                  cout<<"简单敌人有着较慢的移动速度。";
 
                }
 
                break;
 
              }
 
              case 's' : {  
 
                if( j == 11 ) {
 
                  SetPos(12, j);
 
                  cout<<" ";        
 
                  j = 13;
 
                  SetPos(12, j);
 
                  cout<<">>";
 
                  SetPos(51, 13);
 
                   cout<<"              ";
 
                   SetPos(47, 11);
 
                   cout<<"冷酷的敌人:";
 
                   SetPos(51, 13);
 
                   cout<<"冷酷的敌人移动速度较快。";
 
                }
 
                break;
 
              }
 
              case 'k' : {  
 
                if (j == 8) return 1; else return 2;
 
              }
 
            }
 
        }
 
    }
 
}
 
/*================== the Game Class ==================*/
 
 
 
class Game
 
{
 
public:
 
    COORD position[10];
 
    COORD bullet[10];
 
    Frame enemy[8];
 
    int score;
 
    int rank;
 
    int rankf;
 
    string title;
 
    int flag_rank;
 
 
 
    Game ();
 
 
 
    //初始化所有
 
    void initPlane();
 
    void initBullet();
 
    void initEnemy();
 
 
 
    //初始化其中一个
 
    //void initThisBullet( COORD );
 
    //void initThisEnemy( Frame );
 
 
 
    void planeMove(char);
 
    void bulletMove();
 
    void enemyMove();
 
 
 
    //填充所有
 
    void drawPlane();
 
    void drawPlaneToNull();
 
    void drawBullet();
 
    void drawBulletToNull();
 
    void drawEnemy();
 
    void drawEnemyToNull();
 
 
 
    //填充其中一个
 
    void drawThisBulletToNull( COORD );
 
    void drawThisEnemyToNull( Frame );
 
 
 
    void Pause();
 
    void Playing();
 
    void judgePlane();
 
    void judgeEnemy();
 
 
 
    void Shoot();
 
 
 
    void GameOver();
 
    void printScore();
 
};
 
 
 
Game::Game()
 
{
 
    initPlane();
 
    initBullet();
 
    initEnemy();
 
    score = 0;
 
    rank = 25;
 
    rankf = 0;
 
    flag_rank = 0;
 
}
 
 
 
void Game::initPlane()
 
{
 
    COORD centren={39, 22};
 
    position[0].X=position[5].X=position[7].X=position[9].X=centren.X;
 
    position[1].X=centren.X-2;  
 
    position[2].X=position[6].X=centren.X-1;
 
    position[3].X=position[8].X=centren.X+1;
 
    position[4].X=centren.X+2;
 
    for(int i=0; i<=4; i++)
 
        position[i].Y=centren.Y;
 
    for(int i=6; i<=8; i++)
 
        position[i].Y=centren.Y+1;
 
    position[5].Y=centren.Y-1;
 
    position[9].Y=centren.Y-2;
 
}
 
 
 
void Game::drawPlane()
 
{
 
    for(int i=0; i<9; i++)
 
    {
 
        SetPos(position[i]);
 
        if(i!=5)
 
            cout<<"O";
 
        else if(i==5)
 
            cout<<"|";      
 
    }
 
}
 
 
 
void Game::drawPlaneToNull()
 
{
 
    for(int i=0; i<9; i++)
 
    {
 
        SetPos(position[i]);
 
        cout<<" ";
 
    }   
 
}
 
 
 
void Game::initBullet()
 
{
 
    for(int i=0; i<10; i++)
 
        bullet[i].Y = 30;
 
}
 
 
 
void Game::drawBullet()
 
{
 
    for(int i=0; i<10; i++)
 
    {
 
        if( bullet[i].Y != 30)
 
        {
 
            SetPos(bullet[i]);
 
            cout<<"Φ";  
 
        }
 
    }
 
}
 
 
 
void Game::drawBulletToNull()
 
{
 
    for(int i=0; i<10; i++)
 
        if( bullet[i].Y != 30 )
 
            {
 
                COORD pos={bullet[i].X, bullet[i].Y+1};
 
                SetPos(pos);
 
                cout<<" ";
 
            }   
 
}
 
 
 
void Game::initEnemy()
 
{
 
    COORD a={1, 1};
 
    COORD b={45, 15};
 
    for(int i=0; i<8; i++)
 
    {
 
        enemy[i].position[0] = random(a, b);
 
        enemy[i].position[1].X = enemy[i].position[0].X + 3;
 
        enemy[i].position[1].Y = enemy[i].position[0].Y + 2;
 
    }
 
}
 
 
 
void Game::drawEnemy()
 
{
 
    for(int i=0; i<8; i++)
 
        drawFrame(enemy[i].position[0], enemy[i].position[1], '-', '|');
 
}
 
 
 
void Game::drawEnemyToNull()
 
{
 
    for(int i=0; i<8; i++)
 
    {
 
        drawFrame(enemy[i].position[0], enemy[i].position[1], ' ', ' ');
 
    }       
 
}
 
 
 
void Game::Pause()
 
{
 
    SetPos(61,2);
 
    cout<<"               ";
 
    SetPos(61,2);
 
    cout<<"暂停中...";
 
    char c=_getch();
 
    while(c!='p')
 
        c=_getch();
 
    SetPos(61,2);
 
    cout<<"         ";
 
}
 
 
 
void Game::planeMove(char x)
 
{
 
    if(x == 'a')
 
        if(position[1].X != 1)
 
            for(int i=0; i<=9; i++)
 
                position[i].X -= 2;
 
 
 
    if(x == 's')
 
        if(position[7].Y != 23)
 
            for(int i=0; i<=9; i++)
 
                position[i].Y += 1;
 
 
 
    if(x == 'd')
 
        if(position[4].X != 47)
 
            for(int i=0; i<=9; i++)
 
                position[i].X += 2;
 
 
 
    if(x == 'w')
 
        if(position[5].Y != 3)
 
            for(int i=0; i<=9; i++)
 
                position[i].Y -= 1;
 
}
 
 
 
void Game::bulletMove()
 
{
 
    for(int i=0; i<10; i++)
 
    {
 
        if( bullet[i].Y != 30)
 
        {
 
            bullet[i].Y -= 1;
 
            if( bullet[i].Y == 1 )
 
            {
 
                COORD pos={bullet[i].X, bullet[i].Y+1};
 
                drawThisBulletToNull( pos );
 
                bullet[i].Y=30;
 
            }
 
 
 
        }
 
    }
 
}
 
 
 
void Game::enemyMove()
 
{
 
    for(int i=0; i<8; i++)
 
    {
 
        for(int j=0; j<2; j++)
 
            enemy[i].position[j].Y++;
 
 
 
        if(24 == enemy[i].position[1].Y)
 
        {
 
            COORD a={1, 1};
 
            COORD b={45, 3};
 
            enemy[i].position[0] = random(a, b);
 
            enemy[i].position[1].X = enemy[i].position[0].X + 3;
 
            enemy[i].position[1].Y = enemy[i].position[0].Y + 2;
 
        }
 
    }
 
}
 
 
 
void Game::judgePlane()
 
{
 
    for(int i = 0; i < 8; i++)
 
        for(int j=0; j<9; j++)
 
            if(judgeCoordInFrame(enemy[i], position[j]))
 
            {
 
                SetPos(62, 1);
 
                cout<<"坠毁";
 
                drawFrame(enemy[i], '+', '+');
 
                Sleep(1000);
 
                GameOver();
 
                break;
 
            }
 
}
 
 
 
void Game::drawThisBulletToNull( COORD c)
 
{
 
    SetPos(c);
 
    cout<<" ";
 
}
 
 
 
void Game::drawThisEnemyToNull( Frame f )
 
{
 
    drawFrame(f, ' ', ' ');
 
}
 
 
 
void Game::judgeEnemy()
 
{
 
    for(int i = 0; i < 8; i++)
 
        for(int j = 0; j < 10; j++)
 
            if( judgeCoordInFrame(enemy[i], bullet[j]) )
 
            {
 
                score += 5;
 
                drawThisEnemyToNull( enemy[i] );
 
                COORD a={1, 1};
 
                COORD b={45, 3};
 
                enemy[i].position[0] = random(a, b);
 
                enemy[i].position[1].X = enemy[i].position[0].X + 3;
 
                enemy[i].position[1].Y = enemy[i].position[0].Y + 2;                    
 
                drawThisBulletToNull( bullet[j] );
 
                bullet[j].Y = 30;
 
            }
 
}
 
 
 
void Game::Shoot()
 
{
 
    for(int i=0; i<10; i++)
 
        if(bullet[i].Y == 30)
 
        {
 
            bullet[i].X = position[5].X;
 
            bullet[i].Y = position[5].Y-1;
 
            break;
 
        }
 
}
 
 
 
void Game::printScore()
 
{
 
    if(score == 120 && flag_rank == 0)
 
    {
 
        rank -= 3;
 
        flag_rank = 1;
 
    }
 
 
 
    else if( score == 360 && flag_rank == 1)
 
    {
 
        rank -= 5;
 
        flag_rank = 2;
 
    }
 
    else if( score == 480 && flag_rank == 2)
 
    {
 
        rank -= 5;
 
        flag_rank = 3;
 
    }
 
    int x=rank/5;
 
    SetPos(60, 6);
 
    cout<<score;
 
 
 
    if( rank!=rankf )
 
    {
 
        SetPos(60, 7);
 
        if( x == 5)
 
            title="新手守护";
 
        else if( x == 4)
 
            title="资深守护";
 
        else if( x == 3)
 
            title="缔造者守护";
 
        else if( x == 2 )
 
            title="战狼守护";
            else if(x==1)
            title="绝地武士守护";
            else if(x=0)
            title="缔造者之神守护"; 
 
        cout<<title;
 
    }
 
    rankf = rank;
 
}
 
 
 
void Game::Playing()
 
{
 
 
 
 
    drawEnemy();
 
    drawPlane();
 
 
 
    int flag_bullet = 0;
 
    int flag_enemy = 0;
 
 
 
    while(1)
 
    {
 
        Sleep(8);
 
        if(_kbhit())
 
        {
 
            char x = _getch();
 
            if ('a' == x || 's' == x || 'd' == x || 'w' == x)
 
            {
 
                drawPlaneToNull();
 
                planeMove(x);
 
                drawPlane();
 
                judgePlane();
 
            }           
 
            else if ('p' == x)
 
                Pause();
 
            else if( 'k' == x)
 
                Shoot();
 
            else if( 'e' == x)
 
            {
 
                //CloseHandle(MFUN);
 
                GameOver();
 
                break;
 
            }
 
 
 
        }
 
        /* 处理子弹 */
 
        if( 0 == flag_bullet )
 
        {
 
            bulletMove();
 
            drawBulletToNull();
 
            drawBullet();
 
            judgeEnemy();
 
        }           
 
        flag_bullet++;
 
        if( 5 == flag_bullet )
 
            flag_bullet = 0;
 
 
 
        /* 处理敌人 */
 
        if( 0 == flag_enemy )
 
        {
 
            drawEnemyToNull();
 
            enemyMove();            
 
            drawEnemy();
 
            judgePlane();
 
        }
 
        flag_enemy++;
 
        if( flag_enemy >= rank )
 
            flag_enemy = 0;
 
 
 
        /* 输出得分 */
 
        printScore();
 
    }
 
}
 
 
 
void Game::GameOver()
 
{
 
    system("cls");              
 
    COORD p1={28,9};
 
    COORD p2={53,15};
 
    drawFrame(p1, p2, '=', '|');
 
    SetPos(36,12);
 
    string str="Game Over!";
 
    for(int i=0; i<str.size(); i++)
 
    {
 
        Sleep(80);
 
        cout<<str[i];
 
    }
 
    Sleep(1000);
 
    system("cls");
 
    drawFrame(p1, p2, '=', '|');
 
    SetPos(31, 11);
 
    cout<<"击落敌机:"<<score/5<<" 架";
 
    SetPos(31, 12);
 
    cout<<"得  分:"<<score<<" 分";
 
    SetPos(31, 13);
 
    cout<<"获得称号:"<<title;
 
    SetPos(30, 16);
 
    Sleep(1000);
 
    cout<<"继续? 是(y)| 否(n)";
 
as:
 
    char x=_getch();
 
    if (x == 'n')
 
        exit(0);
 
    else if (x == 'y')
 
    {
 
        system("cls");
 
        Game game;
 
        int a = drawMenu();
 
        if(a == 2)
 
            game.rank = 20;
 
        system("cls");
 
        drawPlaying();
 
        game.Playing();
 
    }
 
    else goto as;
 
}
 
 
 
/*================== the main function ==================*/
 
int main()
 
{
 
    //游戏准备
 
    srand((int)time(0));    //随机种子
 
    HideCursor();   //隐藏光标
 
 
 
    Game game;
 
    int a = drawMenu();
 
    if(a == 2)
 
        game.rank = 20;
 
    system("cls");
 
    drawPlaying();
 
    game.Playing();
 
}

0
夏天
夏天
中级守护
中级守护

#include<iostream>
#include<windows.h>
#include<time.h>
#include<conio.h>
using namespace std;
inline void Refresh(char q[][22], int grade, int gamespeed){
    system("cls");     
 int i,j;
 cout << endl;
 for(i=0;i<22;i++){
     cout << "\t";
  for(j=0;j<22;j++)
   cout<<q[i][j]<<' ';    //  输出贪吃蛇棋盘
        if(i==0) cout << "\t等级为:" << grade;
        if(i==4) cout << "\t自动前进时间";
        if(i==6) cout << "\t间隔为:" << gamespeed << "ms";
  cout<<endl;
 }
}
int main(){
    char tcsQipan[22][22];     //  贪吃蛇棋盘是一个二维数组(如22*22,包括墙壁)
    int i,j;
    for(i=1;i<=20;i++)
        for(j=1;j<=20;j++)
            tcsQipan[i][j]=' ';     //     初始化贪吃蛇棋盘中间空白部分
    for(i=0;i<=21;i++)
        tcsQipan[0][i] = tcsQipan[21][i] = '-';      //初始化贪吃蛇棋盘上下墙壁
    for(i=1;i<=20;i++)
        tcsQipan[i][0] = tcsQipan[i][21] = '|';      //初始化贪吃蛇棋盘左右墙壁
    int tcsZuobiao[2][100];     //蛇的坐标数组
    for(i=0; i<4; i++){
        tcsZuobiao[0][i] = 1;
        tcsZuobiao[1][i] = i + 1;
    }
    int head = 3,tail = 0;
    for(i=1;i<=3;i++)
        tcsQipan[1][i]='*';    //蛇身
    tcsQipan[1][4]='#';       //蛇头
    int x1, y1;           // 随机出米
    srand(time(0));
    do{
  x1=rand()%20+1;
  y1=rand()%20+1;
 }while(tcsQipan[x1][y1]!=' ');
 tcsQipan[x1][y1]='*';
 cout<<"\n\n\t\t贪吃蛇游戏即将开始 !"<<endl;//准备开始;;
 long start;
    int grade = 1, length = 4;
    int gamespeed = 500;  //前进时间间隔
 for(i=3;i>=0;i--){
  start=clock();
  while(clock()-start<=1000);
  system("cls");
  if(i>0)
   cout << "\n\n\t\t进入倒计时:" << i << endl;
  else
   Refresh(tcsQipan,grade,gamespeed);
 }
    int timeover;
    char direction = 77;  // 初始情况下,向右运动
    int x,y;
    while(1){
        timeover = 1;
        start = clock();
        while((timeover=(clock()-start<=gamespeed))&&!kbhit());
             //如果有键按下或时间超过自动前进时间间隔则终止循环
        if(timeover){
            getch();direction = getch();
        }
        switch(direction){
        case 72: x= tcsZuobiao[0][head]-1; y= tcsZuobiao[1][head];break;     // 向上
        case 80: x= tcsZuobiao[0][head]+1; y= tcsZuobiao[1][head];break;      // 向下
        case 75: x= tcsZuobiao[0][head]; y= tcsZuobiao[1][head]-1;break;      // 向左
        case 77: x= tcsZuobiao[0][head]; y= tcsZuobiao[1][head]+1;           // 向右
        }
        if(!(direction==72||direction==80||direction==75 ||direction==77)){   //  按键非方向键
            cout << "\tGame over!" << endl;return 0;
        }
        if(x==0 || x==21 ||y==0 || y==21){   // 碰到墙壁
            cout << "\tGame over!" << endl;return 0;
        }
        if(tcsQipan[x][y]!=' '&&!(x==x1&&y==y1)){ //   蛇头碰到蛇身
            cout << "\tGame over!" << endl;return 0;
        }
        if(x==x1 && y==y1){      //  吃米,长度加1
            length ++;
            if(length>=8){
                length -= 8;
                grade ++;
                if(gamespeed>=200)
                    gamespeed = 550 - grade * 50; // 改变自动前进时间间隔
            }
            tcsQipan[x][y]= '#';
            tcsQipan[tcsZuobiao[0][head]][tcsZuobiao[1][head]] = '*';
            head = (head+1)%100;
            tcsZuobiao[0][head] = x;
            tcsZuobiao[1][head] = y;
            do
            {
                x1=rand()%20+1;
                y1=rand()%20+1;
            }while(tcsQipan[x1][y1]!=' ');
            tcsQipan[x1][y1]='*';
            Refresh(tcsQipan,grade,gamespeed);
        }
 
        else{       //  不吃米
            tcsQipan [tcsZuobiao[0][tail]][tcsZuobiao[1][tail]]=' ';
            tail=(tail+1)%100;
            tcsQipan [tcsZuobiao[0][head]][tcsZuobiao[1][head]]='*';
            head=(head+1)%100;
            tcsZuobiao[0][head]=x;
            tcsZuobiao[1][head]=y;
            tcsQipan[tcsZuobiao[0][head]][tcsZuobiao[1][head]]='#';
            Refresh(tcsQipan,grade,gamespeed);
        }
    }
    return 0;
}

0
刘雨沐
刘雨沐
新手光能
新手光能

不会死而且速度很快

#include<iostream>
#include<conio.h>
#include<time.h>
#include<windows.h>
#define X 15
#define Y 15
int score=0;
char ch[X][Y];
char lch = 's';
char nch = 's';
class Snake
{
public:
Snake() { nx = 8;ny = 8;lx = 9;ly = 9;next = NULL; }
Snake(Snake&r);//建立蛇身
void input();//把数据输入到图像
void control();//控制贪吃蛇
void show();//显示图像
void check();//检测食物是否被吃掉
bool gameover();//检测游戏是否结束
int nx;
int ny;
int lx;
int ly;
Snake*next;
};
Snake *head;
namespace Food
{
int x;
int y;
void NEW()
{
Snake*p=head;
x = rand() % X;
y = rand() % Y;
while(p!=NULL)
{
if(p->nx==x&&p->ny==y)
{
x = rand() % X;
y = rand() % Y;
p = head;
}
else
p=p->next;
}
ch[x][y]='$';
}
};
Snake::Snake(Snake&r)
{
this->nx = r.lx;
this->ny = r.ly;
r.next = this;
this->next = NULL;
}
void Snake::show()//显示图像
{
system("cls");
//std::cout << " ------------------------------ \n";
for (int y = 0; y<Y; ++y)
{
//std::cout << "|";
for (int x = 0; x < X; ++x)
std::cerr << ch[x][y] << " " ;
std::cerr <<"|"<< std::endl;
}
std::cout << " ------------------------------ \n";
printf("x = %d,y = %d\n",nx,ny);
printf("x = %0X,y = %0X\n",&nx,&ny);
printf("score = %d\n",score);
}
void Snake::control()//键盘控制
{
if (_kbhit() == 1)
{
nch = _getch();
lx = nx;
ly = ny;
if (nch == 'w' || nch == 's' || nch == 'a' || nch == 'd')
{
lch = nch;
switch (nch)
{
case 'w':if (ny == 0) ny = Y - 1; else --ny; break;
case 's':if (ny == Y - 1) ny = 0; else ++ny; break;
case 'a':if (nx == 0) nx = X - 1; else --nx; break;
case 'd':if (nx == X - 1) nx = 0; else ++nx; break;
}
}
else
{
switch (lch)
{
case 'w':if (ny == 0) ny = Y - 1; else --ny; break;
case 's':if (ny == Y - 1) ny = 0; else ++ny; break;
case 'a':if (nx == 0) nx = X - 1; else --nx; break;
case 'd':if (nx == X - 1) nx = 0; else ++nx; break;
}
}
}
else
{
lx = nx;
ly = ny;
if (nch == 'w' || nch == 's' || nch == 'a' || nch == 'd')
{
lch = nch;
switch (nch)
{
case 'w':if (ny == 0) ny = Y - 1; else --ny; break;
case 's':if (ny == Y - 1) ny = 0; else ++ny; break;
case 'a':if (nx == 0) nx = X - 1; else --nx; break;
case 'd':if (nx == X - 1) nx = 0; else ++nx; break;
}
}
else
{
switch (lch)
{
case 'w':if (ny == 0) ny = Y - 1; else --ny; break;
case 's':if (ny == Y - 1) ny = 0; else ++ny; break;
case 'a':if (nx == 0) nx = X - 1; else --nx; break;
case 'd':if (nx == X - 1) nx = 0; else ++nx; break;
}
}
}
}
void Snake::input()//把对象输入到图像
{
Snake*p = head;
ch[p->lx][p->ly] = ' ';
ch[p->nx][p->ny] = '*';
while (p->next != NULL)
{
p->next->lx = p->next->nx;
p->next->ly = p->next->ny;
p->next->nx = p->lx;
p->next->ny = p->ly;
p = p->next;
ch[p->lx][p->ly] = ' ';
ch[p->nx][p->ny] = '*';
}
}
void Snake::check()//检测食物是否被吃掉
{
Snake*p=head;
if (p->nx == Food::x&&p->ny == Food::y)
{
Snake*p = head;
while (p->next != NULL)
{
p = p->next;
}
p->next = new Snake(*p);
Food::NEW();
++score;
}
}
bool Snake::gameover()//检测游戏是否结束
{
Snake*p = head;
Snake*pn = head->next;
while (p != NULL)
{
while (pn != NULL)
{
if (p->nx == pn->nx&&p->ny == pn->ny)
{
std::cout << "Game Over\n";
return true;
}
pn = pn->next;
}
p = p->next;
}
return 0;
}
int main()
{
//初始化
srand(time(NULL));
for (int y = 0; y<Y; ++y)
for (int x = 0; x<X; ++x)
ch[x][y] = ' ';
head = new Snake;
Food::NEW();
std::cout<<"游戏规则:\n1.wsad(小写)控制蛇\n2.若蛇节数超过2,那么无法反方向运动,\n若反方向运动则GameOver\n3.'*'为蛇,'$'为食物\n";
system("pause");
//开始游戏
while (1)
{
head->control();
head->input();
head->check();
if(head->gameover())
break;
head->show();
Sleep(100);
}
Sleep(1000);
system("pause");
return 0;
}

我要回答