c语言制作一个简单的打字游戏(落下一个字母按相应字母消去,记录分数) c语言打字游戏

\u6025\u6c42\u4e00\u4efdC\u8bed\u8a00\u6253\u5b57\u6e38\u620f\u4ee3\u7801\uff0c\u8981\u6c42\u5355\u8bcd\u4ece\u5c4f\u5e55\u4e0a\u65b9\u843d\u4e0b\uff0c\u6253\u5b57\u6b63\u786e\u5b57\u6bcd\u53d8\u4e3a\u7eff\u8272\u3002

#include
#include
#include
#include
#include
#include

#define R 10
#define ESC 0x011b
#define LOW 0x5000
#define FAST 0x4800
int draw_car(int x,int y,char *ch);
double dalta=20,angle;

void *image;
int step=20;
main()
{

int gdriver=DETECT,gmode;
static int startx=60;
static int starty=20;
int maxy,maxx,l=1,n=1;
char ch,play, str[2];
int size,temch;
int ok,y=50;

clrscr();

printf("\n\n\n\n\n*****************************************\n");

printf(" 1.play only number 0-9 .\n");
printf(" 2.play only char a-z .\n");
printf(" 3.exit\n");
printf("*****************************************\n");
while(1){
printf("\nPls enter choice:");
play=getche();
if((play=='1')||(play=='2'))
break;

if(play=='3')
return;
}

registerbgidriver( EGAVGA_driver ); /*\u6ce8\u518cvga\u9a71\u52a8*/
initgraph(&gdriver,&gmode,"d:\\tc3\\bgi"); /*\u521d\u59cb\u5316\u56fe\u5f62\u754c\u9762*/
cleardevice(); /*\u6e05\u9664\u5c4f\u5e55*/
setbkcolor(BLUE); /*\u5c06\u80cc\u666f\u8272\u8bbe\u7f6e\u6210\u84dd\u8272*/
size=imagesize(startx,starty,startx+60,starty+60); /*\u8ba1\u7b97\u751f\u621060\u00d760\u4e2a\u8c61\u7d20\u7684\u56fe\u9700\u8981\u7684\u5b57\u8282\u6570*/
image=(unsigned char *)malloc(size); /*\u5206\u914d\u5185\u5b58*/
maxx=getmaxx();
maxy=getmaxy();
randomize();

printf("Press ESC to exit game! ");
printf(" %c to fast speed,%c to low speed!",24,25);
do{

ok=0;
if(play=='1')
ch=random(9)+48;
if(play=='2')
ch=random(26)+65;
str[0]=ch;
do{

while(bioskey(1)==0) /*\u5982\u679c\u6ca1\u6709\u6309\u952e\u5c31\u4e0d\u505c\u7684\u5faa\u73af*/
{
if(l==1) /*\u4ece\u5de6\u5230\u53f3*/
{
n++;
angle=-1*(n*step)/M_PI*180/R;
if((int)(-1*angle)%360<dalta)
angle-=dalta;
if(n>(maxx-180)/step){
if(starty>maxy-100)
starty=20;
else
starty+=y;

l=0;
}
}
if(l==0) /*\u4ece\u53f3\u5230\u5de6*/
{
--n;
angle=-1*(n*step)/R/M_PI*180;
if((int)(-1*angle)%360<dalta)
angle-=dalta;

if(n==1){
if(starty>maxy-100)
starty=20;
else
starty+=y;

l=1;
}
}

draw_car(startx+n*step,starty,str);
}

temch=bioskey(0);
if(temch==FAST){
step+=10;
y+=10;
}
if(temch==LOW){
step-=10;
y-=10;
}
ok=temch&0x00ff;

if((ok==ch)||(ok==ch+32)){
ok=1;
starty=20;
break;
}

}while(temch!=ESC);
if(ok!=1)
break;
}while(1);
free(image);
closegraph();
return;
}

int draw_car(int x,int y,char *ch){
setcolor(YELLOW); /*\u8bbe\u7f6e\u524d\u666f\u8272\u4e3a\u9ec4\u8272*/
rectangle(x,y,x+60,y+40); /*\u753b\u8f66\u53a2*/

pieslice(x+15,y+50,angle,angle-dalta,10); /*\u753b\u8f6e\u4e0a\u7684\u5c0f\u7247\u6247\u5f62\u90e8\u5206*/
pieslice(x+45,y+50,angle,angle-dalta,10);

setfillstyle(SOLID_FILL, YELLOW); /*\u8bbe\u7f6e\u586b\u5145\u6a21\u5f0f\u4e3a\u5b9e\u586b\u5145\uff0c\u989c\u8272\u4e3a\u9ec4\u8272*/
circle(x+15,y+50,10); /*\u753b\u8f66\u8f6e*/
circle(x+45,y+50,10);
circle(x+15,y+50,3);
circle(x+45,y+50,3);
setcolor(WHITE);
settextstyle(1,0,4);
outtextxy(x+25,y,ch);
getimage(x,y,x+60,y+60,image); /*\u83b7\u53d6\u5f53\u524d\u7684\u56fe\u7247*/
delay(200);
putimage(x,y,image,XOR_PUT); /*\u4f7f\u7528\u5f02\u6216\u6a21\u5f0f\u5c06\u56fe\u7247\u663e\u793a\u4e0a\u53bb*/

return;
}

#include
#include
main()
{
int i;
int line=0,col=0,num=0;
int score=0,times=1;
char one[26];
char c;

for(i=0,c='a';i<26;i++,c++) /* \u628aa~z\u8d4b\u7ed9\u6570\u7ec4 */
{
one[i]=c;
}
center();
printf("press anykey to start");
getch();

while(1)
{ system("cls");
printf("times:%d ",times); /* \u6253\u5370\u5173\u6570 */
printf(" score: %d",score); /* \u6253\u5370\u5206\u6570 */
printf(" 1----Pause,0----exit");
printf("\n");
printf("________________________________________________________________________");
printf("\n");

line=0;
randomize();
col=random(60);
randomize();
num=random(26);

while(1) /* \u5f00\u59cb\u4e0b\u843d */
{
space(col);
printf("%c",one[num]); /* \u6253\u5370\u51fa\u5b57\u6bcd */
delay_x(10-times);
printf("\b \n");
line++;

if(line>45)
{
score-=10;
break;
}
if(score<0)
{
center();
printf("sorry,you faile!");
getch();
exit(0);
}

if(kbhit()) /* \u5982\u679c\u6709\u952e\u6309\u4e0b */
{
c=getch(); /* \u63a5\u6536\u8f93\u5165\u7684\u5b57\u7b26 */
if(c==one[num])
{

score+=10;
break;
}
switch(c)
{
case '0': exit(0);
case '1': getch();
default : ;
}
}
}

if(score>=100*times) /* \u4e00\u5173\u5b8c\u6bd5 */
{
times++;
center();
if(times>9)
{
printf("congratulation,you win!");
}
printf("If you go to the %d:(y/n)",times);
if((getch())=='n')
{
center();
printf("I am sorry for you give up!");
getch();
break;
}
}
} /* end of while */
} /* end of main */
/*************************** \u5b9a\u4e49\u6362\u884c\u51fd\u6570 *********************************/
change_line(int k)
{ int i;
for(i=0;i<k;i++)
{
printf("\n");
}
}
/**************************** \u6253\u5370\u7a7a\u683c\u51fd\u6570 ********************************/
space(int k)
{ int i;
for(i=0;i<k;i++)
{
printf(" ");
}
}
/************************** \u5ef6\u65f6\u51fd\u6570 ************************************/
delay_x(int k)
{
int i;
for(i=0;i<k;i++)
{
delay(5000);
}
}
/******************* \u8ba9\u5149\u6807\u5c45\u4e2d\uff08\u504f\u5de6\uff09\u51fd\u6570 ************************/
center()
{
system("cls");
change_line(20);
space(25);
}

游戏常量参数自行修改(字母的列数,下落最大高度,下落速度等)。

程序功能:(随机生成字母,下落,并检查按键,计分)

多线程按键检查采用新的线程与主线程同步。

独立速度:每个字母下落速度都是随机且不相同。

玩法:按键区分大小写,落到底部或被玩家按中,下落中的字母就会消失,并在该列顶部创建新的字母下落,按中1次记1分。

注意:由于字母都是随机的,如果同时下落的字母很多,可能会有重复字母出现,如果按键对应了多个同样的字母,这些字母会删掉并新建,也就是说出现按中一次记多分,说明有多个重复字母,不是BUG!

#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <conio.h>
#include <time.h>
#include <windows.h>
#define W 30//宽度
#define H 20//高度
#define MinSPEED 50//最慢下降速度(周期,数字越小越快)
#define MAXSPEED 5//最快下降速度
int score=0;//总分
typedef struct letter
{
     int ascii;// 字母ASCII码
     int hIndex;//对应打印数组行下标
     int wIndex;//对应打印数组列下标
     int cnt;//周期计数,当cnt==speed,hIndex++并且cnt重新置0
     int speed;//下降速度
     int key;//0表示没有被按中,1表示被按中
     struct letter *next;
}LETR;
void meError(void *p);//内存申请失败
LETR *newLETR(LETR *letrHead,LETR*letrTail,int wIndex);//产生一个新的字母,并添加到链表,返回尾节点
LETR* delLETR(LETR *letrHead,LETR*letrTail,int wIndex);//删除列下标的字母节点,返回新的尾节点
LETR *init(LETR *letrHead);//初始化一组字母,返回链表尾节点
LETR *showList(LETR *letrHead,LETR*letrTail);//显示列表并检查,发现到底或被按键按中的字母删除并新建新的字母,返回新的尾节点
void runLetter(LETR *letrHead);//所有字母一周期计数
DWORD WINAPI checkKey(LPVOID lpParameter);//新线程
int main()
{
    int i;
    LETR *letrHead=NULL,*letrTail=NULL;
    letrHead=(LETR *)malloc(sizeof(LETR));
    meError(letrHead);
    letrHead->next=NULL;
    srand(time(NULL));
    letrTail=init(letrHead);
    CreateThread(NULL,0,checkKey,letrHead,0,NULL);
    letrTail=showList(letrHead,letrTail);
    while(1)
    {
        system("cls");
        printf("总分:%d
",score);
        for(i=0;i<W;i++)
            printf("-");
        printf("
");
        runLetter(letrHead);
        letrTail=showList(letrHead,letrTail);
        for(i=0;i<W;i++)
            printf("-");
        printf("
");
    }
    return 0;
}
DWORD WINAPI checkKey(LPVOID lpParameter)
{
char c;
LETR *letrHead=NULL;
while(1)
    {
        letrHead=(LETR *)lpParameter;
        c=getch();
        while(letrHead->next)
        {
            if(c==letrHead->next->ascii)
                letrHead->next->key=1,score++;//按键标识置1,考虑可能有多个相同随机字母,故用标识,在显示函数统一删除并新建
            letrHead=letrHead->next;
        }
    }
return 0;
}
void runLetter(LETR *letrHead)//所有字母一周期计数
{
    while(letrHead->next)
    {
        if(letrHead->cnt<letrHead->speed)
            letrHead->cnt++;
        else
            (letrHead->next->hIndex)++,letrHead->cnt=0;
        letrHead=letrHead->next;
    }
}
LETR *showList(LETR *letrHead,LETR*letrTail)//显示列表并检查,发现到底或被按键按中的字母删除并新建新的字母,返回新的尾节点
{
    int i,j,wIndex;
    char sp[H][W];
    LETR *head=letrHead;
    for(i=0;i<H;i++)
        for(j=0;j<W;j++)
            sp[i][j]=' ';
    while(letrHead->next)
    {
        if(letrHead->next->hIndex>H-1 || letrHead->next->key==1)//到底或者被按中就删除并新建,重新循环
        {
            wIndex=letrHead->next->wIndex;
            letrTail=delLETR(head,letrTail,wIndex);
            letrTail=newLETR(head,letrTail,wIndex);
            letrHead=head;
        }
        else
            sp[letrHead->next->hIndex][letrHead->next->wIndex]=letrHead->next->ascii;

        letrHead=letrHead->next;
    }
    for(i=0;i<H;i++,printf("
"))
        for(j=0;j<W;j++)
            printf("%c",sp[i][j]);
    return letrTail;
}

LETR *init(LETR *letrHead)//初始化一组字母,返回链表尾节点
{
    int i;
    LETR*letrTail=NULL;
    for(i=0;i<W;i++)
        letrTail=newLETR(letrHead,letrTail,i);
    return letrTail;
}
LETR *newLETR(LETR *letrHead,LETR*letrTail,int wIndex)//在列下标wIndex首行,产生一个新的字母,并添加到链表,返回尾节点
{
    int n;
    LETR *leterNEW=(LETR *)malloc(sizeof(LETR));
    meError(leterNEW);
    leterNEW->next=NULL;
    n=rand()%2;
    if(n)//随机大小写
        leterNEW->ascii=rand()%26+65;//随机一个大写字母
    else
        leterNEW->ascii=rand()%26+97;//随机一个小写字母
    leterNEW->hIndex=0;
    leterNEW->wIndex=wIndex;
    leterNEW->cnt=0;
    leterNEW->speed=rand()%(MinSPEED-MAXSPEED)+1+MAXSPEED;
    leterNEW->key=0;
    if(letrHead->next==NULL)
        letrHead->next=leterNEW;
    else
        letrTail->next=leterNEW;
    letrTail=leterNEW;
    return letrTail;
}
LETR* delLETR(LETR *letrHead,LETR*letrTail,int wIndex)//删除列下标的字母节点,返回新的尾节点
{
    LETR *lhead=letrHead,*letrDel=NULL;
    while(letrHead->next)
    {
        if(letrHead->next->wIndex==wIndex)
        {
            letrDel=letrHead->next;
            letrHead->next=letrHead->next->next;
            free(letrDel);
            break;
        }
        letrHead=letrHead->next;
    }
    letrHead=lhead;
    while(letrHead->next)//重置尾节点
        letrHead=letrHead->next;
    return letrHead;
}
void meError(void *p)//内存申请失败
{
    if(p==NULL)
    {
        printf("
异常:内存申请失败!回车结束程序!
");
        while(getch()!='');
        exit(0);
    }
}


  • C璇█鎵撳瓧娓告垙vc鐜
    绛旓細棣栧厛锛岃緭鍏ュ瓧姣嶇殑鏃跺欙紝浣犺瑙e喅杈撳叆杩涙潵锛岀劧鍚庝笉鏄剧ず鍦ㄥ睆骞曚笂锛涙帴鐫锛屽垽鏂繖涓瓧姣嶇涓嶇鍚堣姹傦紝鐒跺悗璁剧疆瀛楃殑棰滆壊锛屽苟鏄剧ず锛岃屼笖鎾斁澹伴煶銆傚綋瀛楁瘝杈撳叆瀹屼箣鍚庯紝灏辫绠楁甯哥巼锛岀鍚堣姹傝繘鍏ヤ笅涓鍏筹紝涓嶇鍚堝氨閲嶆潵杩欎竴鍏炽傚湪娓告垙杩囩▼涓紝杈撳叆涓涓鐗瑰畾鐨勬寜閿紝閫鍑烘父鎴忋傛墍浠ワ紝瑙e喅闂锛氣憼鎸夐敭鍚庯紝鐣岄潰涓嶆樉绀...
  • 鎵撳瓧缁冧範杞欢 C璇█绋嬪簭
    绛旓細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 pri...
  • 姹c璇█鑻辨枃鎵撳瓧缁冧範绋嬪簭
    绛旓細姹c璇█鑻辨枃鎵撳瓧缁冧範绋嬪簭 80 鍔熻兘瑕佹眰濡備笅:1)绋嬪簭寮濮嬪悗棣栧厛鏄粌涔犳ā寮忛夋嫨鐣岄潰,鏈変笁绉嶇粌涔犳ā寮忓彲浠ラ夋嫨,鍒嗗埆鏄崟璇嶇粌涔犲拰鏂囨湰缁冧範銆2)鍗曡瘝缁冧範:瑕佹眰鍦ㄥ睆骞曚笂缁樺埗涓変釜绐楀彛,涓涓鐢ㄦ潵鏄剧ず鐢ㄦ埛杈撳叆,涓涓敤鏉... 鍔熻兘瑕佹眰濡備笅:1)绋嬪簭寮濮嬪悗棣栧厛鏄粌涔犳ā寮忛夋嫨鐣岄潰,鏈変笁绉嶇粌涔犳ā寮忓彲浠ラ夋嫨,鍒嗗埆鏄崟璇嶇粌涔犲拰鏂囨湰缁冧範銆
  • 璋佽兘鐢C璇█甯垜璁捐涓涓灏忓皬鐨勬父鎴- -銆傘(C++)
    绛旓細for (p = 1; p <= N * N; p++){ weizhi[p].x[p] = zouqihang();weizhi[p].y[p] = zouqilie();save(p);showqi(p);panduan(p);} if (p == N * N)heqi();over();} /***寤虹珛妫嬬洏 ***/ void initqipan(){ int i, j;for (i = 0; i < N; i++){ pri...
  • 鐢C璇█for璇彞璁捐涓涓皬娓告垙
    绛旓細鎴戝啓涓涓鐚滄暟瀛娓告垙鍚э紒锛/*鐚滄暟瀛楁父鎴忥細璁$畻鏈洪殢鏈虹粰鍑轰竴涓1锝100涔嬮棿鐨勬暟锛屼綘杈撳叆涓涓暟锛岀▼搴忓垽鏂槸鍚︽槸绋嬪簭 閫夊畾鐨勯偅涓暟瀛楋紝濡傛灉涓嶆纭紝绋嬪簭浼氬憡璇変綘澶т簬鎴栬呭皬浜庤繖涓暟鐨勬彁绀猴紝濡傦細绋嬪簭閫夋嫨鏄7锛屼綘杈撳叆8锛屽垯鎻愮ず澶т簬浜嗭紝缁欎綘鐚10娆*/ include <stdio.h> main(){int i,guess,number;number...
  • c璇█鐨勬墦瀛楁父鎴 涓轰粈涔堣緭鍏SC
    绛旓細鏁睧SC娌″弽搴旓紱鍗曞嚮鍥炶溅锛屾湁鍙嶅簲鍚楋紵鏄剧劧浣犱篃琚玤etchar鐨勫瓧闈㈡剰涔夋墍娆洪獥浜嗭綖杩欐槸C璇█鍏ラ棬鐨涓涓鍧庯紱浜嬪疄涓婂湪鎸変笅鍥炶溅涔嬪墠浣犺緭鍏ョ殑浠绘剰瀛楃閮戒笉浼氬弽搴旂殑锛岄櫎闈烇紞锛嶄綘閿叆ctrl-c銆
  • C璇█缂栧啓鎵撳瓧娓告垙鍑洪棶棰
    绛旓細璇锋妸婧愪唬鐮佸彂涓涓嬶紝 涓鑸嚭鐜拌繖绉嶆儏鍐典负涓涓嬪嚑绉嶇姸鍐碉細鍐呭瓨鍑洪敊锛堟孩鍑猴級浠g爜鍦ㄨ繍琛屾椂鍑虹幇閿欒锛堜緥濡:scanf("%d", &a)娌℃湁鍐&鍙栧湴鍧锛夌郴缁熶笉鍏煎缂栬瘧鍣ㄦ湰韬垨閲岄潰鐨勪竴浜涚粍浠 鑳戒笉鑳介棶鐨勮缁嗙偣
  • 姹備釜C璇█绋嬪簭棰
    绛旓細缂栬瘧鏃朵娇鐢 gcc XX.c -lcurses include <stdio.h> include include <stdlib.h> include <curses.h> void initrch(char *a,int n){ int i;for (i=0;i<n;i++) a[i]=rand()%26+'a';} void prtrch(char *a,int n){ int i;for(i=0;i<n;++i) { addch(a[i]);addch(...
  • c璇█ 鐚滄暟瀛
    绛旓細绋嬪簭鏈夌偣闀匡紝鎬庝箞缁欎綘鍛...typedef struct { char name[20];/* field of name */ int score;/* field of score */ }player;鍏充簬杩欎釜灏辫繖涔堝鍚э紝瀹炲湪涓嶆兂鎵撳瓧浜嗐
  • 濡備綍閫氳繃娓告垙瀛c
    绛旓細閫氳繃涓嶆柇缁冧範锛屼綘浼氭洿鍔犺嚜淇″湴浣跨敤C璇█缂栧啓绋嬪簭銆傜粨璁 閫氳繃娓告垙瀛︿範C璇█鏄竴绉嶉潪甯告湁瓒g殑鏂规硶銆傝繖绉嶆柟娉曚笉浠呭彲浠ュ府鍔╁垵瀛﹁呮洿蹇湴浜嗚ВC璇█锛岃屼笖杩樺彲浠ュ姞寮轰粬浠殑鎶鑳藉拰鐭ヨ瘑姘村钩銆備笉鏂噸澶嶇粌涔犳槸鎻愰珮鎶鑳藉拰鐭ヨ瘑姘村钩鐨勫叧閿傚洜姝わ紝閫氳繃娓告垙瀛︿範C璇█鏄竴绉嶆柊棰栬屾湁鏁堢殑鏂规硶銆
  • 扩展阅读:如何自己编程做游戏 ... 如何自己编程一个软件 ... 自己编程做游戏的软件 ... 金山打字练习小游戏 ... 初学编程必背50个 ... cnc编程必背50个程序 ... 纯打字聊天游戏 ... 国家免费编程平台 ... 简单的编程小游戏教程 ...

    本站交流只代表网友个人观点,与本站立场无关
    欢迎反馈与建议,请联系电邮
    2024© 车视网