用c实现了贪吃蛇的代码。
刚开始总是不明白如何去更新原来的图像,看了别人博客貌似都有一个gotoxy函数,刚开始没仔细看没怎么弄懂,不清楚把屏幕上的指针移到某个位置有神马用,后来偶然看到了下面紧跟着的printf,突然顿悟,这样就能实现图像的具体地方的更新了。
不过还是有点坑的是刚开始我直接贴的一个gotoxy函数的坐标和我自己的坐标是反过来的,老是出错,调了会儿就改过来了,结果刚开始改的时候犯了点傻,没改函数改了自己写的坐标导致我后面的坐标都写反了T_T。
#include <iostream>
#include<string.h>
#include<algorithm>
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<windows.h>
#include <conio.h>
using namespace std;
typedef long long ll;
struct data
{
char hh;
int x,y;
} a[22][44];
int timef;
int sx,sy,ex,ey;
void gotoxy(int x,int y)
{
HANDLE h1;
COORD pos;
pos.X=x;
pos.Y=y;
h1=GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleCursorPosition(h1,pos);
}
int score;
void error()
{
Sleep(1000);
system("cls");
printf("----------------------------------------------------\n");
printf("| |\n");
printf("| 你的最终得分:%d |\n",score);
printf("| |\n");
printf("| 菜鸡,你怎么又输了!(输入任何键加回车返回) |\n");
printf("| |\n");
printf("| |\n");
printf("----------------------------------------------------\n");
char ff;
scanf(" %c",&ff);
}
void getfood()
{
while(1)///还没有吃到食物
{
int tex=rand()%20+1,tey=rand()%42+1;
if(a[tex][tey].hh==0)
{
a[tex][tey].hh='*';
gotoxy(tey,tex);
printf("*");
break;
}
}
}
void show()///显示初始蛇的图像
{
system("cls");
for(int i=0; i<22; i++)
for(int j=0; j<44; j++)
{
a[i][j].x=i,a[i][j].y=j;
if(j==0)
a[i][j].hh='|';
else if(j==43)
a[i][j].hh='|';
if(i==0)
a[i][j].hh='-';
else if(i==21)
a[i][j].hh='-';
if(j==0||j==43||i==0||i==21)
{
gotoxy(j,i);
printf("%c",a[i][j].hh);
}
}
a[11][20].hh='@';
a[11][21].hh='@';
a[11][22].hh='O';
sx=11,sy=22;
ex=11,ey=20;
a[11][22].x=11;
a[11][22].y=21;
a[11][21].x=11;
a[11][21].y=20;
gotoxy(20,11);
printf("@");
gotoxy(21,11);
printf("@");
gotoxy(22,11);
printf("O");
getfood();
gotoxy(50,9);
printf(" 你的分数:");
gotoxy(50,10);
printf("当前速度:");
gotoxy(65,10);
printf("单位/秒");
gotoxy(0,23);
}
void start()
{
show();
int fx=1;///1右 2上 3左 4下
while(1)
{
Sleep(timef-score*(timef*0.01));
int key=0;
if(kbhit())
while(kbhit())///捕捉输入信息
{
gotoxy(0,23);
key=getche();
}
if (key == 72) fx=2;///是上箭头;
else if (key== 80) fx=4;///是下箭头;
else if (key== 75) fx=3;///是左箭头
else if (key== 77) fx=1;
int flag=0;///蛇是否吃到了食物
if(fx==1)///右
{
if(sy+1<43&&a[sx][sy+1].hh!='@')
{
if(a[sx][sy+1].hh=='*')
{
getfood();
flag=1;
}
gotoxy(sy,sx);
putchar('@');
gotoxy(sy+1,sx);
putchar('O');
gotoxy(0,23);
a[sx][sy].hh='@',a[sx][sy+1].hh='O',a[sx][sy+1].y=sy,sy++;
}
else
{
error();
return;
}
}
else if(fx==2)///上
{
if(sx-1>0&&a[sx-1][sy].hh!='@')
{
if(a[sx-1][sy].hh=='*')
{
getfood();
flag=1;
}
gotoxy(sy,sx);
putchar('@');
gotoxy(sy,sx-1);
putchar('O');
gotoxy(0,23);
a[sx][sy].hh='@',a[sx-1][sy].hh='O',a[sx-1][sy].x=sx,sx--;
}
else
{
error();
return;
}
}
else if(fx==3)///左
{
if(sy-1>0&&a[sx][sy-1].hh!='@')
{
if(a[sx][sy-1].hh=='*')
{
getfood();
flag=1;
}
gotoxy(sy,sx);
putchar('@');
gotoxy(sy-1,sx);
putchar('O');
gotoxy(0,23);
a[sx][sy].hh='@',a[sx][sy-1].hh='O',a[sx][sy-1].y=sy,sy--;
}
else
{
error();
return;
}
}
else if(fx==4)///下
{
if(sx+1<21&&a[sx+1][sy].hh!='@')
{
if(a[sx+1][sy].hh=='*')
{
getfood();
flag=1;
}
gotoxy(sy,sx);
putchar('@');
gotoxy(sy,sx+1);
putchar('O');
gotoxy(0,23);
a[sx][sy].hh='@',a[sx+1][sy].hh='O',a[sx+1][sy].x=sx,sx++;
}
else
{
error();
return;
}
}
if(flag)score++;
gotoxy(64,9);
printf("%d",score);
gotoxy(59,10);
printf("%.2f",1000.0/(double)(timef-(timef*0.01)*score));
gotoxy(0,23);
int tx=sx,ty=sy;
while(!flag)
{
int xx=tx,yy=ty;
if(a[tx][ty].x==ex&&a[tx][ty].y==ey)
{
gotoxy(ey,ex);
printf(" ");
gotoxy(0,23);
a[ex][ey].hh=0;
a[tx][ty].x=tx,a[tx][ty].y=ty;
ex=tx,ey=ty;
break;
}
tx=a[xx][yy].x;
ty=a[xx][yy].y;
}
}
}
void init()
{
score=0;
char x;
memset(a,0,sizeof(a));
printf("------------------------------\n");
printf("| |\n");
printf("| 这里是贪吃蛇小游戏 |\n");
printf("| 下面请输入游戏的难度: |\n");
printf("| a:简单 |\n");
printf("| b:一般 |\n");
printf("| c:困难 |\n");
printf("| |\n");
printf("------------------------------\n");
scanf(" %c",&x);
if(x=='a')
timef=400;
else if(x=='b')
timef=250;
else
timef=160;
}
int main()
{
while(1)
{
srand(time(0));
system("cls");
init();
start();
}
return 0;
}