这个程序是在大三,还是大二写的自己都记不清了,现在翻出来看的时候,晕,怎么自己写的有些地方自己都看不懂啊!!唉!!看来要重操旧刀,给好好的复习复习了!!
在大学的时候还用汇编写过一个DOS内存驻留,中断钩子的,不知道跑那去了,那天翻到了在贴上来吧!!
//猜数字V1.0
/*输入四个不重复的数字,按回车键后结果显示在右边方框,其形式为"?A?B".四位数字中,
位置和数字都正确为A,数字相同而位置不同为B,当4A时为猜对."< ","> "控制光标.*/
#include < stdio.h>
#include < stdlib.h>
#include < float.h>
#include < graphics.h>
#include < math.h>
#include < conio.h>
#include < dos.h>
#define x 150 //本程序的所有坐标都是相对x,y来画的
#define y 150
char ransum[4]; //装入随机产生的数
static char insum[4][2]={{'','/0'},{'','/0'},{'','/0'},{'','/0'}};//装入输入的数
void main(void)
{
void shuijisum(void);//产生不相同的四个随机数
void huatu(void); //初始化基本的屏幕
void input(void); //输入猜的四个数字,并在方格内显示
int bijiao(int); //比较输入的数和随机产生的数,得出?A?B的结果
void ok(void); //猜对数在方格下显示"YOU ARE GOOD"
void no(void); //猜错数在方格下显示"YOU ARE PIG"
int a,c,i,g_driver=VGA, g_mode=VGAHI;
char yn;
detectgraph(&g_driver, &g_mode);
initgraph(&g_driver, &g_mode, "..//bgi");
kaishi:
do
{
huatu();
shuijisum();
for(c=0;c< 8;c++) //最多猜8次
{
input(); //猜对数显示"YOU ARE GOOD",没猜对显示"YOU ARE PIG",如果8
a=bijiao(c); //次都没猜对则询问"you are coutinue(y/n)"
if(a==4)
{
ok();
delay(1500);
goto kaishi;
}
else
no();
}
if(a!=4)
{
settextstyle(1,0,1);
bar(x-40,y+75,x+190,y+100);
outtextxy(x-40,y+70,"you are coutinue(y/n)");
}
}while((yn=getch())=='y');
closegraph();
}
void huatu(void)
{
int i;
char biaohao[1];
setfillstyle(1,BLACK);
bar(0,0,640,480);
setcolor(YELLOW);
settextstyle(1,0,6);
outtextxy(x-10,y-100,"CAI SHU ZI v1.0");
setcolor(RED);
settextstyle(0,0,1);
outtextxy(x+262,y-93,"jk");
setcolor(BLUE);
rectangle(x,y,y+120,y+40);
for(i=0;i< =1;i++)
rectangle(x+30+i*30,y,x+30+(i+1)*30,y+40);
rectangle(x+200,y,x+340,y+160);
setcolor(YELLOW);
settextstyle(1,0,1);
for(i=0;i< 8;i++)
{sprintf(biaohao,"%d:",i+1);
outtextxy(x+205,y+i*20,biaohao);
}
}
void input(void)
{
int i=0,j;
char key;
settextstyle(1,0,4);
do
{
setcolor(LIGHTGREEN);
rectangle(x+i*30+5,y+35,x+(i+1)*30-5,y+33);
key=getch();
setcolor(BLACK);
if(key=='1'||key=='2'||key=='3'||key=='4'||key=='5'||key=='6'||key=='7'||key=='8'||key=='9'||key
=='0')
{
for(j=0;j< 4;j++) //判断输入的数字有没有重复的,如果有则消除原先的,在当前
{if(j==i) //的位置装入刚输入的数字
j+=1;
if(key==insum[j][0])
{bar(x+5+30*j,y+5,x+25+30*j,y+35);
insum[j][0]='';
}
}
insum[i][0]=key;
setcolor(YELLOW);
bar(x+5+30*i,y+5,x+25+30*i,y+35);
outtextxy(x+8+i*30,y,insum[i]);
i+=1;
}
if(key==',') //判断按键如果是","则光标左移一格
{
rectangle(x+i*30+5,y+35,x+(i+1)*30-5,y+33);
i-=1;
}
if(key=='.') //判断按键如果是"."则光标右移一格
{
rectangle(x+i*30+5,y+35,x+(i+1)*30-5,y+33);
i+=1;
}
if(i< 0) i=0; //使光标始终在方格内
if(i> 3) i=3;
}while(key!='/r'); //判断按键如果是回车键则结束输入数字,去执行判断函数
rectangle(x+i*30+5,y+35,x+(i+1)*30-5,y+33);
}
void shuijisum(void)
{int i,j,t;
randomize();
for(i=0;i< 4;i++)
{jk:
t=random(10)+48;
for(j=0;j< i;j++)
if(t==ransum[j])
goto jk;
ransum[i]=t;
}
}
int bijiao(int c)
{
int i,j,a=0,b=0;
char ab[6]; //一位一位的比较,如果有位置和数字都相同的则
for(i=0;i< 4;i++) //a=a+1;如果是位置不同但数字相同则b=b+1
for(j=0;j< 4;j++)
if(insum[i][0]==ransum[j])
if(i==j)
{
a+=1;
break;
}
else
{
b+=1;
break;
}
setcolor(YELLOW);
settextstyle(1,0,1);
sprintf(ab,"--%dA%dB",a,b);
for(i=0;i< 4;i++)
outtextxy(x+225+i*11,y+20*c,insum[i]);
outtextxy(x+270,y+20*c,ab);
return(a); //返回的a是用来判断猜的数是
}
void ok(void)
{
bar(x-40,y+75,x+190,y+100);
settextstyle(1,0,4);
outtextxy(x-40,y+70,"YOU ARE GOOD");
}
void no(void)
{
bar(x-40,y+75,x+190,y+100);
settextstyle(1,0,4);
outtextxy(x-40,y+70,"YOU ARE PIG");
}
//蒋科
//2001.11.8