c语言课程设计做一个打字软件 有什么好的思路吗

时间:2022-01-10 12:08:36
c语言课程设计做一个打字软件  有什么好的思路吗?请帮助!

7 个解决方案

#1



 #include "stdio.h"
#include "time.h"
#include "stdlib.h"
#include "conio.h"
#include "dos.h"
#define xLine 70
#define yLine 20
#define full 100
#define true 1
#define false 0
/*---------------------------------------------------------------------*/
void printScreen(int level,int right,int sum,char p[yLine][xLine])/* 刷新屏幕的输出图像 */
{
    int i,j;
    clrscr();
    printf("level:%d             Press 0 to exit;1 to pause             score:%d/%d\n",level,right,sum);/* 输出现在的等级,击中数和现在已下落总数 */
    printf ("----------------------------------------------------------------------\n");
    for (i=0;i<yLine;i++)
    {
        for(j=0;j<xLine;j++)
            printf ("%c",p[i][j]);
        printf("\n");
    }/* for (i) */
printf ("----------------------------------------------------------------------\n");
}/* printScreen */
/*---------------------------------------------------------------------*/
void leave()/* 离开程序时,调用该函数结束程序。 */
{
    clrscr();
    printf ("\n\n\n\nThank you for playing.");
    delay (2500);
    exit (0);
}
/*----------------------------------------------------------------------*/
int levelChoice(int level)/* 进入游戏时选择游戏等级 */
{
 
    while (true)/* void */
    {
 
        clrscr ();
        printf("please input 1-9 to choice level.choice 0 to return.\n");
        level=getch();
        level=level-48;
        if (level>0&&level<10) return (level);
        else if (level==0)
            leave ();
        else
            printf ("Please input a correct number!\n");
    }/* while (true) */
}/* levelChoice */
/*---------------------------------------------------------------------*/
int newWord(int sum,char p[yLine][xLine])/* 随生成一个新的字符并将其加入数组的首行 */
{
    int j,w;
    if (sum!=full)
    {
    j=(rand()%(xLine-2))+1;
    w=(rand()%26)+65;
    p[0][j]=w;
    return (++sum);
    }/* if */
    return (sum);
}/* newWord */
/*---------------------------------------------------------------------*/
int moving(int miss,char p[yLine][xLine])/* 将最后一行置空,并使所有在数组中其他行的字符下降一行 */
{
    int i,j;
    char w;
    for (j=1,i=yLine-1;j<xLine-1;j++)/* 遍历最后一行的所有字符,如果该字符非空则将其置空并使miss加一 */
    {
        if (p[i][j]!=' ')
    {
            miss++;
            p[i][j]=' ';
    }
    }
    for (i=yLine-2;i>=0;i--)/* 从倒数第二行的最后一个字符开始开始向前遍历该数组内的元素,如果该位置非空则将该字符移动至下一行 */
    {
        for (j=xLine-2;j>0;j--)
    {
            if (p[i][j]!=' ')
    {
                w=p[i][j];
                p[i][j]=' ';
                p[i+1][j]=w;
            }/* if */
        }/* for(j) */
    }/* for(i) */
    return (miss);
}/* moving */
/*---------------------------------------------------------------------*/
int wordHit(char p[yLine][xLine])
/*判断是否有字符从键盘键入。
如果有,则从最后一行的最后一个元素开始遍历该数组,找出该字符,并把对应位置置空,且返回1。
如果有输入,但屏幕上无对应项,或无输入则返回0*/
{
    int i,j;
    char key;
    if(kbhit())/* 判断用户是否从键盘键入字符。如果kbhit返回值为 */
    key=getch();
    if(key)
    {
        if (key=='0') leave();
        if (key=='1')
    {
            clrscr();
            printf ("Press any key to continue.");
            getch();
    }
        for (i=yLine;i>0;i--)
    {
            for (j=xLine;j>0;j--)
    {
                if (key-32==p[i-1][j-1])
        {
                    p[i-1][j-1]=' ';
                    return (true);
                }/* if */
            }/* for (j) */
        }/* for (i) */
        sound(300);
    }/* if (key) */
    return (false);
}/* wordHit */
/*---------------------------------------------------------------------*/
int result(int right)
/*判断该次的成绩并输出对应的结果,询问用户是否继续,若继续,判断是否可以进入下一级别。*/
{
    int score;
    char yn;
    score=right*100/full;
    nosound();
    clrscr();
    if (score==100)
    printf("perfect!\n");
    else if (score>=85)
    printf("good!\n");
    else if (score>=70)
    printf("That's OK!\n");
    else
    printf("you need to play again.\n");
    printf("do you want to continue?  Y/N\n");
    for (;;)/* void */
    {
    yn=getch();
    switch (yn)
    {
    case 'y' :
    {
    if (score>=70)  return(true);
    else  return(false);
    }/* case */
    case 'n' : leave ();
    default : printf("Please input a correct choice:");
    }/* switch */
    }/* for */
}/* result */
/*---------------------------------------------------------------------*/
int start()/* 进入程序时调用该函数,提示其操作。 */
{
    char c;
    while (true)
    {
clrscr ();
        printf ("\n\n\n\n\n          Welcome to type game!\n\n\n          1.start\n          2.How to play\n          0.Exit");
        c=getch();
        switch (c)
    {
        case '0' : leave();/* 用户选择退出,退出主程序 */
        case '2' :
          {
  clrscr();
                   printf ("\n\n\n\n\n          Hit the type when you see it on the screen.\n          Press 0 to exit.\n          Press 1 to pause\n          1.start\n          0.exit");
                   while (true)
          {
                    c=getch ();
                        if (c=='0') leave();
                        if (c=='1') return (true);
          }
          }
        case '1' : return (true);
    }
    }
}
/*----------------------------------------------------------------------*/
 
void main()
{
    /*---------------------------------------------------------------------*/
    /*函数声明*/
    void printScreen(int level,int right,int sum,char p[yLine][xLine]);
    void leave();
    int levelChoice(int level);
    int newWord(int sum,char p[yLine][xLine]);
    int moving(int miss,char p[yLine][xLine]);
    int wordHit(char p[yLine][xLine]);
    int result(int right);
    int start();
    /*---------------------------------------------------------------------*/
    char p[yLine][xLine];
    int i,j,level,right,sum,n,m,miss;
    srand(time(NULL));
    start();
    for (i=0;i<yLine;i++)/* 初始化屏显数组 */
    {
    for (j=0;j<xLine;j++)
        if (j==0||j==xLine-1)
            p[i][j]=140;
        else
            p[i][j]=' ';
    }/* for (i) */
    level=levelChoice(level);
    for (;;)/* 开始运行主程序 */
    {   sum=0;
    right=0;
    miss=0;
    printf("Press any key to start!");
    m=getch();
    printScreen(level,right,sum,p);
    for (n=0,m=4;;n++)
    {
        delay(20);/* 延迟 */
          nosound();
        if(m%4==0)/* 当m为4的整数倍,即上一个字母下落3行时生成一个新的字母在首行并刷新屏幕 */
    {
        sum=newWord(sum,p);
        m=5;
        printScreen(level,right,sum,p);
        }/*if(newWord)*/
        if (wordHit(p)==true)/* 如果用户输入了字符并且正确,则使答对的数加一,并刷新屏幕 */
    {
        right++;
        sound (1500);
        printScreen(level,right,sum,p);
        }/* if(wordHit) */
        if(n==(37-4*level))/* 当n=37-4*level时,屏幕上的字母下落一行,并刷新屏幕,若最后一行有字母,则使错过数加一 */
    {
        n=0;
        m++;
        miss=moving(miss,p);
        printScreen(level,right,sum,p);
        }/* if (moving)*/
        if(right+miss==full) break;/* 当正确数加错误数等于预置的总字母个数时跳出该循环 */
    }
    if (result (right)==true&&level<9)/* 当用户成绩在70以上,并且等级小于9时,等级加一,即进入下一级别 */
        level++;
    }/* for(sum,right) */
}

#2


谢谢!可是我需要那种可以增加用户对照文本信息,用户可以选择需要进行练习打字的文本,可以对用户的错误进行统计并给出准确率,可以对不同用户的打字成绩进行查询和排序操作!求大神帮个忙,感激不尽!

#3


在此基础上添加就好了啊,无非是建立一个链表,加上排序的算法而已。

#4


知道了 谢谢!

#5


还不错还不错还不错还不错还不错还不错

#6


引用 1 楼 turingo 的回复:
C/C++ code?12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929……

赞个 c语言课程设计做一个打字软件 有什么好的思路吗

#7


引用 2 楼 spaldinglove 的回复:
谢谢!可是我需要那种可以增加用户对照文本信息,用户可以选择需要进行练习打字的文本,可以对用户的错误进行统计并给出准确率,可以对不同用户的打字成绩进行查询和排序操作!求大神帮个忙,感激不尽!

谷歌吧!  可以有个参考  

#1



 #include "stdio.h"
#include "time.h"
#include "stdlib.h"
#include "conio.h"
#include "dos.h"
#define xLine 70
#define yLine 20
#define full 100
#define true 1
#define false 0
/*---------------------------------------------------------------------*/
void printScreen(int level,int right,int sum,char p[yLine][xLine])/* 刷新屏幕的输出图像 */
{
    int i,j;
    clrscr();
    printf("level:%d             Press 0 to exit;1 to pause             score:%d/%d\n",level,right,sum);/* 输出现在的等级,击中数和现在已下落总数 */
    printf ("----------------------------------------------------------------------\n");
    for (i=0;i<yLine;i++)
    {
        for(j=0;j<xLine;j++)
            printf ("%c",p[i][j]);
        printf("\n");
    }/* for (i) */
printf ("----------------------------------------------------------------------\n");
}/* printScreen */
/*---------------------------------------------------------------------*/
void leave()/* 离开程序时,调用该函数结束程序。 */
{
    clrscr();
    printf ("\n\n\n\nThank you for playing.");
    delay (2500);
    exit (0);
}
/*----------------------------------------------------------------------*/
int levelChoice(int level)/* 进入游戏时选择游戏等级 */
{
 
    while (true)/* void */
    {
 
        clrscr ();
        printf("please input 1-9 to choice level.choice 0 to return.\n");
        level=getch();
        level=level-48;
        if (level>0&&level<10) return (level);
        else if (level==0)
            leave ();
        else
            printf ("Please input a correct number!\n");
    }/* while (true) */
}/* levelChoice */
/*---------------------------------------------------------------------*/
int newWord(int sum,char p[yLine][xLine])/* 随生成一个新的字符并将其加入数组的首行 */
{
    int j,w;
    if (sum!=full)
    {
    j=(rand()%(xLine-2))+1;
    w=(rand()%26)+65;
    p[0][j]=w;
    return (++sum);
    }/* if */
    return (sum);
}/* newWord */
/*---------------------------------------------------------------------*/
int moving(int miss,char p[yLine][xLine])/* 将最后一行置空,并使所有在数组中其他行的字符下降一行 */
{
    int i,j;
    char w;
    for (j=1,i=yLine-1;j<xLine-1;j++)/* 遍历最后一行的所有字符,如果该字符非空则将其置空并使miss加一 */
    {
        if (p[i][j]!=' ')
    {
            miss++;
            p[i][j]=' ';
    }
    }
    for (i=yLine-2;i>=0;i--)/* 从倒数第二行的最后一个字符开始开始向前遍历该数组内的元素,如果该位置非空则将该字符移动至下一行 */
    {
        for (j=xLine-2;j>0;j--)
    {
            if (p[i][j]!=' ')
    {
                w=p[i][j];
                p[i][j]=' ';
                p[i+1][j]=w;
            }/* if */
        }/* for(j) */
    }/* for(i) */
    return (miss);
}/* moving */
/*---------------------------------------------------------------------*/
int wordHit(char p[yLine][xLine])
/*判断是否有字符从键盘键入。
如果有,则从最后一行的最后一个元素开始遍历该数组,找出该字符,并把对应位置置空,且返回1。
如果有输入,但屏幕上无对应项,或无输入则返回0*/
{
    int i,j;
    char key;
    if(kbhit())/* 判断用户是否从键盘键入字符。如果kbhit返回值为 */
    key=getch();
    if(key)
    {
        if (key=='0') leave();
        if (key=='1')
    {
            clrscr();
            printf ("Press any key to continue.");
            getch();
    }
        for (i=yLine;i>0;i--)
    {
            for (j=xLine;j>0;j--)
    {
                if (key-32==p[i-1][j-1])
        {
                    p[i-1][j-1]=' ';
                    return (true);
                }/* if */
            }/* for (j) */
        }/* for (i) */
        sound(300);
    }/* if (key) */
    return (false);
}/* wordHit */
/*---------------------------------------------------------------------*/
int result(int right)
/*判断该次的成绩并输出对应的结果,询问用户是否继续,若继续,判断是否可以进入下一级别。*/
{
    int score;
    char yn;
    score=right*100/full;
    nosound();
    clrscr();
    if (score==100)
    printf("perfect!\n");
    else if (score>=85)
    printf("good!\n");
    else if (score>=70)
    printf("That's OK!\n");
    else
    printf("you need to play again.\n");
    printf("do you want to continue?  Y/N\n");
    for (;;)/* void */
    {
    yn=getch();
    switch (yn)
    {
    case 'y' :
    {
    if (score>=70)  return(true);
    else  return(false);
    }/* case */
    case 'n' : leave ();
    default : printf("Please input a correct choice:");
    }/* switch */
    }/* for */
}/* result */
/*---------------------------------------------------------------------*/
int start()/* 进入程序时调用该函数,提示其操作。 */
{
    char c;
    while (true)
    {
clrscr ();
        printf ("\n\n\n\n\n          Welcome to type game!\n\n\n          1.start\n          2.How to play\n          0.Exit");
        c=getch();
        switch (c)
    {
        case '0' : leave();/* 用户选择退出,退出主程序 */
        case '2' :
          {
  clrscr();
                   printf ("\n\n\n\n\n          Hit the type when you see it on the screen.\n          Press 0 to exit.\n          Press 1 to pause\n          1.start\n          0.exit");
                   while (true)
          {
                    c=getch ();
                        if (c=='0') leave();
                        if (c=='1') return (true);
          }
          }
        case '1' : return (true);
    }
    }
}
/*----------------------------------------------------------------------*/
 
void main()
{
    /*---------------------------------------------------------------------*/
    /*函数声明*/
    void printScreen(int level,int right,int sum,char p[yLine][xLine]);
    void leave();
    int levelChoice(int level);
    int newWord(int sum,char p[yLine][xLine]);
    int moving(int miss,char p[yLine][xLine]);
    int wordHit(char p[yLine][xLine]);
    int result(int right);
    int start();
    /*---------------------------------------------------------------------*/
    char p[yLine][xLine];
    int i,j,level,right,sum,n,m,miss;
    srand(time(NULL));
    start();
    for (i=0;i<yLine;i++)/* 初始化屏显数组 */
    {
    for (j=0;j<xLine;j++)
        if (j==0||j==xLine-1)
            p[i][j]=140;
        else
            p[i][j]=' ';
    }/* for (i) */
    level=levelChoice(level);
    for (;;)/* 开始运行主程序 */
    {   sum=0;
    right=0;
    miss=0;
    printf("Press any key to start!");
    m=getch();
    printScreen(level,right,sum,p);
    for (n=0,m=4;;n++)
    {
        delay(20);/* 延迟 */
          nosound();
        if(m%4==0)/* 当m为4的整数倍,即上一个字母下落3行时生成一个新的字母在首行并刷新屏幕 */
    {
        sum=newWord(sum,p);
        m=5;
        printScreen(level,right,sum,p);
        }/*if(newWord)*/
        if (wordHit(p)==true)/* 如果用户输入了字符并且正确,则使答对的数加一,并刷新屏幕 */
    {
        right++;
        sound (1500);
        printScreen(level,right,sum,p);
        }/* if(wordHit) */
        if(n==(37-4*level))/* 当n=37-4*level时,屏幕上的字母下落一行,并刷新屏幕,若最后一行有字母,则使错过数加一 */
    {
        n=0;
        m++;
        miss=moving(miss,p);
        printScreen(level,right,sum,p);
        }/* if (moving)*/
        if(right+miss==full) break;/* 当正确数加错误数等于预置的总字母个数时跳出该循环 */
    }
    if (result (right)==true&&level<9)/* 当用户成绩在70以上,并且等级小于9时,等级加一,即进入下一级别 */
        level++;
    }/* for(sum,right) */
}

#2


谢谢!可是我需要那种可以增加用户对照文本信息,用户可以选择需要进行练习打字的文本,可以对用户的错误进行统计并给出准确率,可以对不同用户的打字成绩进行查询和排序操作!求大神帮个忙,感激不尽!

#3


在此基础上添加就好了啊,无非是建立一个链表,加上排序的算法而已。

#4


知道了 谢谢!

#5


还不错还不错还不错还不错还不错还不错

#6


引用 1 楼 turingo 的回复:
C/C++ code?12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929……

赞个 c语言课程设计做一个打字软件 有什么好的思路吗

#7


引用 2 楼 spaldinglove 的回复:
谢谢!可是我需要那种可以增加用户对照文本信息,用户可以选择需要进行练习打字的文本,可以对用户的错误进行统计并给出准确率,可以对不同用户的打字成绩进行查询和排序操作!求大神帮个忙,感激不尽!

谷歌吧!  可以有个参考