• 打字游戏 C语言


    截图详情,(建议在win7 上运行)

    代码如下:

    #include <iostream>
    #include <stdio.h>
    #include <stdlib.h>
    #include <Windows.h>
    #include <conio.h>
    #include <time.h>
    
    using namespace std;
    
    #define  KLETTER_COUNT    10
    #define  KSPEED    10
    
    //定义子弹或者字符
    typedef struct 
    {
        int  x; //定义坐标
        int  y;
        char ch;//定义字符
        int isDisplay; //是否显示 0 不显示 否则显示
        int life; //定义声明周期
    }LETTER;
    
    //字母初始化
    LETTER  letter[KLETTER_COUNT];
    
    void init_letter(void)
    {
        srand((unsigned)time(NULL));
        for(int i=0;i<KLETTER_COUNT;i++)
        {
            letter[i].ch = rand()%26 + 'A' ;
            letter[i].x = rand()%80;
            //printf("letter[%d].x = %d.
    ",i,letter[i].x);
            letter[i].y = i*(-2);
            //printf("letter[%d].y= %d.
    ",i,letter[i].y);
            letter[i].life = 1;
        }
    }
    
    
    //子弹初始化
    LETTER bullet;
    void init_bullet(int x)
    {
        bullet.ch = 30;
        bullet.x = x;
        bullet.y = 25;
        bullet.life = 1;
    }
    
    //坐标切换
    void  gotoxy(int x,int y)
    {
        COORD pos;
        pos.X = x;
        pos.Y = y;
        HANDLE hout =  GetStdHandle(STD_OUTPUT_HANDLE);
        SetConsoleCursorPosition(hout,pos);
    }
    
    //绘制字母
    void draw_letter(char ch, int x,int y)
    {
        gotoxy(x,y);
        printf("%c",ch);
    }
    
    //判断字母是否显示
    void isLetterDisplay()
    {
        for(int i=0;i<KLETTER_COUNT;i++)
        {
            if(0==letter[i].life)
            {
                letter[i].isDisplay=0;
            }
            else if(letter[i].y < 0  ||  letter[i].y>24)
            {
                letter[i].isDisplay = 0;
            }
            else 
            {
                letter[i].isDisplay = 1;
            }
        }
    }
    
    //让所有的字母下降
    void  letterMov()
    {
        isLetterDisplay(); //先更新所有字母的状态 
        for(int i=0;i<KLETTER_COUNT;i++) //所有的字母状态更新一遍
        {
            if(letter[i].y<25)
            {
                if(letter[i].isDisplay)
                {
                    draw_letter(' ',letter[i].x,letter[i].y);
                    draw_letter(letter[i].ch,letter[i].x,letter[i].y+1);
                }
                else
                {
                    draw_letter(' ',letter[i].x,letter[i].y);
                }
                letter[i].y++;
            }
            else
            {
                draw_letter(' ',letter[i].x,letter[i].y);
            }
        }
    }
    
    //子弹向上
    void bulletMov()
    {
        if(bullet.life==1)
        {
            draw_letter(' ',bullet.x,bullet.y);
            draw_letter(bullet.ch,bullet.x,bullet.y-1);    
            bullet.y-- ;
        }
    }
    
    //动画
    void  flash_ip()
    {
        for(int j=0;j<20;j++)//总共打印20次
        {
            for(int i=0;i<10;i++) //全部打印一遍,每次打印
            {
                if(letter[i].y>=0)
                {
                    gotoxy(letter[i].x,letter[i].y);//首先跳转到对应的位置
                    printf(" ");// 打印该字符
                    gotoxy(letter[i].x,letter[i].y+1);//首先跳转到对应的位置
                    printf("%c",letter[i].ch);// 打印该字符
                }
                else
                {
                    //打印空白行
                    gotoxy(letter[i].x,letter[i].y);//首先跳转到对应的位置
                    printf(" ");// 打印该字符
                }    
                letter[i].y++;
            }
            Sleep(500);//显示0.5s
    
        }
    }
    
    int main(void)
    {
        int i=0;
        int flag = 0;
        int score = 0;
        init_letter(); //初始化 字母
         char        user_l = ' ';
    
         while(letter[KLETTER_COUNT-1].y<24)
         {
             letterMov(); //字母下降一行
             if( _kbhit() )  //判断是否按键按下
             {
                user_l = _getch()  - 32;;//'A'-'a';
                fflush(stdin); //清除键盘缓冲曲
                for(i=0;i<KLETTER_COUNT;i++) //遍历数组  寻找按下的按键是否和目前显示的字母有重一样的
                {
                    if(user_l==letter[i].ch && letter[i].life==1 && letter[i].isDisplay==1)
                    {
                        init_bullet(letter[i].x);//例化子弹 //说明找到了
                        flag=1;
                        break;
                    }
                }
                    while(bullet.y>0 && flag==1) //说明找到了以后才将子弹发射出去
                    {
                        bulletMov();
                        if(bullet.y==letter[i].y)//当子弹打到字母的时候
                        {
                            bullet.life=0; //销毁子弹
                            letter[i].life = 0; //销毁字母
                            draw_letter(' ',letter[i].x,letter[i].y);
                            flag = 0;
                            break; //跳出循环
                        }
                        Sleep(50);
                    }
             }
              Sleep(300);    
         }
    
        
    
         system("CLS"); //清屏、
         //统计分数
         for(i=0;i<KSPEED;i++)
         {
             if(letter[i].life==1)        score++;
         }
    
         printf("一共%d个字母,你削掉了%d个字母,剩余%d个字母.
    ",KSPEED,KSPEED-score,score);
         //打印
    
         getchar();
        //system("pause");
        return 0;
    }
  • 相关阅读:
    iscsi-分区类型
    NFS
    测试目录
    测试
    函数
    循环、枚举、条件判断、选择排序
    格式化、列表、元组、字典、集合
    常量、注释、变量、堆栈、数据类型、强制转换
    站点迁移至https://traceless.site/
    CENTOS7 源码安装NGINX
  • 原文地址:https://www.cnblogs.com/cofin/p/12025341.html
Copyright © 2020-2023  润新知