zoukankan      html  css  js  c++  java
  • 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("操作说明:
    ");
        printf("    'w':向上
        's':向下
        'a':向左
        'd':向右
    ");
        printf("感谢 yyfer
    ");
        system("pause");//停止
    }
    void showMap(){
        gotoxy(1,1);
        printf("score: %d
    ",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("**********
    ");
            printf("    恭喜您!
    ");
            printf(" 破了最高纪录
    ");
            printf("最高分: %d
    ",max=score);
        }else{
            printf("游戏结束
    ");
        }
        system("pause");
    }
    void start(){
        while(1){
            system("cls");
            printf("******游戏选项******
    ");
            printf("      0.退出
    ");
            printf("      1.开始游戏
    ");
            printf("      2.最高分
    ");
            printf("      3.游戏说明
    ");
            switch(getch()){
                case '0': exit(0);
                case '1': return ;
                case '2': system("cls");printf("最高分:%d
    ",max);system("pause");break;
                case '3': Game();break;
                default:system("cls");printf("没有此选项
    ");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语言的实现
    红黑树(一)之 原理和算法详细介绍
    Design and Evaluation of an RDMA-aware Data Shuffling Operator for Parallel Database Systems
    RDMA Technology White Paper
    InfiniBand: An Introduction + Simple IB verbs program with RDMA Write
    crc32_offload_api_example
    Programming Examples Using IBV Verbs
    15. RDMA之RoCE & Soft-RoCE
    14. RDMA之Memory Window
    13. RDMA之用户态与内核态交互
  • 原文地址:https://www.cnblogs.com/yyf573462811/p/6366078.html
Copyright © 2011-2022 走看看