本文目錄一覽:
- 1、用C語言編寫一個簡單的打字母遊戲,給出基本思路及完整程序。
- 2、急求一份C語言打字遊戲代碼,要求單詞從屏幕上方落下,打字正確字母變為綠色。
- 3、C語言簡易文字冒險遊戲源代碼
- 4、求c語言打字遊戲程序,要求如下:
- 5、怎樣用C語言編寫一個小遊戲?
- 6、求純C語言打字遊戲源代碼及解析
用C語言編寫一個簡單的打字母遊戲,給出基本思路及完整程序。
# includestdio.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;i10;i++)
{
fread(player[i].name,20,l,fp); //讀入記錄中的成績和名字
fread (player[i].score_,4,l,fp);
}
fclose(fp); //關閉二進位文件
for (j=0;j10;j++) //冒泡法排序
for (i=0;i10-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;i10;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(c0)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(score190)
outtextxy(100,200,」不錯!繼續加油!」);
else
outtextxy(100,200,」不要灰心!繼續加油!」);
c-=25;
if(c0)
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;j10;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;j10;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 (flagnum)
{
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;y380;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語言打字遊戲代碼,要求單詞從屏幕上方落下,打字正確字母變為綠色。
#includetime.h
#includestdlib.h
#includegraphics.h
#includeconio.h
#includedos.h
#includemath.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)%360dalta)
angle-=dalta;
if(n(maxx-180)/step){
if(startymaxy-100)
starty=20;
else
starty+=y;
l=0;
}
}
if(l==0) /*從右到左*/
{
–n;
angle=-1*(n*step)/R/M_PI*180;
if((int)(-1*angle)%360dalta)
angle-=dalta;
if(n==1){
if(startymaxy-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=temch0x00ff;
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語言簡易文字冒險遊戲源代碼
記憶遊戲
#includestdio.h
#includetime.h
#includestdlib.h
#includewindows.h
#define N 10
int main( )
{int i,k,n,a[N],b[N],f=0;
srand(time(NULL));
printf(” 按1開始\n 按0退出:_”);
scanf(“%d”,n);
system(“cls”);
while(n!=0)
{for(k=0;kN;k++)a[k] = rand( )%N;
printf(“\n\t\t[請您牢記看到顏色的順序]\n\n”);
for(k=0;kN;k++)
{switch(a[k])
{case 0:system(“color 90″);printf(” 0:淡藍色\n”);break; //淡藍色
case 1:system(“color f0″);printf(” 1:白色\n”);break; //白色
case 2:system(“color c0″);printf(” 2:淡紅色\n”);break; //淡紅色
case 3: system(“color d0″);printf(” 3:淡紫色\n”);break; //淡紫色
case 4: system(“color 80″);printf(” 4:灰色\n”); break; //灰色
case 5: system(“color e0″);printf(” 5:黃色\n”);break; //黃色
case 6: system(“color 10″);printf(” 6:藍色\n”); break; //藍色
case 7: system(“color 20″);printf(” 7:綠色\n”);break; //綠色
case 8: system(“color 30″);printf(” 8:淺綠色\n”);break; //淺綠色
case 9: system(“color 40″);printf(” 9:紅色\n”);break; //紅色
}
Sleep(1500);
system(“color f”); //單個控制 文字顏色
Sleep(100);
}
system(“cls”);
printf(” 0:淡藍色,1:白色,2:淡紅色,3:淡紫色,4:灰色,5:黃色,6:藍色7:綠色,8:淺綠色,9:紅色\n”);
printf(“\n\t請輸入顏色的順序:”);
for(k=0;kN;k++)scanf(“%d”,b[k]);
for(k=0;kN;k++)if(a[k] == b[k]) f++;
if(f==0) printf(” 你的記憶弱爆了0\n”);
else if(f==1) printf(” 你的記憶有點弱1\n”);
else if(f5) printf(” 你的記憶一般5\n”);
else printf(” 你的記憶力很強!\n”);
Sleep(2000);
system(“cls”);
printf(“\t\t按0退出\n\t\t按任意鍵繼續遊戲:\n”);
scanf(“%d”,n);
system(“cls”);
}
return 0;
}
註:DEVc++運行通過,每輸入一個數字要加入一個空格。
求c語言打字遊戲程序,要求如下:
//頭文件stdio.h,conio.h,time.h
int main()
{//首先列印信息
getch();
char a,b;
int t,s;
s=time();//獲取系統時間,以秒為單位,存入s中
for(;;)
{t=time();
if(t-s=60)break;//假設規定時間是60秒
a=(char)rand();//隨機生成數字(返回int型,需要強制轉換)
/*rand每次生成的隨機數相同,
需要用系統時間初始化隨機數生成器,
相關內容可以到百度查*/
for(a’a’||a’z’)a=(char)rand();//如果不是小寫字母,重新生成
printf(“%c”,a);
b=getch();
if(a==b);//正確
else printf(“\b_”);//\b代表backspace,錯誤時列印_
}
getch();//結束
}
//當然,如有興趣,可以定義兩個int型變數,分別記錄總字數和敲對的字數
怎樣用C語言編寫一個小遊戲?
「貪吃蛇」C代碼:
#include stdio.h
#include stdlib.h
#include conio.h
#include time.h
#include Windows.h
#define W 78 //遊戲框的寬,x軸
#define H 26 //遊戲框的高,y軸
int dir=3; //方向變數,初值3表示向「左」
int Flag=0; //吃了食物的標誌(1是0否)
int score=0; //玩家得分
struct food{ int x; //食物的x坐標
int y; //食物的y坐標
}fod; //結構體fod有2個成員
struct snake{ int len; //身長
int speed; //速度
int x[100];
int y[100];
}snk; //結構體snk有4個成員
void gtxy( int x,int y) //控制游標移動的函數
{ COORD coord;
coord.X=x;
coord.Y=y;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
}
void gtxy( int x,int y); //以下聲明要用到的幾個自編函數
void csh( ); //初始化界面
void keymove( ); //按鍵操作移動蛇
void putFod( ); //投放食物
int Over( ); //遊戲結束(1是0否)
void setColor(unsigned short p, unsigned short q); //設定顯示顏色
int main( ) //主函數
{ csh( );
while(1)
{ Sleep(snk.speed);
keymove( );
putFod( );
if(Over( ))
{system(「cls」);
gtxy(W/2+1,H/2); printf(「遊戲結束!T__T」);
gtxy(W/2+1,H/2+2); printf(「玩家總分:%d分」,score);
getch( );
break;
}
}
return 0;
}
void csh( ) //初始化界面
{ int i;
gtxy(0,0);
CONSOLE_CURSOR_INFO cursor_info={1,0}; //以下兩行是隱藏游標的設置
SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE),cursor_info);
for(i=0;i=W;i=i+2) //橫坐標要為偶數,因為這個要列印的字元佔2個位置
{ setColor(2, 0); //設定列印顏色為綠字黑底
gtxy(i,0); printf(“■”); //列印上邊框
gtxy(i,H); printf(“■”); //列印下邊框
}
for(i=1;iH;i++)
{ gtxy(0,i); printf(“■”); //列印左邊框
gtxy(W,i); printf(“■”); //列印右邊框
}
while(1)
{ srand((unsigned)time(NULL)); //初始化隨機數發生器srand( )
fod.x=rand()%(W-4)+2; //隨機函數rand( )產生一個從0到比」(W-4)」小1的數再加2
fod.y=rand()%(H-2)+1; //隨機函數rand( )產生一個從0到比」(H-2)」小1的數再加1
if (fod.x%2==0) break; //fod.x是食物的橫坐標,要是2的倍數(為偶數)
}
setColor(12, 0); //設定列印顏色為淡紅字黑底
gtxy(fod.x,fod.y); printf(“●”); //到食物坐標處列印初試食物
snk.len=3; //蛇身長
snk.speed=350; //刷新蛇的時間,即是移動速度
snk.x[0]=W/2+1; //蛇頭橫坐標要為偶數(因為W/2=39)
snk.y[0]=H/2; //蛇頭縱坐標
setColor(9, 0); //設定列印顏色為淡藍字黑底
gtxy(snk.x[0], snk.y[0]); printf(“■”); //列印蛇頭
for(i=1;isnk.len;i++)
{ snk.x[i]=snk.x[i-1]+2; snk.y[i]=snk.y[i-1];
gtxy(snk.x[i],snk.y[i]); printf(“■”); //列印蛇身
}
setColor(7, 0); //恢復默認的白字黑底
return;
}
void keymove( ) //按鍵操作移動蛇
{ int key;
if( kbhit( ) ) //如有按鍵輸入才執行下面操作
{ key=getch( );
if (key==224) //值為224表示按下了方向鍵,下面要再次獲取鍵值
{ key=getch( );
if(key==72dir!=2)dir=1; //72表示按下了向上方向鍵
if(key==80dir!=1)dir=2; //80為向下
if(key==75dir!=4)dir=3; //75為向左
if(key==77dir!=3)dir=4; //77為向右
}
if (key==32)
{ while(1) if((key=getch( ))==32) break; } //32為空格鍵,這兒用來暫停
}
if (Flag==0) //如沒吃食物,才執行下面操作擦掉蛇尾
{ gtxy(snk.x[snk.len-1],snk.y[snk.len-1]); printf(” “); }
int i;
for (i = snk.len – 1; i 0; i–) //從蛇尾起每節存儲前一節坐標值(蛇頭除外)
{ snk.x[i]=snk.x[i-1]; snk.y[i]=snk.y[i-1]; }
switch (dir) //判斷蛇頭該往哪個方向移動,並獲取最新坐標值
{ case 1: snk.y[0]–; break; //dir=1要向上移動
case 2: snk.y[0]++; break; //dir=2要向下移動
case 3: snk.x[0]-=2; break; //dir=3要向左移動
case 4: snk.x[0]+=2; break; //dir=4要向右移動
}
setColor(9, 0);
gtxy(snk.x[0], snk.y[0]); printf(“■”); //列印蛇頭
if (snk.x[0] == fod.x snk.y[0] == fod.y) //如吃到食物則執行以下操作
{ printf(“\007”); snk.len++; score += 100; snk.speed -= 5; Flag = 1; } //007是響鈴
else Flag = 0; //沒吃到食物Flag的值為0
if(snk.speed150) snk.speed= snk.speed+5; //作弊碼,不讓速度無限加快
}
void putFod( ) //投放食物
{ if (Flag == 1) //如吃到食物才執行以下操作,生成另一個食物
{ while (1)
{ int i,n= 1;
srand((unsigned)time(NULL)); //初始化隨機數發生器srand( )
fod.x = rand( ) % (W – 4) + 2; //產生在遊戲框範圍內的一個x坐標值
fod.y = rand( ) % (H – 2) + 1; //產生在遊戲框範圍內的一個y坐標值
for (i = 0; i snk.len; i++) //隨機生成的食物不能在蛇的身體上
{ if (fod.x == snk.x[i] fod.y == snk.y[i]) { n= 0; break;} }
if (n fod.x % 2 == 0) break; //n不為0且橫坐標為偶數,則食物坐標取值成功
}
setColor(12, 0);
gtxy(fod.x, fod.y); printf(“●”); //游標到取得的坐標處列印食物
}
return;
}
int Over( ) //判斷遊戲是否結束的函數
{ int i;
setColor(7, 0);
gtxy(2,H+1); printf(「暫停鍵:space.」); //以下列印一些其它信息
gtxy(2,H+2); printf(「遊戲得分:%d」,score);
if (snk.x[0] == 0 || snk.x[0] == W) return 1; //蛇頭觸碰左右邊界
if (snk.y[0] == 0 || snk.y[0] == H) return 1; //蛇頭觸碰上下邊界
for (i = 1; i snk.len; i++)
{ if (snk.x[0] == snk.x[i] snk.y[0] == snk.y[i]) return 1; } //蛇頭觸碰自身
return 0; //沒碰到邊界及自身時就返回0
}
void setColor(unsigned short ForeColor = 7, unsigned short BackGroundColor = 0)
{ HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleTextAttribute( handle, ForeColor + BackGroundColor * 0x10 );
} //用來設定顏色的函數
求純C語言打字遊戲源代碼及解析
# include “Typer.h”
# include stdio.h
# include stdlib.h
# include graphics.h
//download by
void main()
{
BOOL bQuit=FALSE; /* 是否退出 */
BOOL bPause=FALSE; /* 是否暫停 */
int tm1,tm2;
BYTE Key;
randomize(); /* 初始化隨機數種子 */
SetGraphMode();
SelectLevel();
ShowBar();
tm1=CreateTimer(1,MoveLetter); /* 創建移動字元對象時鐘 */
tm2=CreateTimer(Interval,CreateLetter); /* 創建產生字元對象時鐘 */
CreateLetter();
Key=AscKey();
while (!bQuit)
{
TimerEvent();
switch (Key)
{
case NULL:
break;
case KEY_ESC:
bQuit=TRUE;
break;
case KEY_SPACE:
bPause=!bPause;
tmTM[tm1].Enable=!bPause;
tmTM[tm2].Enable=!bPause;
break;
default:
if (!bPause) Check(Key);
}
Key=AscKey();
}
CloseGraphMode();
}
void SetGraphMode()
{
int Device=VGA,Mode=VGAHI;
initgraph(Device,Mode,””);
settextstyle(TRIPLEX_FONT,HORIZ_DIR,1);
setfillstyle(SOLID_FILL,0);
setcolor(7);
}
void CloseGraphMode()
{
restorecrtmode();
}
/* 從鍵盤緩衝區內直接讀出ASC碼 */
BYTE AscKey(void)
{
int start,end;
WORD key=0;
start=peek(0,0x41a);
end=peek(0,0x41c);
if (start==end) return(0);
else
{
key=peek(0x40,start);
start+=2;
if (start==0x3e) start=0x1e;
poke(0x40,0x1a,start);
return(key0xff);
}
}
void MoveLetter(void)
{
int i;
for (i=0;iMAX_LETTER;i++)
{
if (Letter[i].Used)
{
HideLetter(i);
Letter[i].y+=Step;
ShowLetter(i);
/* 字元對象下落到最底部 */
if (Letter[i].yMAX_HEIGHT) KillLetter(i);
}
}
}
void KillLetter(int LetterID)
{
if (Letter[LetterID].Used)
{
Letter[LetterID].Used=FALSE;
LetterUsed–;
HideLetter(LetterID);
}
/* 刪除字元對象後馬上再創建一個 */
CreateLetter();
}
void CreateLetter()
{
int i=0;
int x;
BYTE val;
if (LetterUsed==MAX_LETTER) return; /* 無字元對象可用則返回 */
while (Letter[++i].Used); /* 找到第一個空閑的字元對象,產生一個字元對象 */
x=i;
Letter[i].x=x*640/MAX_LETTER;
Letter[i].y=0;
Letter[i].val=random(26)+’A’;
Letter[i].Used=TRUE;
LetterUsed++;
}
void HideLetter(int ID)
{
/* 用填充矩形來消隱字元 */
bar(Letter[ID].x,Letter[ID].y,Letter[ID].x+16,Letter[ID].y+20);
}
void ShowLetter(int ID)
{
char str[2]={0,0};
str[0]=Letter[ID].val;
outtextxy(Letter[ID].x,Letter[ID].y,str);
}
void Check(BYTE Key)
{
int i;
char str[6];
Hits++;
for (i=0;iMAX_LETTER;i++)
/* 擊中 */
if (Letter[i].UsedLetter[i].val==toupper(Key))
{
sound(1000);
delay(10);
KillLetter(i);
Right++;
nosound();
}
/* 顯示狀態 */
setfillstyle(SOLID_FILL,5);
bar(260,430,320,450);
bar(410,430,470,450);
setcolor(2);
sprintf(str,” %4ld”,Hits);
outtextxy(260,430,str);
sprintf(str,” %4ld”,Right);
outtextxy(410,430,str);
setcolor(7);
setfillstyle(SOLID_FILL,0);
}
void ShowBar()
{
FILE *bmp;
BYTE r,g,b,t;
int i,x,y;
bmp=fopen(“bar.bmp”,”rb”);
fseek(bmp,54,SEEK_SET);
for (i=0;i16;i++)
{
setpalette(i,i);
b=fgetc(bmp)2;
g=fgetc(bmp)2;
r=fgetc(bmp)2;
t=fgetc(bmp)2;
setrgbpalette(i,r,g,b);
}
for (y=0;y80;y++)
for (x=0;x320;x++)
{
t=fgetc(bmp);
putpixel(x*2,479-y,t4);
putpixel(x*2+1,479-y,t15);
}
fclose(bmp);
}
void SelectLevel()
{
int Steps[3]={1,2,4};
int Intervals[3]={18,9,5};
int Sel=0;
FILE *bmp;
BYTE r,g,b,t,Key;
int i,x,y;
bmp=fopen(“sel.bmp”,”rb”);
fseek(bmp,54,SEEK_SET);
for (i=0;i16;i++)
{
setpalette(i,i);
b=fgetc(bmp)2;
g=fgetc(bmp)2;
r=fgetc(bmp)2;
t=fgetc(bmp)2;
setrgbpalette(i,r,g,b);
}
for (y=0;y200;y++)
for (x=0;x160;x++)
{
t=fgetc(bmp);
putpixel(x*2+160,339-y,t4);
putpixel(x*2+161,339-y,t15);
}
fclose(bmp);
while (TRUE)
{
Key=toupper(AscKey());
if (Key==’A’) Sel=1;
if (Key==’B’) Sel=2;
if (Key==’C’) Sel=3;
if (Sel) break;
}
Step=Steps[Sel-1];
Interval=Intervals[Sel-1];
cleardevice();
}
/*********************************************************/
/* 文件:TIMER.H */
/*********************************************************/
/*********************************************************/
/* 系統可用計時器的最大數目 */
# define MAXTIMER 10
# ifndef NULL
# define NULL 0
# endif
/* 計時器結構 */
struct TM
{
DWORD Interval; /* 間隔 */
DWORD LastTimer; /* 上次事件發生時間*/
BOOL Enable; /* 活動 */
BOOL Used; /* 可用 */
void (*Pointer)(); /* 事件遠指針 */
};
struct TM tmTM[MAXTIMER+1];
int TimerUsed=0;
/* 獲取BIOS計數器數值 */
DWORD BiosTimer(void)
{
DWORD BIOSTIMER=0;
BIOSTIMER=peek(0x0,0x46e);
BIOSTIMER=8;
BIOSTIMER+=peek(0x0,0x46c);
return (BIOSTIMER);
}
/* 時間事件(時鐘系統核心) */
void TimerEvent()
{
int i;
DWORD TimerDiff;
for (i=1;i=MAXTIMER;i++)
{
if (tmTM[i].UsedtmTM[i].Enable)
{
TimerDiff=BiosTimer()-tmTM[i].LastTimer;
if (tmTM[i].Interval=TimerDiff)
{
tmTM[i].Pointer();
tmTM[i].LastTimer=BiosTimer();
}
}
}
}
/* 創建一個時鐘(成功返回時鐘的句柄,否則返回NULL) */
int CreateTimer(DWORD Interval,void (*Pointer)())
{
int i=0;
if (TimerUsed==MAXTIMER) return NULL;
while (tmTM[++i].Used);
tmTM[i].Pointer=Pointer;
tmTM[i].Interval=Interval;
tmTM[i].Enable=TRUE;
tmTM[i].Used=TRUE;
tmTM[i].LastTimer=BiosTimer();
TimerUsed++;
return i;
}
/* 刪除一個時鐘 */
void KillTimer(int *TimerID)
{
if (tmTM[*TimerID].Used)
{
TimerUsed–;
tmTM[*TimerID].Used=FALSE;
}
*TimerID=0;
}
/* 刪除所有時鐘 */
void KillAllTimer()
{
int i;
for (i=0;i=MAXTIMER;i++) tmTM[i].Used=FALSE;
TimerUsed=0;
}
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/159123.html