文档库 最新最全的文档下载
当前位置:文档库 › 贪吃蛇代码

贪吃蛇代码

预处理
#include
#include
#include
#pragma comment(lib,"Winmm.lib")
#define width_window 500 //窗口的宽度
#define high_window 398 //窗口的高度
#define width_gameBoard 398 //游戏区域的宽度
#define high_gameBoard 398 //游戏区域的高度
#define sw 10 //用一个圆表示蛇的一节,sw表示圆的半径
#define num_food 16 //设定的食物个数,全部吃完则游戏胜利结束
#define NameMaxLength 12 //设定用户名的最大字符数为:NameMaxLength-2
#define PsdMaxLength 10 //设定密码的最大字符数
#define boxbkclr 0xfedcbd //绘制消息框和登录框的主题填充颜色
#define drawFieldbkclr 0xFFFFFF //窗口区域的背景填充颜色
#define MovDist 1 //按钮移动量为MovDist像素
void InitGameBoard(); //创建绘图窗口,并初始化
void InitSnake(int x0,int y0,int d0); //用随机数产生蛇的位置和方向
void SetFood(); //随机地在蛇以外的位置放置食物
int GetPlayerCommand(); //获取游戏玩家发出的控制指令
void dispScore(); //动态显示得分
void dispInfo(); //显示得分、操作指南和版本等信息
void bkMusic_launchImg(); //播放背景音乐和添加启动画面
void window_segmented(); //画线分割窗口
void GameOver(bool iskillde); //判断游戏是否结束
void ClearTailNode(); //擦除蛇尾结点
void Eat(int x,int y); //吃食物
void SnakeMove(int x,int y,int d); //蛇按照玩家的控制命令进行移动
void pause(); //游戏暂停
void DrawMsgBox(); //绘制消息窗口
int ResponseMouse(int,int,int,int,int,int,int,int,int,int,int,int);
//响应鼠标
void DrawTwoBtn(); //绘制启动画面上的两个按钮
void DrawLoginUI(); //绘制登陆界面
void InputName(); //输入账号
void InputPsd(); //输入密码
int ChkNamePsd(char*,char*); //点击登陆,核对用户名和密码
//绘制按钮被点击时有被按压下去并回弹的动感
void BthMoveClicked(int,int,int,int,int,int,char*);
typedef struct snake
{
int x;
int y;
struct snake*next;
}SNAKE;
SNAKE*head=(snake*)malloc(sizeof(snake));
int n=0; //初始化放置食物的个数为0
int sx=0,sy=0,sd=0; //蛇头的位置坐标和移动方向
int xb00=0,xb01=0,xb02=0,xb03=0,xb04=0,xb05=0;
//控件(按钮或输入框)的位置坐标
int yb00=0,yb01=0,yb02=0,yb03=0,yb04=0,yb05=0;
//控件(按钮或输入框)的位置坐标
char UserName[5]={'m','a','r','r','y'}; //系统设定的用户名
char Password[6]={'t','o','m','1','2','3'}; //系统设定的密码
//用于储存用户输入的账号
char IptName[NameMaxLength]={'','','','','','','','\0'};
//用于储存用户输入的密码
char IptPsd[PsdMaxLength]={'','','','','','','','\0'};
int isagin=0; //用于判断是否再玩一次,为1表示再玩一次



系统主函数
void main()
{
char str_again[]="再来一次"
char str_exit[]="我不玩了"

while(1)
{
n=0;//每局开始需要初始化放置食物的个数为0
InitGameBoard();//创建绘图窗口,并初始化
InitSnake(sx,sy,sd);//用随机数的方式在某个位置产生蛇和蛇的移动方向
SetFood();//随机地在蛇以外的位置放置食物
SnakeMove(sx,sy,sd);//蛇按照玩家的指控命令进行移动
DrawMsgBox();//绘制消息窗口
isagain=ResponseMouse(xb00,yb00,xb01,yb01,xb02,yb02,xb03,yb03,0,0,0,0);//响应鼠标点击
if(isagain==1)//点击了按钮1“再来一次”
{
BtnMoveClicked(xb00,yb00,xb01,yb01,6,6,str_again);//绘制动态按钮
}
if(isagain==2)//点击了按钮1“我不玩了”
{
BtnMoveClicked(xb02,yb02,xb03,yb03,6,6,str_exit);//绘制动态按钮
break;
}
}
closegraph();
}



1、播放背景音乐和添加启动画面
void bkMusic_launchImg()
{
//播放背景音乐
mciSendString("open./千年等一回.mp3 alias 千年等一回",0,0,0);
mciSendString("play 千年等一回 repeat",0,0,0);
//添加启动画面
cleardevice();//用当前背景色清空屏幕,并将当前点移至(0,0)
IMAGE img;
loadimage(&img, _T("SnakesLaunch1.bmp"));//加载图像
putimage(0,0,&img);//显示图像作为启动画面
}



2、划线分割窗口
void window_segmented()
{
setlinecolor(BLUE);
setlinestyle(PS_SOLID|PS_ENDCAP_FLAT,6);//设置线条宽度6的实线,平端点
setfillcolor(YELLOW);
//划线分割窗口
line(width_gameBoard+1,0,width_gameBoard+1,high_gameBoard);
line(width_gameBoard+1,200,width_window,200);//划线分割窗口
setlinestyle(PS_SOLID|PS_ENDCAP_FLAT,1);//恢复线条样式为宽度1的实线
}



3、创建绘图窗口,并初始化
void InitGameBoard()
{
int choice;//点击了哪个按钮
int ret=-1;//用于表示核对用户名密码是否正确
char str_guide[]="操作指南";
char str_regist[]="登录游戏"
initgraph(width_window,high_window);
//创建大小为width_window*high_window的窗口
setorigin(0,0);//设置绘图窗口区域的左上角为逻辑坐标原点
setbkcolor(0xFFFFFF);//设置背景颜色,0xFFFFFF为白色
bkMusic_launchImg();//播放背景音乐和添加启动画面
if(isagain!=1)//是否是重新开始一局
{
DrawTwoBtn();//绘制启动画面上的两个按钮
choice=ResponseMouse(xb00,yb00,xb01,yb01,xb02,yb02,xb03,yb03,0,0,0,0);
if(choice==1)//点击了“操作指南”
{
BtnMoveClicked(xb00,yb00,xb01,yb01,6,6,str_guide);
//绘制动感按钮
Sleep(200);
//加载并显示操作指南图片
IMAGE img;
loadimage(&img,_T("SnakesLaunch2.bmp"));
putimage(0,0,&img);
choice=ResponseMouse(-1,-1,-1,-1,-1,-1,-1,-1,0,0,0,0);
if(choice==0)//点击了鼠标左键
{
//设置绘图样式
setlinecolor(WHITE); //设置线条颜色为白色
setlinestyle(PS_SOLID|PS_ENDCAP_FLAT,1); //设置线条样式
setfillcolor(YELLOW);
}

}
else//

点击了“登录游戏”
{
BtnMoveClicked(xb02,yb02,xb03,yb03,6,6,str_regist);
Sleep(200);
}
DrawLoginUI();//绘制登陆界面
window_segmented();//划线分割窗口
while(1)
{
if(ret==0)//判断是否已经发生过输入用户名或密码错误
{
//设置字体颜色为框体填充颜色,目的是擦掉提示错误的信息
setcolor(boxbkclr);
//设置输入文本的背景颜色为框体填充颜色,目的是擦掉提示错误的信息
setbkcolor(boxbkclr);
setbkmode(TRANSPARENT);//设置文字输出时的背景模式为透明色
settexstyle(18,0,_T("宋体"));
//用框体填充颜色输出错误信息,即擦除
outtextxy(xb00-50,yb00-20,"账号或密码输入错误,请重新输入!");
setbkcolor(drawFieldbkclr);
choice=ResponseMouse(xb00,yb00,xb01,yb01,xb02,yb02,xb03,yb03,xb04,yb04,xb05,yb05);
}
choice=ResponseMouse(xb00,yb00,xb01,yb01,xb02,yb02,xb03,yb03,xb04,yb04,xb05,yb05);
if(choice==1)
{
InputName();//输入账号
}
if(choice==2)
{
InputPsd();//输入密码
}
if(choice==3)
{
ret=ChkNamePsd(IptName,IptPsd);//点击登录
if(ret==1)
break;
}
}
}
cleardevice();//用当前背景色清空屏幕,并将当前点移至(0,0)
window_segmented();//划线分割窗口
dispInfo();//显示得分和操作指南信息
}



4、显示得分、操作指南和版本等信息
void dispInfo()
{
//显示得分情况
setcolor(BLACK);//设置字体颜色
settextstyle(18,0,_T("黑体"));//设置字体类型
outtextxy(width_gameBoard+10,30,"当前得分:");
settextstyle(38,0,_T("黑体"));//设置字体类型
outtextxy(width_gameBoard+10,60,"0");
//显示操作指南信息
settextstyle(18,0,_T("黑体"));//设置字体类型
outtextxy(width_gameBoard+10,220,"操作指南");
settextstyle(12,0,_T("宋体"));//设置字体类型
outtextxy(width_gameBoard+10,250,"按F或f键向东转");
outtextxy(width_gameBoard+10,265,"按S或s键向西转");
outtextxy(width_gameBoard+10,280,"按D或d键向南转");
outtextxy(width_gameBoard+10,295,"按E或e键向北转");
outtextxy(width_gameBoard+10,320,"按A或a键向东转");
outtextxy(width_gameBoard+10,335,"按空格键暂停");
outtextxy(width_gameBoard+10,350,"按ESC键退出");
//显示版本信息
outtextxy(width_gameBoard+10,380,"**贪吃蛇V1.0.0");
}



5、动态显示得分
void dispScore()
{
char str_score[6];
int num_score=0;
num_score=(n-1)*10;//每吃一个得10分
itoa(num_score,str_score,10);//数字转化为字符
setcolor(RED);
setbkmode(OPAQUE);
settextstyle(38,0,_T("黑体"));
outtextxy(width_gameBoard+10,60,str_score);//显示得分
}



6、用随机数的方式在某个位置产生蛇和蛇的移动方向
void InitSnake(int x0,int y0,int d0)
{
int x,y,d;//蛇的初始位置(x,y)和蛇的移动方向d
//用伪随机数产生蛇的初

始位置(x,y)和物体的移动方向d
//注意:(x,y)不要太靠近四个边,否则可能会出现游戏刚开始就结束了的情况。
srand((unsigned)time(NULL));
x=rand()%((width_gameBoard-10*sw)/(2*sw))*2*sw+5*sw;
y=rand()%((high_gameBoard-10*sw)/(2*sw))*2*sw+5*sw;
SNAKE*snak=(snake*)malloc(sizeof(snake));
snak->x=x;
snak->y=y;
head->next=snak;
snak->next=NULL;
d=rand()%4;//d为0表示向东,1表示向南,2表示向西,3表示向东。
sx=x;
sy=y;
sd=d;
setfillcolor(BULL);//设置蛇头为蓝色
fillcircle(x,y,sw);//绘制蛇头
}



7、随机地在蛇以外的位置放置食物
void SetFood()
{
int x,y;
//随机地得到一个蛇以外的位置
srand((unsigned)time(NULL));
do
{
x=rand()%(width_gameBoard/(2*sw))*2*sw+sw;
y=rand()%(high_gameBoard/(2*sw))*2*sw+sw;
}while(getpixel(x,y)==RED||getpixel(x,y)==BLUE);
setcolor(getbkcolor());//擦除圆的边缘线
setfillcolor(GREEN);//设置食物的填充颜色
fillcircle(x,y,sw);//绘制食物(圆形)
n=n+1;//统计放置食物的个数
}



8、获取游戏玩家发出的控制指令
int GetPlayerCommand()
{
int c=-1;//初始化游戏玩家发出的指令
char ch;
if(kbhit())//判断是否有键盘输入
{
ch=getch();//获取按键
switch(ch)
{
case 'f':
case 'F':c=0;break;//按‘f’或‘F’键,蛇向东转
case 'd':
case 'D':c=1;break;//按‘d’或‘D’键,蛇向南转
case 's':
case 'S':c=2;break;//按‘s’或‘S’键,蛇向西转
case 'e':
case 'E':c=3;break;//按‘e’或‘E’键,蛇向北转
case 'a':
case 'A':c=4;break;//按‘a’或‘A’键,提高蛇的移动速度
case ' ':pause();break;//按空格键,游戏暂停
case 27:exit(0);//按Esc键,退出游戏
}
}
return c;
}



9、游戏暂停
void pause()
{
setcolor(RED);
settextstyle(18,0,_T("黑体"));
outtextxy(width_gameBoard+10,110,"已暂停");
outtextxy(width_gameBoard+10,130,"按任意键");
outtextxy(width_gameBoard+10,150,"继续!");
_getch();
//擦除文字“已暂停,按任意键继续!”
setcolor(getbkcolor());
settextstyle(18,0,_T("黑体"));
outtextxy(width_gameBoard+10,110,"已暂停");//显示文字
outtextxy(width_gameBoard+10,130,"按任意键");
outtextxy(width_gameBoard+10,150,"继续!");
}



10、蛇按照玩家的控制命令进行移动
void SnakeMove(int x,int y,int d)
{
int c;
d=sd;
while(l)
{
for(int i=0;i<5;i++)
{
Sleep(150);
c=GetPlayerCommand();
//条件为假时忽略无效的游戏玩家命令
//如:在蛇的移动方向为向上时,按e或d键无效
if(((d==1||d==3)&&(c==0||c==2))||((d==0||d==2)&&(c==1||c==3)))
d=c;
else if(c==4)
break;
}
//根据方向d算出蛇头达到的下个位置(x,y)
switch(d)
{
case 0:x=x+2*sw;break;
case 1:y=y+2*sw;break;
case 2:x=x-2*sw;

break;
case 3:y=x-2*sw;break;
}
//判断蛇是否碰到四个边界或自身,碰到则游戏结束
if(x<0||y<0||x>width_gameBoard||y>high_gameBoard||getpixel(x,y)==RED)
{
GameOver(1);//结束游戏
break;
}
else //不结束进行下步运算
{
if(n>num_food)//判断规定数量的食物是否吃完。即游戏是否胜利。
{
GameOver(0);//结束游戏
break;
}
if(getpixel(x,y)==GREEN)//判断(x,y)位置是否有食物
SetFood();
else
ClearTaiNode();//擦除蛇尾结点
Eat(x,y);//在前方生成新结点
window_segmented();//绘制分割线,防止被蛇移动时擦除
}
}
}



11、判断游戏是否结束
void GameOver(bool iskilled)
{
settextstyle(18,0,_T("黑体"));
if(!iskilled)//判断游戏是否胜利结束
{
for(int i=0;i<5;i++)//游戏结果信息闪烁显示
{
if(i%2==0)
setcolor(RED);
else
setcolor(getbkcolor());//取消圆的边缘
outtextxy(width_gameBoard+10,110,"游戏结束");//输出结果
outtextxy(width_gameBoard+10,130,"任务已完成");
outtextxy(width_gameBoard+10,150,"好棒哦!");
Sleep(300);
}
}
else
{
for(int i=0;i<5;i++)//游戏结果信息闪烁显示
{
if(i%2==0)
setcolor(GREEN);//设置字体颜色
else
setcolor(getbkcolor());
outtextxy(width_gameBoard+10,110,"游戏结束");//输出结果
outtextxy(width_gameBoard+10,130,"没完成任务");
outtextxy(width_gameBoard+10,150,"继续努力!");
Sleep(300);
}
}
Sleep(500);
}



12、擦除蛇尾结点
void ClearTailNode()
{
setcolor(getbkcolor());//取消圆的边缘
setfillcolor(getbkcolor());//设置填充颜色为背景色
fillcircle(head->next->x,head->next->y,sw);//擦除
head->next=head->next->next;//删除
}


13、吃食物
void Eat(int x,int y)
{
SNAKE*NewSeg=(snake*)malloc(sizeof(snake));
SNAKE*pSnak=head;
while(pSnak->next!=NULL)//查找链表尾结点
pSnak=pSnak->next;
NewSeg->x=x;//把数据存入结点
NewSeg->y=y;
pSnak->next=NewSeg;//指针NewSeg(蛇新长的一节)插入到尾节点
NewSeg->next=NULL;
setfillcolor(BLUE);
fillcircle(x,y,sw);//食物变成蛇头
setcolor(getbkcolor());//取消圆的边缘
setfillcolor(RED);
fillcircle(pSnak->x,pSnak->y,sw);//蛇头变蛇身
dispScore();//显示得分
}



14、绘制启动画面上的两个按钮
void DrawTwoBtn()
{
int xb0,xb1,xb2,xb3,yb0,yb1,yb2,yb3;
xb0=xb1=xb2=xb3=yb0=yb1=yb2=yb3=0;
int btnw=80;//按钮的宽度为btnw
int btnw=30;//按钮的高度为btnw
setlinecolor(BLUE);
setfillcolor(boxbkclr);
xb0=width_window/2-3*btnw/2; //按钮1的位置坐标
yb0=high_window-2*btnh; //按钮1的位置坐标
xb1=width_window/2-btnw/2; //按钮1的位置坐标
yb1=high_window-btnh; //按钮1的位置坐标
xb2=width_window/2+btnw/2; //

按钮2的位置坐标
yb2=high_window-2*btnh; //按钮2的位置坐标
xb3=width_window/2+3*btnw/2; //按钮2的位置坐标
yb3=high_window-btnh; //按钮2的位置坐标
xb00=xb0;
xb01=xb1;
xb02=xb2;
yb00=yb0;
yb01=yb1;
yb02=yb2;
yb03=yb3;
setfillcolor(YELLOW);
fillroundrect(xb0,yb0,xb1,yb1,10,10);//用颜色填充按钮1
fillroundrect(xb2,yb2,xb3,yb3,10,10);//用颜色填充按钮2
setcolor(BLACK);
setbkmode(TRANSPARENT);//设置文字输出时的背景模式为透明色
settextstyle(18,0,_T("宋体"));
outtextxy(xb0+6,yb0+6,"操作指南");
outtextxy(xb2+6,yb2+6,"登录游戏");
}



15、绘制登陆界面
void DrawLoginUI()
{
int xb0,xb1,xb2,xb3,xb4,xb5,yb0,yb1,yb2,yb3,yb4,yb5,x10,y10,x11,y11;
xb0=xb1=xb2=xb3=xb4=xb5=yb0=yb1=yb2=yb3=yb4=yb5=x10=y10=x11=y11=0;
int w=360;//消息框的宽度为w
int h=180;//消息框的高度为h
int btnw=210;//输入框、按钮的宽度为btnw
int btnh=30;//输入框、按钮的高度为btnh
x10=(width_gameBoard-w)/2;//登录框的位置坐标
y10=(high_gameBoard-h)/2;//登录框的位置坐标
x11=(width_gameBoard+w)/2;//登录框的位置坐标
y11=(high_gameBoard+h)/2;//登录框的位置坐标
cleardevice();
setlinecolor(BLUE);
setfillcolor(boxbkclr);
fillroundrect(x10,y10,x11,y11,20,20);//用颜色填充矩形
xb0=x10+btnw/2;//账号输入框的位置坐标
yb0=y10+btnh;
xb1=xb0+btnw;
yb1=yb0+btnh;
xb2=xb0;//密码输入框的位置坐标
yb2=yb1+btnh/2;
xb3=xb1;
yb3=yb2+btnh;
xb4=xb0;
yb4=yb3+btnh/2;
xb5=xb1;
yb5=yb4+btnh;
xb00=xb0;
xb01=xb1;
xb02=xb2;
xb03=xb3;
yb00=yb0;
yb01=yb1;
yb02=yb2;
yb03=yb3;
xb04=xb4;
xb05=xb5;
yb04=yb4;
yb05=yb5;
setfillcolor(0xFFFFFF);
rectangle(xb0,yb0,xb1,yb1);//画账号输入框
fillrectangle(xb0,yb0,xb1,yb1);//用颜色填充
rectangle(xb2,yb2,xb3,yb3);//画密码输入框
fillrectangle(xb2,yb2,xb3,yb3);
setfillcolor(YELLOW);
fillroundrect(xb4,yb4,xb5,yb5,10,10);//用颜色填充登录按钮
setcolor(BLACK);
setbkmode(TRANSPARENT);//设置文字输出时的背景模式为透明色
settextstyle(18,0,_T("宋体"));
outtextxy(xb0-50,yb0+6,"账号:");
outtextxy(xb2-50,yb2+6,"密码:");
outtextxy(xb4+50,yb0+6,"登录:");
setcolor(0xD9D9D9);
settextstyle(12,0,_T("宋体"));
outtextxy(xb0+6,yb0+6,"点击输入marry并以回车或Tab键结束");
outtextxy(xb2+6,yb2+6,"点击输入tom123并以回车或Tab键结束");
setcolor(BLACK);
setbkmode(TRANSPARENT);
settextstyle(18,0,_T("宋体"));
}



16、绘制按钮
//xlu,ylu;xrd,yrd表示矩形左上角和右下角的坐标;xt,yt表示按钮上的字符显示的起始位置距离按钮左上角坐标的偏移量
//dispstr表示按钮上的字符
void BtnMoveClicked(int xlu.int ylu,int xrd,int yrd,int xt,int yt,char*dispstr)
{
int trans=MovDist;//按钮移动量为trans像素
setcolor(boxbkclr);
setfillcolor(boxbkclr);//设

置擦除字体颜色
fillroundrect(xlu,ylu,xrd,yrd,10,10);//用颜色填充擦除
xlu=xlu+trans;
ylu=ylu+trans;
xrd=xrd+trans;
yrd=yrd+trans;
setfillcolor(YELLOW);
fillroundrect(xlu,ylu,xrd,yrd,10,10);
setcolor(BLACK);
setbkmode(TRANSPARENT);//设置文字输出时的背景模式为透明色
settextstyle(18,0,_T("宋体"));
outtextxy(xlu+xt,ylu+yt,dispstr);
Sleep(100);
setcolor(boxbkclr);
setfillcolor(boxbkclr);
fillroundrect(xlu,ylu,xrd,yrd,10,10);
xlu=xlu-trans;
ylu=ylu-trans;
xrd=xrd-trans;
yrd=yrd-trans;
setcolor(BLACK);
setfillcolor(YELLOW);
fillroundrect(xlu,ylu,xrd,yrd,10,10);
outtextxy(xlu+xt,ylu+yt,dispstr);
}



17、绘制消息窗口
void DrawMsgBox()
{
int xb0,xb1,xb2,xb3,yb0,yb1,yb3;
xb0=xb1=xb2=xb3=yb0=yb1=yb2=yb3=0;
int w=360;//消息框的宽度为w
int h=180;//消息框的高度为h
int btnw=80;//按钮的宽度为btnw
int btnh=30;//按钮的高度为btnh
setlinecolor(BLUE);//设置线条颜色
setfillcolor(boxbkclr);//设置填充颜色
fillroundrect((width_gameBoard-w)/2,(high_gameBoard-h)/2,(width_gameBoard+w)/2,(high_gameBoard+h)/2,20,20);//用颜色填充矩形
xb0=width_gameBoard/2-3*btnw/2;//按钮1的位置坐标
yb0=high_gameBoard/2-btnh/2;//按钮1的位置坐标
xb1=width_gameBoard/2-btnw/2;//按钮1的位置坐标
yb1=high_gameBoard/2+btnh/2;//按钮1的位置坐标
xb2=width_gameBoard/2+btnw/2;//按钮2的位置坐标
yb2=high_gameBoard/2-btnh/2;//按钮2的位置坐标
xb3=width_gameBoard/2+3*btnw/2;//按钮2的位置坐标
yb3=high_gameBoard/2+btnh/2;//按钮2的位置坐标
xb00=xb0;
xb01=xb1;
xb02=xb2;
xb03=xb3;
yb00=yb0;
yb01=yb1;
yb02=yb2;
yb03=yb3;
setfillcolor(YELLOW);
fillroundrect(xb0,yb0,xb1,yb1,10,10);//用颜色填充按钮1
fillroundrect(xb2,yb2,xb3,yb3,10,10);//用颜色填充按钮2
setcolor(BLACK);
setbkmode(TRANSPARENT);//设置文字输出时的背景模式为透明色
settextstyle(28,0,_T("宋体"));
outtextxy(xb0+26,yb0-50,"本次游戏结束!");
settextstyle(18,0,_T("宋体"));
outtextxy(xb0+6,yb0+6,"再来一次");
outtextxy(xb2+6,yb2+6,"我不玩了");
}



18、响应鼠标点击
int ResponseMouse(int xb0,int yb0,int xb1,int yb1,int xb2,int yb2,int xb3,int yb3,int xb4,int yb4,int xb5,it yb5)
{
int place=-1;
MOUSEMSG m;//定义鼠标消息
while(ture)
{
m=GetMouseMsg();//获取一条鼠标消息
if(m.uMsg==WM_LBUTTONDOWN)
{
if(xb0==-1)//在绘图区域任意点击
{
place=0;
break;
}
//单击第一个对象,用户名/操作指南/再玩一次
if((m.x>xb0)&&(m.xyb0)&&(m.y{
place=1;
break;
}
//单击第二个对象:密码/登录游戏/我不玩了
if((m.x>xb2)&&(m.xyb2)&&(m.y{
place=2;
break;
}
//单击第一个对象:登录
if((m.x>xb4)&&(m.xyb4)&&(m.y{
place=3;
break;

}
}
}
return place;//返回鼠标点击的对象
}


19、输入账号
void InputName()
{
//用于存储用户名的
char Name[NameMaxLength]={'','','','','','','','','','','','\0'};
char c;
int i=0;
//下面2句用于覆盖用户名输入框中的提示文字
setfillcolor(0xFFFFFF);
fillrectangle(xb00,yb00,xb01,yb01);
setbkcolor(0XFFFFFF);//设置输入文本的背景颜色为白色
setbkmode(OPAQUE);//设置文本背景模式为不透明
while(1)
{
if(kbhit())//判断是否检测到键盘输入,有则获取键入字符,无则闪烁光标
{
c=getch();//有键盘输入,则获取键入字符
//输入为Tab键或回车键,则表示用户输入结束,此时要去掉输入框中的竖线,并输出
//然后结束输入
if(c==9||c==13||i>=NameMaxLength-2)
{
Name[i]='';//去掉输入框中的竖线
outtextxy(xb00+8,yb00+6,Name);
break;
}
//输入字母和数字键
if((c>=65&&c<=90)||(c>=97&&c<=122)||(c>=48&&c<=57))
{
Name[i]=c;
Name[i+1]='|';
outtextxy(xb00+8,yb00+6,Name);//输出字符串
i=i+1;
Sleep(100);
}
if(c==8)//输入退格键
{
if(i>0)//若前面有输入,则每输入一个退格键,取消前面的一个已输入字符
{
Name[i-1]='|';
Name[i]='';
outtextxy(xb00+8,yb00+6,Name);//输出字符串
i=i-1;
Sleep(100);
}
}
}
else//无键盘输入,则闪烁光标
{
Name[i]='';
outtextxy(xb00+8,yb00+6,Name);
Sleep(200);
Name[i]='|';
outtextxy(xb00+8,yb00+6,Name);
Sleep(200);
}
}
memcpy(IptName,Name,i);



20、输入密码
void InputPsd()
{
//用于储存密码的
char Psd[PsdMaxLength]={'','','','','','','','','','\0'};
//用于存储密码的显示字符,如‘*’
char PsdDisp[PsdMaxLength]={'','','','','','','','','','\0'};
//下面两句用于覆盖密码输入框中的提示文字
setfillcolor(0xFFFFFF);
fillrectangle(xb02,yb02,xb03,yb03);
char c;
int i=0;
setbkcolor(0XFFFFFF);
setbkmode(OPAQUE);
while(1)
{
if(kbhit())
//判断是否检验到键盘输入,有则获取键入字符,无责闪烁光标
{
c=getch();//有键盘输入,则获取键入字符
/*输入为Tab键或回车键,则表示密码输入结束,此时要去掉输入框中的竖线,并输出,然后结束输入*/
if(c==9||c==13||i>=PsdMaxLength-2)
{
Psd[i]='';//去掉竖线
PsdDisp[i]='';//去掉输入框中的竖线
outtextxy(xb02+8,yb02+6,PsdDisp);
break;
}
if((c>=65&&c<=90)||(c>=97&&c<=122)||(c>=48&&c<=57))
{
Psd[i]=c;
Psd[i+1]='|';
PsdDisp[i]='*';
PsdDisp[i+1]='|';
outtextxy(xb02+8,yb02+6,PsdDisp);
i=i+1;
Sleep(100);
}
if(c==8)//输入退格键
{
//若前面有输入,则每输入一个退格键,取消前面的一个已输入字符
if(i>0)
{
Psd[i-1]='|';
Psd[i]='';

PsdDisp[i-1]='|';
PsdDisp[i]='';
outtextxy(xb02+8,yb02+6,PsdDisp);//输出字符串
i=i-1;
Sleep(100);
}
}
}
else//无键盘输入,则闪烁光标
{
PsdDist[i]='';
outtextxy(xb02+8,yb02+6,PsdDisp);
Sleep(200);
PsdDist[i]='|';
outtextxy(xb02+8,yb02+6,PsdDisp);
Sleep(200);
}
}
setbkcolor(drawFieldbkclr);
memcpy(IptPsd,Psd,i);
}



21、点击登录,核对用户名和密码
int ChkNamePsd(char*pName,char*pPsd)
{
int xt=50;
int yt=6;
char str_regist[]="登录";
int result,rlt1,rlt2;
char space[NameMaxLength]={'','','','','','','','','','','','\0'};
BtnMoveClicked(xb04,yb04,xb05,yb05,xt,yt,str_regist);//绘制动感按钮
rlt1=memcmp(UserName,pName,5);//比对用户名
rlt2=memcmp(Password,pPsd,6);//比对密码
//用户名或密码不正确
if(!(rlt1==0&&rlt2==0&&pName[5]==''&&pPsd[6]==''))
{
setcolor(RED);
setbkcolor(0XFFFFFF);
setbkmode(TRANSPARENT);//设置文字输出时的背景模式为透明色
settextstyle(18,0,_T("宋体"));
outtextxy(xb00-50,yb00-20,"账号或密码输入错误,请重新输入!");
setbkmode(OPAQUE);
outtextxy(xb00+8,yb00+6,space);//输入字符串,删除账号输入框中的字符
outtextxy(xb02+8,yb02+6,space);
//清空用户上次输入的错误用户名
for(int i=0;i{
IptName[i]='';
}
IptName[NameMaxLength-1]='\0';
//清空用户上次输入的错误密码
for(int j=0;j{
IptPsd[j]='';
}
IptPsd[PsdMaxLength-1]='\0';
result=0;
return result;
}
else//用户名和密码都正确
{
result=1;
return result;
}
}



相关文档