ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

简单的c语言实现打字小游戏

2021-01-29 11:57:03  阅读:215  来源: 互联网

标签:ch 语言 bullet int void 打字 小游戏 key letter


运行效果
在这里插入图片描述
账号密码都是123
输入账号密码后回车
在这里插入图片描述
进入游戏

#include <iostream>
#include <stdio.h>
#include <stdlib.h>

#include <conio.h>
#include <time.h>
#include <Windows.h>

#define _CRT_SECURE_NO_WARNINGS 

using namespace std;
int now_count=0;//当前得分
#define  KLETTER_COUNT    50
#define  KSPEED    50

char last_key;
int now_key=0;//当前的key值
//定义子弹或者字符
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.\n",i,letter[i].x);
        letter[i].y = i * (-2);
        //printf("letter[%d].y= %d.\n",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 draw_count(int count, int x, int y)
{
    gotoxy(x, y);
    printf("当前得分:%d", count);
}

void draw_count_key(int key, int x, int y)
{
    gotoxy(x, y);
    printf("当前key:%d", key);
}
//判断字母是否显示
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);
                //显示当前key
                if (last_key == ' ') {
                    last_key = letter[i].ch;
                    char key_s[10];
                    //  sprintf(key_s, "%c", letter[i].ch);
                    key_s[0] = 't';
                    key_s[1] = 'i';
                    key_s[2] = 't';
                    key_s[3] = 'l';
                    key_s[4] = 'e';
                    key_s[5] = ' ';
                    key_s[6] = letter[i].ch;
                    key_s[7] = '\0';

                    //   system(key_s);
                    system(key_s);
                }
                else {
                    if ( letter[i].ch== last_key ) {
               
                    }
                    else {
                        char key_s[10];
                        //  sprintf(key_s, "%c", letter[i].ch);
                        key_s[0] = 't';
                        key_s[1] = 'i';
                        key_s[2] = 't';
                        key_s[3] = 'l';
                        key_s[4] = 'e';
                        key_s[5] = ' ';
                        key_s[6] = ((letter[i].ch));
                        key_s[7] = '\0';
                        now_key = (letter[i].ch);
                        draw_count_key(now_key, 2, 2);

                        system(key_s);
                        last_key = letter[i].ch;
                    }//更新

                }
                

            }
            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

    }
}
void start_game(void)
{
   
    printf("倒计时2s开始游戏\n");
    Sleep(2000);
    system("CLS"); //清屏、
    draw_count(now_count, 1, 1);//绘制分数
    last_key = ' ';

    // system("title 688");
    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)
                {
                    now_count += 1;

                    draw_count(now_count, 1, 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个字母.\n", KSPEED, now_count, KSPEED - now_count);
    //打印

    getchar();
    system("pause");
}
void login(void)
{
    char str1[10];
    char str2[10];

    char str123[10];
    char key_s[20];

    strcpy_s(key_s, "title game");
    system(key_s);

    strcpy_s(str123, "123");
    while (true) {
        printf("username:");
        scanf_s("%s", str1, 10);

        printf("passward:");
        scanf_s("%s", str2, 10);
        //printf("%s\n", str);
        if ((strcmp(str1,str123) == 0)&& (strcmp(str2, str123) == 0) ){ return; }
    }

}
int main(void)
{
    char str2[10];
    login();//登录需要输入123
    system("CLS"); //清屏、
    start_game();
    //return 0;
    scanf_s("%s", str2, 10);
}

标签:ch,语言,bullet,int,void,打字,小游戏,key,letter
来源: https://blog.csdn.net/qq_33603380/article/details/113376200

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有