‘壹’ c语言打字母游戏中控制字母下落速度的函数是什么
用clock()函数编写一个延迟函数,比如:
void wait(int ms){ //ms为要等待的毫秒数
clock_t t;
t=clock();
while(t+ms>clock());
}
‘贰’ 用C语言编写一个简单的打字母游戏,给出基本思路及完整程序。
# include<stdio.h>
# include <conio.h>
# include <graphics.h>
# include <time.h>
# pragma comment(lib,”Winmm.lib”) //引用Windows Multimedia APT
int score =0; //全局变量********整型的分数
char s[5]; //全局变量****字符型的分数
struct player_ //自定义的结构体,并顺便定义一个结构体变量
{
char name[20];
int score_;
}player[11];
/***************函数声明*****************/
void record_(); //记录彼此成绩函数
void welcome( ); //欢迎界面函数
void instructions( ); //游戏说明界面函数
void gane (int rank2); //游戏函数
void record ( ); //显示记录函数
int rank_(char rank1); //等级选择函数
void goodbye ( ); //退出界面函数
/**************主函数**************/
int main ()
{
char rank1; //rank1接受从键盘输入的字符,根据字符判断等级
int rank2=15; // 控制延时时间,从而控制速度
intsign=1; // 当做标记,用于标记是否弹出MessageBox对话框
welcome ( ); //调用欢迎界面函数
instructions ( ); //调用游戏什么函数
record( ); //调用显示记录函数
InputBox(player[10].name,20,"请输入玩家昵称"; //以对话框形式获取用户输入函数
rank1=getch();//读入一个字母
rank2=rank_(rank1); //调用等级函数
game (rank2); //调用游戏函数
HWND wnd =GetHWnd();
while (sign) //sign作为标记,执行循环
if (MessageBox(wnd,"游戏结束!!!\n再来一局,挑战更高分数","询问",MB_YESNO|MB_ICONQUESTION)==IDYES)
game (rank2);
else
{
sign=0;
goodbye( );
}
closegraph( );
return 0;
}
/***************记录本次成绩函数***************/
void record_()
{
FILE*fp; //文件指针
int i,j;
struct player_t; //定义结构体变量t,冒泡法比较大小时用
player[10].score_=score; //把该局的分数赋给该局用户的结构体变量中
fp=fopen("记录.dat","rb"); //打开二进制文件
for (i=0;i<10;i++)
{
fread(player[i].name,20,l,fp); //读入记录中的成绩和名字
fread (&player[i].score_,4,l,fp);
}
fclose(fp); //关闭二进制文件
for (j=0;j<10;j++) //冒泡法排序
for (i=0;i<10-j;i++)
if (player[i].score_)
{
t=player[i];
player[i]=player[i+1];
player[i+1]=t;
}
fp=fopen("记录.dat","wb"); //打开文件
for (i=0;i<10;i++) //把排好序列的数据存入记录文件
{
fwrite(player[i].name,20,l,fp);
fwrite (&player[i].score_,4,l,fp);
}
fclose(fp); //关闭文件
}
/****************欢迎界面函数****************/
void welcome ( )
{
char ch;
mciSendString("open\"res\\Sleep Away.mp3\"alias mymusic",NULL,0,NULL);
initgraph(640,480); //初始化画图界面
IMAGE img; //定义IMAGE对象
loadimage (&img,"res\\00.jpg"); //读取图片到img对象中
putimage (0,0,&img); //在坐标(0,0)位置显示IMAGE对象
ch=getch(); //吸收掉一个按键
cleardevice(); //清屏
}
/***************游戏说明界面函数**************/
void instructions()
{
int c=255; //控制变色的变量
setcolor(YELLOW); //设置颜色
setfont (30,0,"黑体"); //设置字体
outtextxy(0,0,"游戏说明"); //输出文字
setcolor(WHITE);
setfont(28,0,"宋体");
outtextxy(0,30,"一、每次游戏下落200个字母"); //输出文字
outtextxy(0,58,"二、请按数字键选择游戏等级");
outtextxy(0,86,"三、统计被击中的个数");
setfont(30,0,"华文行楷")
outtextxy (20,220,"等级一二三四 五六七八九");
outtextxy(20,260,“按键 1 2 3 4 5 6 7 8 9”);
while (!kbhit()) //kihit()作用是判断是否有字幕输入
{
setcolor(RGB(c,255,0));
setfont (80,0,"楷体");
outtextxy(140,130,"请选择等级");
setcolor(RGB(c,0,255));
setfont(100,0,"Wickenden Cafe NDP");
outtextxy(100,135,"Let's go!!!");
c-=25; //控制颜色的变量自减
if(c<0)c=255; //控制颜色的变量小于0时,再把255赋给c
cleardevice(); //清屏
}
/***************退出界面函数***************/
void goodbye()
{
int c=255; //控制变色变量
cleardevice(); //清屏
setcolor(YELLOW);
setfont (48,0,"黑体");
outtextxy (104,120,"的最终成绩是: ");
setfont (48,0,"华文楷体");
setcolor(RGB(255,255,0));
outtextxy(140,320,"按任意键退出游戏");
setcolor(YELLOW);
setfont(48,0,"黑体");
outtextxy (104,120,"的最终成绩是: ");
outtextxy(104,70,player[10].name);
record_(); //调用记录本次成绩函数
while(!kbhit())
{
setcolor(RGB(255,0,c-100)); //设置颜色
setfont(100,0,”Wickenden Café NDP”);
outtextxy(400,90,s); //输出数字
setcolor(RGB(c,0,255));
setfont(48,0,”黑体”);
if (score==200)
outtextxy(100,200,”全部击中!!!”);
else
if(score>190)
outtextxy(100,200,”不错!继续加油!”);
else
outtextxy(100,200,”不要灰心!继续加油!”);
c-=25;
if(c<0)
c=255;
Sleeep(20); //延时20秒
}
getch( ); //提供给用户时需要等待输入后再退出
}
/**************等级选择函数**************/
int rank_(char rank1)
{
int rank2;
switch(rank1) //判断字符,确定等级
{
case’0’:rank2=11;break;
case’1’:rank2=10;break;
case’2’:rank2=9;break;
case’3’:rank2=8;break;
case’4’:rank2=7;break;
case’5’:rank2=6;break;
case’6’:rank2=5;break;
case’7’:rank2=4;break;
case’8’:rank2=3;break;
case’9’:rank2=2;break;
default:rank2=15;break;
}
return rank2;
}
/**************显示记录函数***********/
void record( )
{
FILE *p; //文件指针
int a[10],j;
char b[10][10];
fp=fopen(“记录。dat”,”rb”); //打开文件
for (j=0;j<10;j++)
{
fread(player[j].name,20,1,fp); //读取文件中的信息
fread(&player[j].score_,4,1,fp);
}
fclose(fp); //关闭文件
setfont(60,0,”Arial”);
setcolor(RGB(250,250,0));
outtextxy(250,0,”TOP10”);
for(j=0;j<10;j++)
{
sprintf(“b[j],%d”,player[j].score_); //把整型转换为字符型
setcolor(RGB(0,100,255));
setfont(40,0,”Arial”);
outtextxy(420,50+40*j,b[j]);
outtextxy(120,50+40*j,player[j].name); //输出名字
/**********游戏函数******************/
void game (int rank2)
{
cleardevice( ); //清屏
score=0; //清除掉原有的分数
outtextxy(0,0,”玩家:”);
outtextxy(90,0,player[10].name);
setfont(20,0,”Arial”);
outtextxy(100,460,” 人生有享受片刻优雅恬适的权力,让打字母游戏放松你一下吧!”);
int i;
char target; //目标字母
char key; //用户的按键
intx,y; //字母的位置
int flag =1; //标记是否按了退出键
int sum=0; //成绩计数
int num =200; //规定下落字母的个数
srand (time(NULL)); //随机时间种子,设置第一个随机函数的值
setfillstyle(BLACK); //设置下面矩形内图的颜色
setcolor(YELLOW); //
line(0,450,640,450); //用3条线规定一下工作区
line(0,440,640,440); //用3条线规定一下工作区
line(0,40,640,40); //用3条线规定一下工作区
while (flag&&num)
{
setfont(40,0,”宋体”); //设置字母的字体和大小
i=rand()%2; //rand()函数返回0~32767之间的一个整数
if(i)
target=97+rand()%26; //产生任意小写字母
else
target=65+rand()%26; //产生任意大写字母
x=rand()%610; //产生任意下落位置
for (y=41;y<380;y++)
{
setcolor (RGB(255,0,255));
outtextxy(x,y,target); //显示字母
if(kbhit())
{
key=getch(); //获取用户按键
if ((key==target)||( key==target-32)||( key==target+32))
{
score++; //分数统计
sprintf(s,”%d”score);
setfont(30,0,”Arial”);
outtextxy(500,0,“分数”);
outtextxy(600,0,s); //输出分数
bar(x-10,y-10,x+35,y+50); // 击中用黑框形擦去字母
break; //跳出循环,进行下一个字母
}
else if (key==27) //判断是否按了
{
flag=0; //若果按ESC,退出游戏主循环
break;
}
}
Sleep(rank2); //控制清除字母的时间爱你也就是控制下落速度
bar(x,y,x+35,y+60); //擦最下面的字符
}
num--; //计数
}
}
‘叁’ C语言打字练习游戏中怎样实现字母掉落,不用换行和随机坐标还有别的方法吗
可以指定光标位置进行printf输出字符,多字符同时出现,最好使用多线程,下面是个简单的例子,希望对你有帮助
#include<stdio.h>
#include<stdlib.h>
#include<windows.h>
#include<time.h>
voidsetxy(intx,inty)
{
COORDcoord={x,y};
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),coord);
}
intmain()
{
CONSOLE_CURSOR_INFOcci;
cci.bVisible=FALSE;
cci.dwSize=sizeof(cci);
HANDLEhandle=GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleCursorInfo(handle,&cci);
srand((unsigned)time(0));
intx,y;
intc;
while(1)
{
c=rand()%26;
c+='A';
x=rand()%40;
y=0;
while(1)
{
setxy(x,y);
printf("%c",c);
sleep(1);
setxy(x,y);
printf("");
y++;
if(y>5)
{
break;
}
}
}
return0;
}
‘肆’ c语言一行字缓缓落下怎么实现,求代码。
你可以用刷屏实现。就是你把每个状态都打印出来,然后中间用函数:sleep(x);来停顿以达到缓缓下落的效果。参数x是两次刷屏的间隔。
‘伍’ 急求C语言程序 随便输入一个字母,运行结果向后移四位。要求能够循环
#include "stdio.h"
#include "windows.h"
main()
{
char c;
printf("input a char:");
scanf("%c",&c);
if(!isalpha(c))
{
printf("input error!\n");
return;
}
printf("%c\n",isalpha(c+4)? c+4:c-22);
getchar();
}
‘陆’ 急求一份C语言打字游戏代码,要求单词从屏幕上方落下,打字正确字母变为绿色。
#include<time.h>
#include<stdlib.h>
#include<graphics.h>
#include<conio.h>
#include<dos.h>
#include<math.h>
#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 ); /*注册vga驱动*/
initgraph(&gdriver,&gmode,"d:\\tc3\\bgi"); /*初始化图形界面*/
cleardevice(); /*清除屏幕*/
setbkcolor(BLUE); /*将背景色设置成蓝色*/
size=imagesize(startx,starty,startx+60,starty+60); /*计算生成60×60个象素的图需要的字节数*/
image=(unsigned char *)malloc(size); /*分配内存*/
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) /*如果没有按键就不停的循环*/
{
if(l==1) /*从左到右*/
{
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) /*从右到左*/
{
--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); /*设置前景色为黄色*/
rectangle(x,y,x+60,y+40); /*画车厢*/
pieslice(x+15,y+50,angle,angle-dalta,10); /*画轮上的小片扇形部分*/
pieslice(x+45,y+50,angle,angle-dalta,10);
setfillstyle(SOLID_FILL, YELLOW); /*设置填充模式为实填充,颜色为黄色*/
circle(x+15,y+50,10); /*画车轮*/
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); /*获取当前的图片*/
delay(200);
putimage(x,y,image,XOR_PUT); /*使用异或模式将图片显示上去*/
return;
}
‘柒’ c语言制作一个简单的打字游戏(落下一个字母按相应字母消去,记录分数)
游戏常量参数自行修改(字母的列数,下落最大高度,下落速度等)。
程序功能:(随机生成字母,下落,并检查按键,计分)
多线程:按键检查采用新的线程与主线程同步。
独立速度:每个字母下落速度都是随机且不相同。
玩法:按键区分大小写,落到底部或被玩家按中,下落中的字母就会消失,并在该列顶部创建新的字母下落,按中1次记1分。
注意:由于字母都是随机的,如果同时下落的字母很多,可能会有重复字母出现,如果按键对应了多个同样的字母,这些字母会删掉并新建,也就是说出现按中一次记多分,说明有多个重复字母,不是BUG!
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#include<conio.h>
#include<time.h>
#include<windows.h>
#defineW30//宽度
#defineH20//高度
#defineMinSPEED50//最慢下降速度(周期,数字越小越快)
#defineMAXSPEED5//最快下降速度
intscore=0;//总分
typedefstructletter
{
intascii;//字母ASCII码
inthIndex;//对应打印数组行下标
intwIndex;//对应打印数组列下标
intcnt;//周期计数,当cnt==speed,hIndex++并且cnt重新置0
intspeed;//下降速度
intkey;//0表示没有被按中,1表示被按中
structletter*next;
}LETR;
voidmeError(void*p);//内存申请失败
LETR*newLETR(LETR*letrHead,LETR*letrTail,intwIndex);//产生一个新的字母,并添加到链表,返回尾节点
LETR*delLETR(LETR*letrHead,LETR*letrTail,intwIndex);//删除列下标的字母节点,返回新的尾节点
LETR*init(LETR*letrHead);//初始化一组字母,返回链表尾节点
LETR*showList(LETR*letrHead,LETR*letrTail);//显示列表并检查,发现到底或被按键按中的字母删除并新建新的字母,返回新的尾节点
voidrunLetter(LETR*letrHead);//所有字母一周期计数
DWORDWINAPIcheckKey(LPVOIDlpParameter);//新线程
intmain()
{
inti;
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("
");
}
return0;
}
DWORDWINAPIcheckKey(LPVOIDlpParameter)
{
charc;
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;
}
}
return0;
}
voidrunLetter(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)//显示列表并检查,发现到底或被按键按中的字母删除并新建新的字母,返回新的尾节点
{
inti,j,wIndex;
charsp[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]);
returnletrTail;
}
LETR*init(LETR*letrHead)//初始化一组字母,返回链表尾节点
{
inti;
LETR*letrTail=NULL;
for(i=0;i<W;i++)
letrTail=newLETR(letrHead,letrTail,i);
returnletrTail;
}
LETR*newLETR(LETR*letrHead,LETR*letrTail,intwIndex)//在列下标wIndex首行,产生一个新的字母,并添加到链表,返回尾节点
{
intn;
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;
returnletrTail;
}
LETR*delLETR(LETR*letrHead,LETR*letrTail,intwIndex)//删除列下标的字母节点,返回新的尾节点
{
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;
returnletrHead;
}
voidmeError(void*p)//内存申请失败
{
if(p==NULL)
{
printf("
异常:内存申请失败!回车结束程序!
");
while(getch()!='
');
exit(0);
}
}
‘捌’ 用C语言程序把输入的字母后移2位
int
ch[20];
//先用一个循环给字符数组赋值。
v//然后用一个循环实现你的功能
for(i
=
0;i
<20;
i++
)
{
ch[i]
=
ch[i]+2;
}
//再用一个循环输出即可
附:字符类型本质上是一个有范围的无符号整形。
‘玖’ c语言怎么实现滚动的字母比如一排文字,从下面一直平移到上面
下面是贪吃蛇简化版代码,可以参考。
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<conio.h>
#include<windows.h>//Sleep
int x=1,y=4;
char dir='d';
HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE); //获取标准输出的句柄 <windows.h>
//句柄 :标志应用程序中的不同对象和同类对象中的不同的实例 方便操控,
void gotoxy(int x, int y)//设置光标位置
{
COORD pos = {x,y}; //定义一个字符在控制台屏幕上的坐标POS
SetConsoleCursorPosition(hConsole, pos); //定位光标位置的函数<windows.h>
}
void SetColor(int color)//设置颜色
{
SetConsoleTextAttribute(hConsole, color);
//是API设置字体颜色和背景色的函数 格式:SetConsoleTextAttribute(句柄,颜色);
}
int move()
{
if(kbhit())//keyboard hit,in conio.h
{
switch(getch())
{
case 0x77:
dir = 'w';
break;
case 0x73:
dir = 's';
break;
case 0x61:
dir = 'a';
break;
case 0x64:
dir = 'd';
break;
default:
break;
}
}
switch(dir)
{
case 'w':
y--;break;
case 's':
y++;break;
case 'a':
x--;break;
case 'd':
x++;break;
}
return 0;
}
void check()
{
if(x==0||y==0);
}
int main()
{
int interval=500;//列;行。
system("mode con:cols=60 lines=60");//设置窗体大小 ,超过会自动清除前面的//错题集
system("color 47");//black background
while(1)
{
gotoxy(x,y);
SetColor(0xf);
printf("※");
Sleep(interval);
system("CLS");
move();
}
return 0;
}
‘拾’ 我写了一个C语言的“练习打字程序” ,出了些问题,求解答!
是字母下落的位置还是下落的字母?
我玩了5次等级1的没出现提前结束啊