还记得大一上学期就想做贪吃蛇了,甚至写了三分之二,最后没有办法实现蛇的移动,就作废了,不知道是不是这个学期变聪明了,哈哈,一口气就写出来了,当然了,主要还是问了同学。
贪吃蛇主要有几个地方难实现,首先是如何形成动画,这个是通过暂停程序sleep(time)来与刷新屏幕(system("cls")来实现的,后来发现刷新屏幕会一闪一闪,可以用goto()局部刷新或者是二级缓存。第二,是如何与玩家进行交互,说白了就是怎么获取键盘事件,当然有很多种,例如scanf,getch()等,但是我们不可能按下一个键还要按一下回车键才把行吧,所以就用了getch().第三就是怎么让蛇再没有获取到键盘命令的时候也会前进,这个是用判断是否有键盘输入kbnit()实现的(ε=ε=ε=(~ ̄▽ ̄)~,不要问我怎么知道的,神知道我怎么知道的)。差不多就这样了。接下来放代码,(其实就写了蛇的部分,也不是我一个人写的了,虽然大大大部分是我一个人写的,因为调用其他人写的难度比自己写出来还大,用户登录啥的是直接套用了我上个学期实训项目的https://www.cnblogs.com/miaos/p/miaoz-1-3.html,虽然不想这样,不过。。。真香(:,关于写蛇的部分我变个颜色)。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<conio.h>
#include<time.h>
#include<iostream>
#include<windows.h>
using namespace std;
typedef struct cmy {
char cmyID[20];
int money;
int kuchun;
char name[40];
char conment[100][100];
char commentcount;
}cm;
typedef struct shopcar {
int shuliang;
cm cmyi;
}car;
typedef struct gmjl {
int grad;
struct tm lt;
}jl;
typedef struct users {
char username[20];
char password[20];
int usermony;
car shopcar[20];
int shopcount;
char youxiang[30];
jl gmjlu[100];
int jilucount;
}uer;
typedef struct wjpass{
char wjname[20];
char beizhu[200];
char youxiang[30];
}wjp;
typedef struct wenti
{
wjp wangji[100];
int wjcount;
}wt;
typedef struct passw2
{
char a[20];
}passw2;
uer kehu[1000];//初始化信息
wt weti = { "0",0 };
char gb[20] = "缪传鹏最帅";
char adm[20] = "admin";
char admpassword[20] = "admin";
int count = 0;//用户量
int countsp1 , countsp2 = 5;
void yonhu(int usi);//用户界面 通过用户下标来标识
void zhuc();//注册界面
void den();//登陆界面
void csjm();//初始界面
void exeit();//播放退出动画然后退出
int nametoid(char name2[20]);//通过名字查找下标
void huangying();//欢迎界面
void exeit();
void youxijilu();
passw2 passw();//密码不回显
void zhanghuwenti(int usi);//反馈账户问题
void xiugaipassw(int usi);//修改密码
void kehuwent();//初始界面的反馈账户问题
void gly_zhaohu();//管理员找回用户密码
void shezhi();//设置界面
void beijingcolor();//背景颜色 未调用
void ziticolor();//字体颜色 未调用
struct tm gwtiame();//返回当前时间
void chonzhi(int usi);//充值
struct tm gwtiame()
{
time_t t;
struct tm*lt;
t=time(NULL);
lt = localtime(&t);
struct tm a = *lt;
return a;
}
/*******************************************************************变色失败,用分割线******************************************************************/
using namespace std;
typedef struct zuo
{
int x;
int y;
}zuo;
zuo z[100];//蛇坐标,蛇头为snak[0];
int shu=1;
int pause=0;
zuo food;//食物坐标
int ditu_x=40;//
int ditu_y=20;//地图
int speed=100;//速度;
char f='S';//方向 w a s d;
//
void p2game(int usi);//同下
void pgame(int usi);//这个排行榜,没写完,就没有调用了,不用管
void zhujiemian();//主界面
void stargame(int usi,int lk);//开始游戏
void printgame();//打印每一帧 *
void refood();//重置食物坐标
void fangxiang();//获取键盘,判断方向*
void snakyundon();//蛇的运动 *
int eat();//判断是否吃到食物;
void snakdead(int usi);//判断蛇是否死亡;
void shezhi();//设置
void GoTo(int x,int y);//这个是局部刷新的,貌似也没有用这个
void gotoxy(int x, int y)//没错,没有用上面那个赝品,用的是这个
{
COORD coord = {x, y};
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
}
void youxijilu(int usi)
{
while (1)
{
system("cls");
printf("========================================================游戏记录=======================================================\n");
for (int i = 0; i < kehu[usi].jilucount; i++)
{
printf("编号:%d\t", i + 1);
printf("时间:");
printf("%d年%d月%d日%d点%d分%d秒\t", kehu[usi].gmjlu[i].lt.tm_year + 1900, kehu[usi].gmjlu[i].lt.tm_mon, kehu[usi].gmjlu[i].lt.tm_mday, kehu[usi].gmjlu[i].lt.tm_hour, kehu[usi].gmjlu[i].lt.tm_min, kehu[usi].gmjlu[i].lt.tm_sec);
printf("成绩:%d",kehu[usi].gmjlu[i].grad); //printf("商品名称:%s\n", kehu[usi].gmjlu[i].jlsp.cmyi.name);
//printf("数量:%d\n", kehu[usi].gmjlu[i].jlsp.shuliang);
//printf("交易额:%d\n", kehu[usi].gmjlu[i].jlsp.shuliang*kehu[usi].gmjlu[i].jlsp.cmyi.money);
printf("——————————————————————————————\n");
}
printf("1——————退出\n");
char fla4 = getch();
if (fla4 == '1')
{
yonhu(usi);
}
}
}
void fangxiang()
{
if(kbhit())
{
char f1=getch();
if(f1=='D'||f1=='1'||f1=='S'||f1=='A'||f1=='W'||f1=='d'||f1=='s'||f1=='a'||f1=='w')
{if(f=='W'&&f1=='S'||f=='A'&&f1=='D'||f=='S'&&f1=='W'||f=='D'&&f1=='A'||f=='w'&&f1=='s'||f=='a'&&f1=='d'||f=='s'&&f1=='w'||f=='d'&&f1=='a');
else if(f1=='1')
{
pause=1;
}
else
f=f1;
}
}
}
void stargame(int usi,int lk)
{
char ff1='1';
if(lk==0)
{
for(;;){
cout<<"1---一般模式"<<endl;
cout<<"2---无敌模式(需要消耗10个金币)"<<endl;
ff1=getch();
if(ff1=='1'||ff1=='2')break;
system("cls");
}
}
system("cls");
if(ff1=='2')kehu[usi].usermony-=10;
z[0].x=1;
z[0].y=2;
food.x=5;
food.y=5;
f='d';
printgame();
for(;;)
{
Sleep(speed);
// getchar();
// system("cls");
fangxiang();
if(ff1=='1')snakdead(usi);
if(eat())
{
refood();
shu++;
}
p2game(usi);
snakyundon();
pgame(usi);
}
}
void snakyundon()
{
for(int i=shu-1;i>0;i--)
{
z[i]=z[i-1];
}
if(f=='W'||f=='w')z[0].y-=1;
if(f=='S'||f=='s')z[0].y+=1;
if(f=='A'||f=='a')z[0].x-=1;
if(f=='D'||f=='d')z[0].x+=1;
}
void printgame()
{
for(int i=1;i<=ditu_x*ditu_y;i++)
{
int flag=0;
if((i%ditu_x-1)==food.x&&i/ditu_x==food.y)
flag=1;
for(int j=0;j<shu;j++)
{
if((i%ditu_x-1)==z[j].x&&i/ditu_x==z[j].y)
flag=1;
}
if(i<=ditu_x||i%ditu_x==0||(i-1)%ditu_x==0||i>=ditu_x*(ditu_y-1))printf("*");
else printf(" ");
if(i%ditu_x==0)printf("\n");
//if(flag)cout<<flag;
}
//cout<<z[0].x<<" "<<z[0].y;
}
void refood(){
if(eat())
{
srand(time(0));
food.x=rand()%(ditu_x-2)+1;
food.y=rand()%(ditu_y-2)+1;
}
}
int eat(){
if(z[0].x==food.x&&z[0].y==food.y){
return 1;
}else return 0;
}
void snakdead(int usi)
{
int flag=0;
for(int i=1;i<shu;i++)
{
if(z[0].x==z[i].x&&z[0].y==z[i].y)flag=1;
}
if(z[0].y==0||z[0].y==ditu_y||z[0].x==0||z[0].x==ditu_x)
flag=1;
if(flag)
{
for(;;)
{system("cls");
cout<<"\n\n\n\n\n---------------you are dead------------"<<endl;
cout<<"\n\n---------do you want 复活(消耗2个金币)-------------"<<endl;
cout<<"\n\n-----1---是 2---否-------------"<<endl;
char ffg=getch();
if(ffg=='1')
{
kehu[usi].usermony-=2;
stargame(usi,1);
}
if(ffg=='2')
break;
}
kehu[usi].gmjlu[kehu[usi].jilucount].grad=shu;
kehu[usi].gmjlu[kehu[usi].jilucount++].lt=gwtiame();
shu=1;
z[0].x=10;
z[0].y=10;
food.x=5;
food.y=5;
//Sleep(3000);
yonhu(usi);
}
}
void chonzhi(int usi)
{
while (1)
{
system("cls");
printf("\n\n\n\n\n\n------------------------------------------------------------------------------------------------------------------------\n");
printf("\n\n\n\n\t\t\t\t\t\t您的余额是:%d\n\n\n\t\t\t\t\t\t1.充值余额\n\n\n\n\t\t\t\t\t\t2.返回上一层\n", kehu[usi].usermony);
printf("\n\n\n\n\n------------------------------------------------------------------------------------------------------------------------\n");
char flag22 = getch();
if (flag22 == '1')
{
char flag23[20];
printf("请输入第二组最帅以进行充值\n");
gets(flag23);
if (!strcmp(flag23, gb))
{
printf("充值中......");
kehu[usi].usermony += 100;
_sleep(1000);
printf("充值成功......");
_sleep(500);
}
else
{
printf("充值中........\n");
_sleep(2000);
printf("充值失败请重试......");
_sleep(500);
}
}
else if (flag22 == '2')
{
yonhu(usi);
}
}
}
void shezhi()
{
while (1)
{
system("cls");
printf("\n\n\n\n\n\n------------------------------------------------------------------------------------------------------------------------\n");
printf("\n\n\n\n\t\t\t\t\t\t1.设置颜色\n\n\n\t\t\t\t\t\t2.设置难度\n\n\n\t\t\t\t\t\t3.设置地图\n\n\n\t\t\t\t\t\t4.返回上一层");
printf("\n\n\n\n\n------------------------------------------------------------------------------------------------------------------------\n");
char fla1 = getch();
if (fla1 == '1')
{
while (1)
{
system("cls");
printf("\n\n\n\n------------------------------------------------------------------------------------------------------------------------\n");
printf("n\n\n\n\t\t\t\t\t\t1.黑底白字\n\n\t\t\t\t\t\t2.白底绿字\n\n\t\t\t\t\t\t3.黑底黄字\n\n\t\t\t\t\t\t4.黑底白字\n\n\t\t\t\t\t\t5.紫底白字\n\n\t\t\t\t\t\t6.返回\n");
printf("\n\n\n\n------------------------------------------------------------------------------------------------------------------------\n");
char fla2 = getch();
switch (fla2)
{
case '1':system("color 07"); break;
case '2':system("color 72"); break;
case '3':system("color 06"); break;
case '4':system("color 70"); break;
case '5':system("color 57"); break;
case '6':shezhi(); break;
}
}
}
if (fla1 == '4')
{
csjm();
}
if(fla1=='2')
{
for(;;)
{
system("cls");
printf("\n\n\n\n------------------------------------------------------------------------------------------------------------------------\n");
printf("\n\n\n\t\t\t\t\t\t1.简单\n\n\t\t\t\t\t\t2.一般\n\n\t\t\t\t\t\t3.困难\n\n\t\t\t\t\t\t4.地狱\n\n\t\t\t\t\t\t5.返回\n");
printf("\n\n\n\n------------------------------------------------------------------------------------------------------------------------\n");
char ffff=getch();
if(ffff=='1')speed=250;
if(ffff=='2')speed=100;
if(ffff=='3')speed=60;
if(ffff=='4')speed=10;
if(ffff=='5')break;
}
}
if(fla1=='3')
{
for(;;)
{
system("cls");
printf("\n\n\n\n------------------------------------------------------------------------------------------------------------------------\n");
printf("\n\n\n\t\t\t\t\t\t1.小\n\n\t\t\t\t\t\t2.中\n\n\t\t\t\t\t\t3.大\n\n\t\t\t\t\t\t4.返回\n");
printf("\n\n\n\n------------------------------------------------------------------------------------------------------------------------\n");
char ffff=getch();
if(ffff=='1'){ditu_x=20;ditu_y=10;break;}
if(ffff=='2'){ditu_x=40;ditu_y=20;break;}
if(ffff=='3'){ditu_x=80;ditu_y=40;break;}
if(ffff=='4')break;
}
}
}
}
void gly_zhaohu()
{
system("cls");
printf("————————客户问题————————\n");
if (weti.wjcount == 0)printf("当前没有客户问题\n");
for (int i = 0; i < weti.wjcount; i++)
{
printf("编号:%d\n名字:%s\n邮箱地址:%s\n问题:%s\n\n", i + 1, weti.wangji[i].wjname, weti.wangji[i].youxiang, weti.wangji[i].beizhu);
}
printf("——————————为客户找回密码——————————\n");
int tempbh;
printf("请输入客户姓名所对应的编号\n");
scanf("%d", &tempbh);
if (tempbh<1 || tempbh>weti.wjcount)
{
while (1)
{
printf("请输入正确的编号\n");
printf("1————重新输入\n2————退出\n");
char fla4 = getch();
if (fla4 == '1')
{
gly_zhaohu();
}
if (fla4 == '2')
{
kehuwent();
}
}
}
else
{
int kehui = nametoid(weti.wangji[tempbh-1].wjname);
printf("客户:%s\n密码:%s\n请通过他的邮箱%s告知。\n", kehu[kehui].username, kehu[kehui].password, kehu[kehui].youxiang);
printf("按任意键返回上一级\n");
getch();
}
}
void kehuwent()
{
while (1)
{
system("cls");
printf("\n\n——————————————————————————客户问题——————————————————————————————\n");
if (weti.wjcount == 0)printf("\n\n\t\t\t\t\t\t当前没有客户问题\n\n\n");
for (int i = 0; i < weti.wjcount; i++)
{
printf("编号:%d\n名字:%s\n邮箱地址:%s\n问题:%s\n\n", i + 1, weti.wangji[i].wjname, weti.wangji[i].youxiang, weti.wangji[i].beizhu);
}
printf("——————————————————————客户是上帝 请解决这些问题—————————————————————————\n\n");
printf("\n\n\t\t\t\t\t\t1.为客户找回密码\n\n\t\t\t\t\t\t2.删除问题\n\n\t\t\t\t\t\t3.解决其他问题\n\n\t\t\t\t\t\t4.退出\n");
char flag31 = getch();
if (flag31 == '1')
{
gly_zhaohu();
}
if (flag31 == '3')
{
printf("请手动解决\n");
_sleep(1000);
kehuwent();
}
if (flag31 == '2')
{
// gly_shanchuwt();
}
if (flag31 == '4')
{
//guangliyuan();
den();
}
}
}
int nametoid(char name2[20])
{
int flag4 = 0, t1;
for (int i = 0; i < count; i++)
{
if (!strcmp(name2, kehu[i].username))
{
flag4 = 1;
t1 = i;
}
}
if (flag4 == 0)
{
return -1;
}
else
return t1;
}
void zhanghuwenti(int usi)
{
while (1)
{
system("cls");
printf("\n\n\n\n\n\n------------------------------------------------------------------------------------------------------------------------\n");
printf("\n\n\n\n\t\t\t\t\t\t1.修改密码\n\n\n\t\t\t\t\t\t2.返回上一层\n");
printf("\n\n\n\n\n------------------------------------------------------------------------------------------------------------------------\n");
char flag30 = getch();
if (flag30 == '1')
{
xiugaipassw(usi);
}
else if (flag30 == '3')
{
//待增加
}
else if (flag30 == '2')
{
yonhu(usi);
}
}
}
passw2 passw()
{
passw2 x;
char ch, s[20];
int i = 0;
while ((ch = getch()) != '\r')
{
if (ch != 8)
{
x.a[i] = ch;
putchar('*');
i++;
}
else if (i > 0)
{
putchar('\b');
putchar(' ');
putchar('\b');
i--;
}
}
x.a[i] = '\0';
return x;
}
void zhaohuipassw()
{
system("cls");
char nametemp[20],bztemp[200];
printf("请输入账户名\n");
scanf("%s", nametemp);
if (nametoid(nametemp) == -1)
{
while (1)
{
printf("帐户名不存在\n");
printf("1————重新输入\n2————返回上一层\n");
char fla1 = getch();
if (fla1 == '1')zhaohuipassw();
if (fla1 == '2')den();
}
}
printf("请输入备注\n");
scanf("%s", bztemp);
char yxtemp[30];
while (1)
{
printf("请输入您的邮箱地址\n");
scanf("%s", yxtemp);
if (!strcmp(yxtemp, kehu[nametoid(nametemp)].youxiang))
{
strcpy(weti.wangji[weti.wjcount].beizhu, bztemp);
strcpy(weti.wangji[weti.wjcount].wjname, nametemp);
strcpy(weti.wangji[weti.wjcount].youxiang, yxtemp);
weti.wjcount++;
printf("等待管理员处理,处理成功新密码将发送至您的邮箱\n");
_sleep(1000);
break;
}
else
{
while (1)
{
system("cls");
printf("邮箱地址不正确\n");
printf("1————重新输入\n2————返回上一层\n");
char fla1 = getch();
if (fla1 == '1')
{
system("cls");
break;
}
if (fla1 == '2')den();
}
}
}
}
void xiugaipassw(int usi)
{
if (usi == -1)
{
char zhaoname[20];
system("cls");
printf("请输入账户名\n");
scanf("%s", zhaoname);
if (zhaoname == "-1")
{
printf("正在返回....");
_sleep(800);
den();
}
if (nametoid(zhaoname) == -1)
{
printf("此帐户名不存在\n");
printf("请重新输入,输入-1返回上一层\n");
xiugaipassw(-1);
}
else
{
while (1)
{
system("cls");
char zhaopass[20];
printf("请输入修改前密码");
scanf("%s", zhaopass);
if (!strcmp(zhaopass, kehu[nametoid(zhaoname)].password))
{
while (1)
{
char newpass1[20], newpass2[20];
printf("请输入新密码\n");
scanf("%s", newpass1);
printf("请再次输入新密码\n");
scanf("%s", newpass2);
if (!strcmp(newpass1, newpass2))
{
printf("修改密码成功...\n");
_sleep(800);
strcpy(kehu[nametoid(zhaoname)].password, newpass1);
printf("正在返回上一层....\n");
_sleep(600);
den();
}
else
{
printf("两次密码不相同请重新输入\n");
_sleep(800);
}
}
}
else
{
printf("密码错误\n1——————重新输入\n2——————退出\n");
_sleep(800);
while (1)
{
char flag28 = getch();
if (flag28 == '1')break;
if (flag28 == '2')den();
}
}
}
}
}
else
{
while (1)
{
system("cls");
char zhaopass[20];
printf("请输入修改前密码\n");
strcpy(zhaopass,passw().a);
if (!strcmp(zhaopass, kehu[usi].password))
{
while (1)
{
char newpass1[20], newpass2[20];
printf("\n请输入新密码\n");
strcpy(newpass1, passw().a);
printf("\n请再次输入新密码\n");
strcpy(newpass2, passw().a);
if (!strcmp(newpass1, newpass2))
{
printf("\n修改密码成功...\n");
_sleep(800);
strcpy(kehu[usi].password, newpass1);
printf("正在返回上一层....\n");
_sleep(600);
yonhu(usi);
}
else
{
printf("\n两次密码不相同请重新输入\n");
_sleep(800);
break;
}
}
}
else
{
printf("密码错误\n1——————重新输入\n2——————退出\n");
_sleep(800);
while (1)
{
char flag28 = getch();
if (flag28 == '1')break;
if (flag28 == '2')yonhu(usi);
}
}
}
}
}
void huangying()
{
printf("\n——————————————————————————————————————————欢迎光临—————————————————————————————————————————————————");
_sleep(1000);
}
void exeit()
{
system("cls");
printf("----------------------------------------欢迎下次再来---------------------------------------------------------------");
_sleep(1000);
FILE*fp;
fp = fopen("chaoshiahuju", "wb");
fwrite(&count, sizeof(int), 1, fp);
fwrite(&countsp2, sizeof(int), 1, fp);
for (int i = 0; i < count; i++)
fwrite(&kehu[i], sizeof(users), 1, fp);
fwrite(&weti, sizeof(wt), 1, fp);
fclose(fp);
_sleep(1000);
exit(0);
}
void guangliyuan()
{
while (1)
{
system("cls");
printf("\n\n\n\n\n\n------------------------------------------------------------------------------------------------------------------------\n");
printf("\n\n\n\n\t\t\t\t\t\t1.查看客户问题\n\n\n\t\t\t\t\t\t2.返回登录\n");
printf("\n\n\n\n\n------------------------------------------------------------------------------------------------------------------------\n");
char flag7 = getch();
if (flag7 == '2')
{
den();
}
else if (flag7 == '1')
{
kehuwent();
}
}
}
void yonhu(int usi)
{
while (1)
{
system("cls");
char flag10;
printf("\n\n\n\n------------------------------------------------------------------------------------------------------------------------\n");
printf("\n\n\n\n\t\t\t\t\t\t1.开始游戏\n\n\t\t\t\t\t\t2.查看游戏记录\n\n\t\t\t\t\t\t3.查看余额|充值余额\n\n\t\t\t\t\t\t4.账户问题\n\n\t\t\t\t\t\t5.游戏设置\n\n\t\t\t\t\t\t6.退出登录\n");
printf("\n\n\n\n------------------------------------------------------------------------------------------------------------------------\n");
flag10=getch();
if (flag10 == '1')
{
stargame(usi,0);
}
else if (flag10 == '2')
{
youxijilu(usi);
}
else if (flag10 == '3')
{
chonzhi(usi);
}
else if (flag10 == '6')
{
den();
}
else if (flag10 == '4')
{
zhanghuwenti(usi);
}
else if(flag10=='5')
{
shezhi();
}
}
}
void zhuc()
{
char usname[20];
char password[20], passwordag[20];
system("cls");
printf("请输入用户名\n");
scanf("%s", usname);
int flag3 = 0;
for (int i = 0; i < count; i++)
{
if (!strcmp(usname, kehu[i].username))flag3 = 1;
}
if (flag3)
{
printf("用户名已经存在请重新输入");
_sleep(1000);
zhuc();
}
else
{
int flag6 = 0;
while (1)
{
printf("请输入密码\n");
strcpy(password, passw().a);
system("cls");
printf("请再次输入密码\n");
strcpy(passwordag, passw().a);
if (strcmp(password, passwordag))
{
printf("两次密码不相同,请重新输入密码\n");
_sleep(1000);
}
else
{
system("cls");
printf("请输入您的邮箱地址\n");
scanf("%s", kehu[count].youxiang);
system("cls");
printf("注册成功");
_sleep(1000);
strcpy(kehu[count].username, usname);
strcpy(kehu[count].password, password);
kehu[count].jilucount = 0;
kehu[count].usermony = 100;
kehu[count++].shopcount = 0;
flag6 = 1;
break;
}
}
if (flag6)den();
}
}
void den()
{
char flag1;
while (1)
{
system("cls");
printf("\n\n\n\n\n\n------------------------------------------------------------------------------------------------------------------------\n");
printf("\n\n\n\n\t\t\t\t\t\t1.客户登录\n\n\n\t\t\t\t\t\t2.管理员登录\n\n\n\t\t\t\t\t\t3.返回上一层");
printf("\n\n\n\n\n------------------------------------------------------------------------------------------------------------------------\n");
flag1 = getch();
if (flag1 == '1')
{
while (1)
{
char name1[20];
char password2[20];
system("cls");
printf("请输入账户名\n");
scanf("%s", name1);
if (!strcmp(name1, "-1"))break;
int flag4 = 0, t1;
for (int i = 0; i < count; i++)
{
if (!strcmp(name1, kehu[i].username))
{
flag4 = 1;
t1 = i;
}
}
if (flag4 == 0)
{
while (1)
{
printf("用户名不存在\n");
printf("\n\n\n\n\n\n------------------------------------------------------------------------------------------------------------------------\n");
printf("\n\n\n\n\t\t\t\t\t\t1.重新输入\n\n\n\t\t\t\t\t\t2.返回上一层\n");
printf("\n\n\n\n\n------------------------------------------------------------------------------------------------------------------------\n");
char fla1 = getch();
if (fla1 == '1')break;
if (fla1 == '2')den();
_sleep(1000);
}
}
else
{
printf("请输入密码\n");
strcpy(password2, passw().a);
if (!strcmp(password2, "-1"))den();
if (!strcmp(password2, kehu[t1].password))
{
system("cls");
printf("登入成功");
_sleep(1000);
yonhu(t1);
}
else
{
printf("密码不正确");
_sleep(1000);
}
}
}
}
if (flag1 == '2')
{
char name2[20];
char password3[20];
while (1)
{
system("cls");
printf("请输入账户名\n");
scanf("%s", name2);
if (!strcmp(name2, "-1"))break;
if (strcmp(name2, adm))
{
while (1)
{
printf("用户名不存在\n");
printf("\n\n\n\n\n\n------------------------------------------------------------------------------------------------------------------------\n");
printf("\n\n\n\n\t\t\t\t\t\t1.重新输入\n\n\n\t\t\t\t\t\t2.返回上一层\n");
printf("\n\n\n\n\n------------------------------------------------------------------------------------------------------------------------\n");
char fla1 = getch();
if (fla1 == '1')break;
if (fla1 == '2')den();
_sleep(1000);
}
}
else
{
printf("请输入密码\n");
strcpy(password3, passw().a);
if (strcmp(password3, admpassword))
{
printf("密码不正确\n");
}
else
{
system("cls");
printf("登录成功");
_sleep(1000);
//后续程序
guangliyuan();
}
}
}
exeit();
}
if (flag1 == '3')
{
csjm();
}
}
}
void csjm()
{
while (1)
{
system("cls");
char flag5 = 0;
char flag2 = '0';
while (1)
{
system("cls");
printf("\n\n\n\n\n\n\n------------------------------------------------welcome come snake game-------------------------------------------------\n\n");
printf("\n\n\n\n\n\t\t1.登录\t\t2.注册\t\t3.账户问题\t\t4.设置\t\t5.退出\n");
printf("\n\n\n\n\n\n------------------------------------------------------------------------------------------------------------------------\n");
flag2 = getch();
if (flag2 == '1')
{
den();
break;
}
if (flag2 == '2')
{
zhuc();
break;
}
if (flag2 == '5')
{
system("cls");
printf("----------------------------------------欢迎下次再来---------------------------------------------------------------");
_sleep(1000);
exeit();
}
if (flag2 == '3')
{
while (1)
{
system("cls");
printf("\n\n\n\n\n\n------------------------------------------------------------------------------------------------------------------------\n");
printf("\n\n\n\n\t\t\t\t\t\t1.修改密码\n\n\n\t\t\t\t\t\t2.找回密码\n\n\n\t\t\t\t\t\t3.返回上一级\n");
printf("\n\n\n\n\n------------------------------------------------------------------------------------------------------------------------\n");
char flag29 = getch();
if (flag29 == '1')
{
xiugaipassw(-1);
}
if (flag29 == '2')
{
zhaohuipassw();
}
if (flag29 == '3')break;
}
}
if (flag2 == '4')
{
shezhi();
}
}
}
}
void pgame(int usi)
{
for(int j=0;j<shu;j++)
{
if(z[shu-1].x>0&&z[shu-1].x<ditu_x&&z[shu-1].y<ditu_y-1&&z[shu-1].y>0)
{
gotoxy(z[j].x,z[j].y);
cout<<'&';
}
}
gotoxy(food.x,food.y);
cout<<'@';
//gotoxy(0,0);
gotoxy(0,21);
if(pause==1)
{
for(;;){
cout<<"1----继续 "<<endl;
cout<<"2----你选择死亡"<<endl;
char ff=getch();
if(ff=='1')
{
pause=0;
break;
}
if(ff=='2')
{
pause=0;
z[0].x=0;
snakdead(usi);
}
}
}
gotoxy(0,21);
cout<<"当前分数:"<<shu<<endl;
cout<<"1----暂停 "<<endl;
}
void p2game(int usi)
{
if(z[shu-1].x>0&&z[shu-1].x<ditu_x&&z[shu-1].y-1<ditu_y-1&&z[shu-1].y>0)
gotoxy(z[shu-1].x,z[shu-1].y);
cout<<' ';
gotoxy(food.x,food.y);
cout<<' ';
}
int main()
{
system("mode con cols=120 lines=30");
FILE*fp;
fp = fopen("chaoshiahuju", "rb+");
fread(&count, sizeof(int), 1, fp);
fread(&countsp2, sizeof(int), 1, fp);
for (int i = 0; i < count; i++)
fread(&kehu[i], sizeof(users), 1, fp);
fread(&weti, sizeof(wt), 1, fp);
fclose(fp);
system("color 70");
csjm();
return 0;
}
关于命令行贪吃蛇就这样了,接下来是qt写的桌面版贪吃蛇,这次学到不少,也吃了不少亏(下面会讲)。
如果你没有接触过qt,(qt大法好,mfc没饭吃)我分享一下我看的大神写的学习教程,http://www.qter.org/portal.php?mod=view&aid=26
你可能还需要环境配置的教程https://blog.csdn.net/liang19890820/article/details/53931813
其实只要会一点qt,做贪吃蛇是很简单的,不过我经历了一些苦难,唉。
首先和命令行一样要思考的三个问题,第一,如何形成动画,也就是如何把游戏画面给输出来,还记得我说的吃亏吗,就是在这里,我首先想到的是用qlabel把图片输出,然后通过控制qlabel的坐标进行动画,我一度甚至以为这个方法很绝妙,甚至直到我看到一条杀马特一样扭曲的蛇我还没有放弃。。。直到我发现qtpainter,可以直接在相应坐标上输出图片。。。所以真正的方法是用qtpaiter来输出图片,通过控制图片的坐标来形成动画。第二就是怎么与玩家进行交互,由于没有命令行,普通的scanf,gets是绝对行不通的,qt有自己的qt键盘事件获取方式也就是keyevent,第三是怎么控制时间,帧率,让蛇的运动函数循环运行,用的是qtime里面的timeupdate,来实现循环加sleep同样的功能,主要是因为sleep在qt里面没有用。解决了这些问题,到贴代码部分了
首先是头文件
snk.h在里面我定义了一些全局变量,具体看注释。
#ifndef SNK_H
#define SNK_H
typedef struct zuo//坐标结构体
{
//zuo() {}
int x;
int y;
}zuo;
extern char f,f2;//方向f,以及键盘按的键f1
extern zuo snkz[199];//蛇的头与身体在其中z[0]是头
extern zuo foodz;//食物的坐标
extern int shu,pause;//蛇的身体数与有关游戏暂停的全局变量
extern int ditu_x,ditu_y;//地图大小
extern int xuanz;//蛇头摆的方向,1为逆时针,0为顺时针。后来没有用到
extern int speed;//速度,也就是帧率,刷新率。
#endif // SNK_H
另外说一下extern,大概就是让你重复定义变量而不会报错,这样做的原因https://blog.csdn.net/caoshangpa/article/details/51104022
dialog.h
#ifndef DIALOG_H
#define DIALOG_H
#include <QDialog>
namespace Ui {
class Dialog;
}
class Dialog : public QDialog
{
Q_OBJECT
public:
explicit Dialog(QWidget *parent = 0);
~Dialog();
private:
Ui::Dialog *ui;
};
#endif // DIALOG_H
没啥东西要讲,你可以理解为我看不懂。
mainwindows.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include<QLabel>
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
private slots://声明一些要用的函数
void on_label_2_linkActivated(const QString &link);//没啥用
void timeUpDate();
void keyPressEvent(QKeyEvent *e);
void paintEvent(QPaintEvent*w);
void on_pushButton_clicked();
//void on_pushButton_windowTitleChanged(const QString &title);
void on_pushButton_2_clicked();
private://声明一些控件
Ui::MainWindow *ui;
QList<QLabel*> p;
};
#endif // MAINWINDOW_H
就是声明了一些函数。
接着是cpp文件
dialog.cpp
#include "dialog.h"
#include "ui_dialog.h"
Dialog::Dialog(QWidget *parent) :
QDialog(parent),
ui(new Ui::Dialog)
{
ui->setupUi(this);
setWindowTitle(QStringLiteral("by miaoz"));
}
Dialog::~Dialog()
{
delete ui;
}
啥也没有
main.cpp
#include "mainwindow.h"
#include <QApplication>
#include "dialog.h"
#include <snk.h>
//重新声明一下头文件里的变量,具体看前面关于头文件定义全局变量的链接
int shu=2;
zuo snkz[199];
zuo foodz;
char f='w',f2='w';
int pause=0;
int ditu_x=24,ditu_y=24;
int xuanz=0;
int speed=400;
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
Dialog dl;
w.setWindowIcon(QIcon(":/new/prefix1/D:/qt/qt/code/sorce/head (a).png"));//设置窗口图标
dl.setWindowIcon(QIcon(":/new/prefix1/D:/qt/qt/code/sorce/head (a).png"));//同上
if(dl.exec()==Dialog::Accepted)//如果收到开始游戏按下的信号,就开始游戏。
{
w.show();
return a.exec();//窗口一张运行,直到被关闭
}
else return 0;//
}
mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include<QVBoxLayout>
#include<QKeyEvent>
#include<QVector>
#include<QList>
#include<QWidget>
#include<time.h>
#include<conio.h>
#include<cstdlib>
#include<QTime>
#include<dialog.h>
#include<cstdio>
#include<QtCore>
#include "snk.h"
#include"QPainter"
void chus()//初始化全局变量
{
speed=400;
shu=3;
snkz[0].x=6;
snkz[0].y=6;
foodz.x=5;
foodz.y=5;
f='s';
}
void refood()//重置食物
{
for(;;)
{
int flag1=1;
srand(time(0));
int x=rand()%(ditu_x-1)+1;
srand(time(0));
int y=rand()%(ditu_y-1)+1;
for(int i=0;i<shu;i++)
{
if(x==snkz[i].x&&y==snkz[i].y)
flag1=0;
}
if(flag1)
{
foodz.x=x;
foodz.y=y;
break;
}
}
}
void snakeyundon()//蛇的运动
{
//int speed=40;
//zuo temp=z[shu-1];
if(f=='W')
{
snkz[0].y-=1;
}
if(f=='D')
{
snkz[0].x+=1;
}
if(f=='S')
{
snkz[0].y+=1;
}
if(f=='A')
{
snkz[0].x-=1;
}
for(int i=shu-1;i>0;i--)
{
snkz[i]=snkz[i-1];
}
}
int eat()//判断是否吃到食物
{
if(snkz[0].x==foodz.x&&snkz[0].y==foodz.y)
{
refood();
shu++;
speed-=50;
return 1;
}
return 0;
}
void fangxiang()//判断方向
{
if(kbhit())
{
char f1=getch();
if(f1=='D'||f1=='1'||f1=='S'||f1=='A'||f1=='W'||f1=='d'||f1=='s'||f1=='a'||f1=='w')
{if(f=='W'&&f1=='S'||f=='A'&&f1=='D'||f=='S'&&f1=='W'||f=='D'&&f1=='A'||f=='w'&&f1=='s'||f=='a'&&f1=='d'||f=='s'&&f1=='w'||f=='d'&&f1=='a');
else if(f1=='1')
{
pause=1;
}
else{
if(f=='W'&&f1=='D'||f=='D'&&f1=='S'||f=='S'&&f1=='A'||f=='A'&&f1=='W'||f=='w'&&f1=='d'||f=='d'&&f1=='s'||f=='s'&&f1=='a'||f=='a'&&f1=='w')
xuanz=0;
else xuanz=1;
f=f1;
}
}
}
}
void snakyundon()//这个也是蛇的运动,忘记用了那个,自己看
{
int k=1;
for(int i=shu-1;i>0;i--)
{
snkz[i]=snkz[i-1];
}
if(f=='W'||f=='w')snkz[0].y-=k;
if(f=='S'||f=='s')snkz[0].y+=k;
if(f=='A'||f=='a')snkz[0].x-=k;
if(f=='D'||f=='d')snkz[0].x+=k;
}
int snakdead()//判断蛇是否死亡
{
int flag=0;
for(int i=1;i<shu;i++)
{
if(snkz[0].x==snkz[i].x&&snkz[0].y==snkz[i].y)flag=1;
}
if(snkz[0].y==0||snkz[0].y==ditu_y||snkz[0].x==0||snkz[0].x==ditu_x)
flag=1;
return flag;
}
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
chus();
ui->setupUi(this);
QWidget *widgetMain = new QWidget();//布局管理器
QVBoxLayout *verLayout = new QVBoxLayout(widgetMain);//
QTimer *timer = new QTimer(this);//新建一个定时器
connect(timer,SIGNAL(timeout()),this,SLOT(timeUpDate()));//连接信号与槽
timer->start(speed);设置间隔时间
//ui->label_2->setText(QString::number(shu));
}
MainWindow::~MainWindow()
{
//if(pause==-1)close();
delete ui;
}
void MainWindow::timeUpDate()
{
if(snakdead())
{
ui->pushButton->setText("重新游戏");
pause=-1;
}
if(!pause)
{
ui->label_3->setText("gaming...");
ui->lcdNumber->display(shu);
ui->lcdNumber_2->display(450-speed);
ui->lcdNumber_3->display(snkz[0].x);
ui->lcdNumber_4->display(snkz[0].y);
eat();
snakyundon();
update();
}
}
void MainWindow::paintEvent(QPaintEvent*w)
{
QPainter painter(this);
setWindowTitle(QStringLiteral("snake"));
QFont ft;
ft.setPointSize(20);
QPalette clo;
clo.setColor(QPalette::WindowText,Qt::blue);
ui->label_3->setFont(ft);
ui->label_3->setPalette(clo);
QPixmap ps(500,500);
ps.load(":/new/prefix1/D:/qt/qt/code/sorce/shu.png");
if(pause==-1)
{
ui->pushButton->setText("重新游戏");
ui->label_3->setText("you are dead...");
painter.drawPixmap(0,0,500,500,ps);
}
else
{
painter.drawPixmap(0,0,500,500,QPixmap(":/new/prefix1/D:/qt/qt/code/sorce/beij.png"));
painter.setRenderHints(QPainter::Antialiasing,false);
QPixmap pixa(20, 20);
pixa.load(":/new/prefix1/D:/qt/qt/code/sorce/head (a).png"); //
QPixmap pixs(20, 20);
pixs.load(":/new/prefix1/D:/qt/qt/code/sorce/head (s).png"); //
QPixmap pixd(20, 20);
pixd.load(":/new/prefix1/D:/qt/qt/code/sorce/head (d).png"); //
QPixmap pixw(20, 20);
pixw.load(":/new/prefix1/D:/qt/qt/code/sorce/head (w).png"); //
QPixmap pix2(20,20);
pix2.load(":/new/prefix1/D:/qt/qt/code/sorce/body.png");
QPixmap pix3(20,20);
pix3.load(":/new/prefix1/D:/qt/qt/code/sorce/body (2).png");
painter.drawPixmap(foodz.x*20, foodz.y*20, pix2);
for(int i=1;i<shu;i++)
{
painter.drawPixmap(snkz[i].x*20, snkz[i].y*20, pix3);
}
if(f=='w'||f=='W')painter.drawPixmap(snkz[0].x*20, snkz[0].y*20, pixw);
if(f=='s'||f=='S')painter.drawPixmap(snkz[0].x*20, snkz[0].y*20, pixs);
if(f=='a'||f=='A')painter.drawPixmap(snkz[0].x*20, snkz[0].y*20, pixa);
if(f=='d'||f=='D')painter.drawPixmap(snkz[0].x*20, snkz[0].y*20, pixd);
}
}
void MainWindow::keyPressEvent(QKeyEvent *e)
{
//int keyvalue=e->key();
if(e->key()==Qt::Key_W)
{
// k1++;
if(f!='S')
{
f='W';
}
}
if(e->key()==Qt::Key_A)
{
//k1++;
if(f!='D')
{
f='A';
}
}
if(e->key()==Qt::Key_S)
{
//k1++;
if(f!='W')
{
f='S';
}
}
if(e->key()==Qt::Key_D)
{
//k1++;
if(f!='A')
{
f='D';
}
}
}
void MainWindow::on_label_2_linkActivated(const QString &link)
{
}
void MainWindow::on_pushButton_clicked()
{
if(pause==1)
{
ui->pushButton->setText("暂停");
ui->label_3->setText("gaming...");
pause=0;
}
else if(pause==0)
{
ui->pushButton->setText("继续");
ui->label_3->setText("stoping...");
pause=1;
}
else if(pause==-1)
{
ui->pushButton->setText("暂停");
chus();
ui->label_3->setText("gaming...");
pause=0;
}
}
void MainWindow::on_pushButton_2_clicked()
{
// pause=-1;
// parentWidget()->show();
delete this;
// this->hide();//主界面关闭
}
大概就是这样,有关qtime,qkeyevent,qpaiter等,自己去查资料,(主要是想睡觉了)
最后分享整个项目(包括我辛辛苦苦剪辑的图片素材)

链接: https://pan.baidu.com/s/1rApHeAUTQ-CpS7y-zetNxg
密码: 1wgt
浙公网安备 33010602011771号