首页 > 代码库 > C 贪吃蛇

C 贪吃蛇

 

学自{

http://download.csdn.net/download/l04205613/3656909

}

 

C好搓哟~ 一些窗口操作都不会,参考下学长的学习下.

 

#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <conio.h>
#define NN 200
int score, max, speed=300;//当前得分,最高分,速度
int map[22][22];//地图
char key;//开始游戏后输入值 1234对应上下左右
struct Food{
    int x,y;//食物的坐标
    int is_need;//是否需要生成食物
}food;
struct Snack{
    int x[NN],y[NN];//蛇的位置
    int len;//长度
    int dir; //l234对应上下左右
    int life;//是否存活 0存货 1死亡
}snack;
void gotoxy(int x,int y){
    COORD c;//定义一个坐标
    c.X = x-1;
    c.Y = y-1;
    SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), c);//设置窗口句柄并定义窗口的位置
    //GetStdHandle(STD_OUTPUT_HANDLE)  获取窗口标准输出的句柄
    //通过句柄可以对窗口进行一些操作
}
void Game(){
    system("cls");//清屏
    printf("操作说明:\n");
    printf("    ‘w‘:向上\n    ‘s‘:向下\n    ‘a‘:向左\n    ‘d‘:向右\n");
    printf("感谢 yyfer\n");
    system("pause");//停止
}
void showMap(){
    gotoxy(1,1);
    printf("score: %d\n",score);
    for(int i=0;i<22;i++){
        for(int j=0;j<22;j++){
            if(i==0||j==0||i==21||j==21) printf("※");
            else if(map[i][j]==0) printf("  ");
            else if(map[i][j]==3) printf("★");//食物
            else if(map[i][j]==2) printf("●");//蛇头
            else printf("¤");
        }puts("");
    }
}
void endGame(){
    system("cls");
    if(score>max){
        printf("**********\n");
        printf("    恭喜您!\n");
        printf(" 破了最高纪录\n");
        printf("最高分: %d\n",max=score);
    }else{
        printf("游戏结束\n");
    }
    system("pause");
}
void start(){
    while(1){
        system("cls");
        printf("******游戏选项******\n");
        printf("      0.退出\n");
        printf("      1.开始游戏\n");
        printf("      2.最高分\n");
        printf("      3.游戏说明\n");
        switch(getch()){
            case ‘0‘: exit(0);
            case ‘1‘: return ;
            case ‘2‘: system("cls");printf("最高分:%d\n",max);system("pause");break;
            case ‘3‘: Game();break;
            default:system("cls");printf("没有此选项\n");system("pause");
        }
    }
}
void Gameplay(){
    //初始化
    food.is_need=1;
    snack.life=0;
    snack.dir=4;
    snack.x[0]=5;
    snack.y[0]=5;//初始值 蛇头
    map[snack.x[0]][snack.y[0]]=2;
    snack.x[1]=5;
    snack.y[1]=6;//蛇身
    map[snack.x[1]][snack.y[1]]=1;
    snack.len=2;
    score=0;
    while(1){
        while(!kbhit()){//kbhit检测键盘是否有输入
            if(food.is_need==1){
                while(1){
                    food.x=rand()%20+1;
                    food.y=rand()%20+1;
                    if(map[food.x][food.y]==0){
                        map[food.x][food.y]=3;
                        break;
                    }
                }
                food.is_need=0;
            }
            //蛇前进的逻辑: 蛇最后一节消失,第2节前进到第1节的位置,以此类推, 除蛇头外所有位置的坐标变为前一节的坐标
            map[snack.x[snack.len-1]][snack.y[snack.len-1]] = 0;
            for(int i=snack.len-1;i>0;i--){
                snack.x[i] = snack.x[i-1];
                snack.y[i] = snack.y[i-1];
            }
            map[snack.x[1]][snack.y[1]] = 1;//第2节为蛇身
            switch(snack.dir){
                case 1: snack.x[0]-=1;if(snack.x[0]==0)snack.x[0]=20;break;
                case 2: snack.x[0]+=1;if(snack.x[0]==21)snack.x[0]=1;break;
                case 3: snack.y[0]-=1;if(snack.y[0]==0)snack.y[0]=20;break;
                case 4: snack.y[0]+=1;if(snack.y[0]==21)snack.y[0]=1;break;
            }
            if(map[snack.x[0]][snack.y[0]]==1){//蛇头碰到蛇身GG
                snack.life=1;
                break;
            }
            map[snack.x[0]][snack.y[0]]=2;//第一节为蛇头
            //map[snack.x[snack.len-1]][snack.y[snack.len-1]]=1;
            if(snack.x[0]==food.x&&snack.y[0]==food.y){
                snack.len++;//吃到食物,蛇身+1
                food.is_need=1;
                score+=10;
                if(score%100==0&&speed!=50){//加速
                    speed-=50;
                }
            }
            showMap();
            Sleep(speed);
        }
        if(snack.life==1)break;
        key = getch();
        if(key==‘w‘&&snack.dir!=2)snack.dir=1;
        else if(key==‘s‘&&snack.dir!=1)snack.dir=2;
        else if(key==‘a‘&&snack.dir!=4)snack.dir=3;
        else if(key==‘d‘&&snack.dir!=3)snack.dir=4;
    }

}

int main()
{
    system("title 贪吃蛇");
	system("mode con cols=51 lines=26");
	system("color 00");
	start();
	system("cls");
	Gameplay();
	endGame();
	return 0;
}

  

C 贪吃蛇