首页资源分类其它科学普及 > 一个打字游戏程序

一个打字游戏程序

已有 445110个资源

下载专区

上传者其他资源

    文档信息举报收藏

    标    签:WC

    分    享:

    文档简介

    wc上运行的打字游戏。

    文档预览

    #include typedef struct{ char word[20]; short int x; short int y; short int clnum; }WORD; typedef struct //这部分使用了白洪欢老师那里下载的字典与老师文件中自带的语句 { char entry[20]; /* 条目, 单词最长20个字母; 当单词刚好20个字母时, 不用'\0'结束 */ long lib_offset; /* 单词解释的偏移量(该偏移量是指字典正文文件dict.lib中的fseek距离) */ short int xlat_len; /* 单词解释占用的字节数 */ short int exam_len; /* 单词例句占用的字节数 */ } IDX; IDX *pdic; // 字典中首个单词指针 int entries; // 字典中的单词个数 WORD w[25]; // 显示在屏幕上的单词 int index[26][2]; // index[i][0]: ('a'+i)字母开头的首个单词在字典中的序号 // index[i][1]: ('a'+i)字母开头的单词个数 int screen_words; // 屏幕上已显示的单词总数 int stop = 0; int words_list=0, words_hit=0, words_lost=0; int tap = 0; float hit_rate=0; void putsxy(int x, int y, char *s, int num) { char *vp = _vp + (y*_width+x)*2; int i = 0; while(s[i] != '\0') { *vp = s[i]; if (i < num) { *(vp+1) = GREEN; } else *(vp+1) = WHITE; vp += 2; i++; } } void move_words_down() {int i; char *p; clrscr(); if (screen_words < 25) { for (i = 0;i < screen_words;i++ ) { putsxy(w[i].x,w[i].y,w[i].word,w[i].clnum); w[i].y++; } } else if (screen_words = 25) { if (w[0].word[0] != '\0') {words_lost++; if (w[0].clnum != 0) { tap = 0; } } for (i = 0;i < 24 ;i++ ) { w[i] = w[i+1]; } for (i = 0;i < 24 ; i++ ) {putsxy(w[i].x,w[i].y,w[i].word,w[i].clnum); w[i].y++; } } } int read_dic(IDX **ppdic) { FILE *fp; IDX *pdic; int len, entries; int i, begin; fp = fopen("dict.idx", "rb"); if(fp == NULL) return 0; fseek(fp, 0, SEEK_END); len = ftell(fp); fseek(fp, 0, SEEK_SET); entries = len / sizeof(IDX); pdic = malloc(entries*sizeof(IDX)); if(pdic == NULL) return 0; fread(pdic, sizeof(IDX), entries, fp); fclose(fp); *ppdic = pdic; begin = 0; for(i=0; i<26; i++) { while(begin < entries) { if((pdic[begin].entry[0] | 0x20) == 'a'+i) break; begin++; } index[i][0] = begin; if(i>0) index[i-1][1] = begin - index[i-1][0]; } index[i-1][1] = entries - begin; return entries; } int all_alpha(char *p) { int i, n=strlen(p); for(i=0; i=0; j--) if(mark[j] == 0) break; } do { i = random(index[j][1])+index[j][0]; } while(!all_alpha(pdic[i].entry)); memset(w[screen_words].word, 0, sizeof(w[0].word)); strncpy(w[screen_words].word, pdic[i].entry, 20); w[screen_words].y = 0; w[screen_words].x = random(80-strlen(w[screen_words].word)); w[screen_words].clnum = 0; screen_words++; words_list++; } void show_score() { char *p = _vp + (24*_width)*2 + 1; int i; gotoxy(1,25); hit_rate = ((float)words_hit)/words_list; printf("total = %d ; hit = %d ; miss = %d ; rate = %.4lf ;", words_list, words_hit, words_lost,hit_rate); for (i = 0; i < 60 ; i++, p+=2 ) { *p = (BLUE<<4) + WHITE; } fflush(stdout); } main() { int key, k; int time =2000; randomize(); // 随机数初始化 entries = read_dic(&pdic); // 读取字典的条目 // entries=单词个数 // pdic->首个单词 memset(w, 0, sizeof(w)); // 初始化屏幕上的25个单词 screen_words = 0; // 屏幕上已显示的单词个数 clrscr(); // 清屏 while(!stop) // 当按Esc时, stop=1 { generate_one_word(); // 数组末尾增加一个新单词 move_words_down();// 屏幕上各单词往下移动一行 show_score(); if (time >= 500) {delay(time); time -= 50; } else delay(500); if (tap == 1 && screen_words ==25) {k--; screen_words--; } while(bioskey(1) != 0) // if the keyboard buffer holds some keys { key = bioskey(0) & 0xFF; // convert scan code to ASCII if(key == 0x1B) // Esc is pressed { stop = 1; break; } if (tap == 0) {if (key >='a' && key <= 'z') { for (k = 0;k < screen_words ;k++ ) { if (key == w[k].word[0]) {w[k].clnum++; tap = 1; break; } } } } else if (tap == 1) { if (key >= 'a' && key <= 'z') { if (key == w[k].word[w[k].clnum]) {w[k].clnum++; if (w[k].clnum == (strlen(w[k].word)) || w[k].clnum == 20) { words_hit++; tap = 0; w[k].clnum = 0; strcpy(w[k].word,"\0"); } } } } } if (screen_words == 25) { screen_words--; } } clrscr(); puts("Done!"); return 0; }

    Top_arrow
    回到顶部
    EEWORLD下载中心所有资源均来自网友分享,如有侵权,请发送举报邮件到客服邮箱bbs_service@eeworld.com.cn 或通过站内短信息或QQ:273568022联系管理员 高进,我们会尽快处理。