首页 文章 贪吃蛇

贪吃蛇

2024-09-16 19:37  浏览数:222  来源:13888510299    

#include<stdio.h>
#include<Windows.h>
#include<stdlib.h>
#include<time.h>
#include<conio.h>
#define ROW 22
#define COL 42
#define KONG 0
#define WALL 1
#define FOOD 2
#define HEAD 3
#define BODY 4
#define UP 72
#define DOWN 80
#define LEFT 75
#define RIGHT 77
#define SPACE 32
#define ESC 27
struct Snake{
int len;
int x;
int y;
}snake;
struct Body{
int x;
int y;
}body[ROW*COL];
int face[ROW][COL];
void HideCursor();
void CursorJump(int x, int y);
void InitInterface();
void color(int c);
void ReadGrade();
void WriteGrade();
void InitSnake();
void RandFood();
void JudgeFunc(int x, int y);
void DrawSnake(int flag);
void MoveSnake(int x, int y);
void run(int x, int y);
void Game();
int max,grade;
int main(){
#pragma warning (disable:4996)
max=0,grade=0;
system("title 贪吃蛇");
system("mode con cols=84 lines=23");
HideCursor();
ReadGrade();
InitInterface();
InitSnake();
srand((unsigned int)time(NULL));
RandFood();
DrawSnake(1);
Game();
return 0;
}
void HideCursor(){
CONSOLE_CURSOR_INFO curInfo;
curInfo.dwSize=1;
curInfo.bVisible=FALSE;
HANDLE handle=GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleCursorInfo(handle,&curInfo);
}
void CursorJump(int x, int y){
COORD pos;
pos.X=x;
pos.Y=y;
HANDLE handle=GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleCursorPosition(handle, pos);
}
void InitInterface(){
color(6);
for(int i=0;i<ROW;i++){
for(int j=0;j<COL;j++){
if(j==0||j==COL-1){
face[i][j]=WALL;
CursorJump(2*j,i);
printf("■");
}else if(i==0||i==ROW-1){
face[i][j]=WALL;
printf("■");
}else{
face[i][j]=KONG;
}
}
}
color(7);
CursorJump(0,ROW);
printf("当前得分:%d",grade);
CursorJump(COL,ROW);
printf("历史最高得分:%d",max);
}
void color(int c){
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), c);
}
void ReadGrade(){
FILE*pf=fopen("贪吃蛇最高得分记录.txt","r");
if(pf==NULL){
pf=fopen("贪吃蛇最高得分记录.txt", "w");
fwrite(&max,sizeof(int),1,pf);
}
fseek(pf,0,SEEK_SET);
fread(&max,sizeof(int),1,pf);
fclose(pf);
pf=NULL;
}
void WriteGrade(){
FILE*pf=fopen("贪吃蛇最高得分记录.txt", "w");
if(pf==NULL){
printf("保存最高得分记录失败\n");
exit(0);
}
fwrite(&grade,sizeof(int),1,pf);
fclose(pf);
pf=NULL;
}
void InitSnake(){
snake.len=1;
snake.x=COL/2;
snake.y=ROW/2;
body[0].x=COL/2-1;
body[0].y=ROW/2;
body[1].x=COL/2-2;
body[1].y=ROW/2;
face[snake.y][snake.x]=HEAD;
face[body[0].y][body[0].x]=BODY;
face[body[1].y][body[1].x]=BODY;
}
void RandFood(){
int i,j;
for(int k=1;k<=10;k++){
do{
i=rand()%ROW;
j=rand()%COL;
}while(face[i][j]!=KONG);
face[i][j]=FOOD;
color(12);
CursorJump(2*j,i);
printf("●");
}
}
void JudgeFunc(int x,int y){
if(face[snake.y+y][snake.x+x]==FOOD){
snake.len++;
grade+=10;
color(7);
CursorJump(0,ROW);
printf("当前得分:%d",grade);
RandFood();
}
else if(face[snake.y+y][snake.x+x]==WALL||face[snake.y+y][snake.x+x]==BODY){
Sleep(1000);
system("cls");
color(7);
CursorJump(2*(COL/3),ROW/2-3);
if (grade>max){
printf("恭喜你打破最高记录,最高记录更新为%d",grade);
WriteGrade();
}
else if(grade==max){
printf("与最高记录持平,加油再创佳绩",grade);
}else{
printf("请继续加油,当前与最高记录相差%d",max-grade);
}
CursorJump(2*(COL/3),ROW/2);
printf("GAME OVER");
while(1){
char ch;
CursorJump(2*(COL/3),ROW/2+3);
printf("再来一局?(y/n):");
scanf("%c",&ch);
if(ch=='y'||ch=='Y'){
system("cls");
main();
}else if(ch=='n'||ch=='N'){
CursorJump(2*(COL/3),ROW/2+5);
exit(0);
}else{
CursorJump(2*(COL/3),ROW/2+5);
printf("选择错误,请再次选择");
}
}
}
}
void DrawSnake(int flag){
if(flag==1){
color(10);
CursorJump(2*snake.x,snake.y);
printf("■");
for(int i=0;i<snake.len;i++){
CursorJump(2*body[i].x,body[i].y);
printf("□");
}
}else{
if(body[snake.len-1].x!=0){
CursorJump(2*body[snake.len-1].x,body[snake.len-1].y);
printf(" ");
}
}
}
void MoveSnake(int x, int y){
DrawSnake(0);
face[body[snake.len-1].y][body[snake.len-1].x] = KONG;
face[snake.y][snake.x]=BODY;
for(int i=snake.len-1;i>0;i--){
body[i].x=body[i-1].x;
body[i].y=body[i-1].y;
}
body[0].x=snake.x;
body[0].y=snake.y;
snake.x=snake.x+x;
snake.y=snake.y+y;
DrawSnake(1);
}
void run(int x, int y){
int t=0;
while(1){
if(t==0)
t=20000;
while(--t){
if(kbhit()!=0)break;
}
if(t==0){
JudgeFunc(x, y);
MoveSnake(x, y);
}else{
break;
}
}
}
void Game(){
int n=RIGHT;
int tmp=0;
goto first;
while(1){
n=getch();
switch (n){
case UP:
case DOWN:
if(tmp!=LEFT&&tmp!=RIGHT){
n=tmp;
}
break;
case LEFT:
case RIGHT:
if (tmp!=UP&&tmp!=DOWN){
n=tmp;
}
case SPACE:
case ESC:
case'r':
case'R':
break;
default:
n=tmp;
break;
}
first:
switch (n){
case UP:
run(0,-1);
tmp=UP;
break;
case DOWN:
run(0,1);
tmp=DOWN;
break;
case LEFT:
run(-1,0);
tmp=LEFT;
break;
case RIGHT:
run(1,0);
tmp = RIGHT;
break;
case SPACE:
system("pause>nul");
break;
case ESC:
system("cls");
color(7);
CursorJump(COL-8,ROW/2);
printf(" 游戏结束 ");
CursorJump(COL-8,ROW/2+2);
exit(0);
case'r':
case'R':
system("cls");
main();
}
}
}



声明:以上文章均为用户自行添加,仅供打字交流使用,不代表本站观点,本站不承担任何法律责任,特此声明!如果有侵犯到您的权利,请及时联系我们删除。

字符:    改为:
去打字就可以设置个性皮肤啦!(O ^ ~ ^ O)