C语言之小游戏(推箱子,贪吃蛇)

推箱子
基本思路:

  1. 绘制一个地图,包含人,箱子,墙,目的地;
    2.实现人的移动;
    3.实现人和箱子同时移动。

代码:

#include<graphics.h>   //使用EGE图形库
#include<stdio.h>
#include<windows.h>
#include<time.h>
#define MAPSIZE 10
int map[MAPSIZE][MAPSIZE]= 
{
    {1,1,1,1,1,1,1,1,1,1},
    {1,0,0,0,0,0,0,0,0,1},
    {1,0,1,1,0,0,0,1,0,1},
    {1,0,1,0,0,0,0,0,0,1},
    {1,0,0,0,0,0,1,0,0,1},
    {1,0,0,0,1,0,1,0,0,1},
    {1,0,1,0,0,0,0,0,0,1},
    {1,0,0,0,1,0,0,0,0,1},
    {1,0,0,1,1,1,0,1,0,1},
    {1,1,1,1,1,1,1,1,1,1},
};
int map2[MAPSIZE][MAPSIZE];
typedef struct s_actor
{
    int x;
    int y;
    PIMAGE img;    //图片
} ACT;
ACT man,box,goal;
void map_copy()
{
    int i,j;
    for(i=0; i<MAPSIZE; i++)
        for(j=0; j<MAPSIZE; j++)
            map2[i][j]=map[i][j];
}
void go_back()
{
    int i,j;
    for(i=0; i<MAPSIZE; i++)
        for(j=0; j<MAPSIZE; j++)
            map[i][j]=map2[i][j];
}
void show_map()
{
    go_back();
    system("cls");   //清屏
    int i,j;
    PIMAGE img1=newimage();   //分别得到各个人物的图像
    PIMAGE img2=newimage();
    man.img=newimage();
    box.img=newimage();
    goal.img=newimage();
    getimage(img1,"game\\hua.jpg"); //注意图片的路径
    getimage(img2,"game\\11.jpg");
    getimage(man.img,"game\\zly.png");
    getimage(box.img,"game\\fsf.png");
    getimage(goal.img,"game\\2.png");
    putimage(0,0,img1);
    map[man.y][man.x]=2;
    map[box.y][box.x]=3;
    map[goal.y][goal.x]=4;
    for(i=0; i<MAPSIZE; i++)       //在屏幕上打印出图片
    {
        for(j=0; j<MAPSIZE; j++)
        {
            if(map[i][j]==1)
                putimage(j*50,i*50,img2);
            else if(map[i][j]==2)
                putimage_transparent(NULL,man.img,j*50,i*50,0);
            else if(map[i][j]==3)
                putimage_transparent(NULL,box.img,j*50,i*50,0);
            else if(map[i][j]==4)
                putimage_transparent(NULL,goal.img,j*50,i*50,0);
        }
        //printf("\n");
    }
    Sleep(50);
}
void man_move()    
{
    char ch;
    ch=getch();
    switch(ch)       //控制方向
    {
    case 'w':        
         if(map[man.y-1][man.x]!=1)
        {
            if(map[man.y-1][man.x]==3&&map[box.y-1][box.x]!=1)
            {
                box.y--;
                man.y--;
            }
            else if(map[man.y-1][man.x]==3&&map[box.y-1][box.x]==1)
                man.y=man.y;
            else
                man.y--;
        }
        break;
    case 's':
        if(map[man.y+1][man.x]!=1)
        {
            if(map[man.y+1][man.x]==3&&map[box.y+1][box.x]!=1)
            {
                box.y++;
                man.y++;
            }
            else if(map[man.y+1][man.x]==3&&map[box.y+1][box.x]==1)
                man.y=man.y;
            else
                man.y++;
        }
        break;
    case 'a':
        if(map[man.y][man.x-1]!=1)
        {
            if(map[man.y][man.x-1]==3&&map[box.y][box.x-1]!=1)
            {
                box.x--;
                man.x--;
            }
            else if(map[man.y][man.x-1]==3&&map[box.y][box.x-1]==1)
                man.x=man.x;
            else
                man.x--;
        }
        break;
    case 'd':
        if(map[man.y][man.x+1]!=1)
        {
            if(map[man.y][man.x+1]==3&&map[box.y][box.x+1]!=1)
            {
                box.x++;
                man.x++;
            }
            else if(map[man.y][man.x+1]==3&&map[box.y][box.x+1]==1)
                man.x=man.x;
            else
                man.x++;
        }
        break;
    }
}
int judge()
{
    int flag=0;
    if(map[box.y][box.x]==4)
        flag=2;
    else if(map[box.y-1][box.x]==1&&map[box.y][box.x-1]==1||map[box.y-1][box.x]==1&&map[box.y][box.x+1]==1||map[box.y+1][box.x]==1&&map[box.y][box.x-1]==1||map[box.y+1][box.x]==1&&map[box.y][box.x+1]==1)
        flag=1;
    return flag;
}
int main()
{
    initgraph(500,500);
    man.x=1;
    man.y=1;
    box.x=4;
    box.y=4;
    goal.x=6;
    goal.y=8;
    map_copy();
    show_map();
    while(1)
    {
        man_move();
        show_map();
        if(judge()==1)
        {
            printf("Sorry,game over!\n");
            return 0;
        }
        else if(judge()==2)
        {
            printf("Congratulation! you succeed!\n");
            return 0;
        }
    }
    getch();
    closegraph();
}


贪吃蛇

  1. 绘制一幅二维数组地图;
  2. 初始化蛇的长度,蛇头,蛇身坐标;
  3. 分别实现在蛇吃到食物与没有吃到食物时的移动。

源代码:

#include <stdio.h>
#include <windows.h>
#include <stdlib.h>
int map[20][40];
int dx[4]= {0,0,-1,1};  //控制蛇方向的改变
int dy[4]= {-1,1,0,0};
int len=4;  //蛇的长度
int speed=100; //蛇运动的速度
int count=0;//标记蛇是否碰到墙壁或自身
struct Snake
{
    int x;
    int y;
    int dire;//蛇方向
} S[400];
void Goto_Top()            //清屏
{
    COORD pos= {0,0};
    HANDLE hout=GetStdHandle(STD_OUTPUT_HANDLE);
    SetConsoleCursorPosition(hout,pos);
}
void init()                //初始化蛇
{
    int i,j;
    for(i=0; i<20; i++)
        for(j=0; j<40; j++)
            map[i][j]='@';
    for(i=1; i<19; i++)
        for(j=1; j<39; j++)
            map[i][j]=' ';
    for(i=0; i<400; i++)
    {
        S[i].x=0;
        S[i].y=0;
        S[i].dire=0;
    }
    S[0].y=1;
    S[0].x=1;
    S[1].y=1;
    S[1].x=2;
    S[2].y=1;
    S[2].x=3;
    S[3].y=1;
    S[3].x=4;
    S[3].dire=3;
    for(i=0; i<len-1; i++)
        map[S[i].y][S[i].x]='X';
    map[S[3].y][S[3].x]='H';
    srand(time(0));
    food();
}
void food()      //随机设置食物的坐标
{
    int x,y;
    while(1)
    {
        x=rand()%39+1;
        y=rand()%19+1;
        if(map[y][x]==' ')
        {
            map[y][x]='Q';
            break;
        }
    }
}
void turn()      //蛇方向的改变
{
    char dir;
    if(kbhit())  //敲击键盘
    {
        dir=getch();
        switch (dir)
        {
        case 'w':
            S[len-1].dire=0;
            break;
        case 's':
            S[len-1].dire=1;
            break;
        case 'a':
            S[len-1].dire=2;
            break;
        case 'd':
            S[len-1].dire=3;
            break;
        }
    }
}
void check()
{
    int x,y;
    x=S[len-1].x+dx[S[len-1].dire];
    y=S[len-1].y+dy[S[len-1].dire];
    if(map[y][x]=='@'||map[y][x]=='X')
    {
        printf("game over!\n");
        printf("结束游戏请输入'q'   重新游戏请输入'r'\n");
        count = 1;
        return;

    }
    else if(map[y][x]=='Q')
    {
        len++;
        speed=((600-len*20)>100)?(600-len*20):100;
    }
}
void move()             //蛇的移动
{
    int i,t=len;
    turn();
    check();
    if(t==len)
    {
        for(i=0; i<len-1; i++)
        {
            if(i==0)
            {
                map[S[i].y][S[i].x]=' ';
                S[i].y=S[i+1].y;
                S[i].x=S[i+1].x;
            }
            else
            {
                S[i].y=S[i+1].y;
                S[i].x=S[i+1].x;
            }
            map[S[i].y][S[i].x]='X';
        }
        S[len-1].x=S[len-1].x+dx[S[len-1].dire];
        S[len-1].y=S[len-1].y+dy[S[len-1].dire];
        map[S[len-1].y][S[len-1].x]='H';
    }
    else
    {
        map[S[len-2].y][S[len-2].x]='X';
        S[len-1].x=S[len-2].x+dx[S[len-2].dire];
        S[len-1].y=S[len-2].y+dy[S[len-2].dire];
        S[len-1].dire=S[len-2].dire;
        map[S[len-1].y][S[len-1].x]='H';
        food();
    }
}
void show_map()
{
    int i,j;
    char ch;
    for(i=0; i<20; i++)
    {
        for(j=0; j<40; j++)
            printf("%c",map[i][j]);
        printf("\n");
    }
    menu();
    while(1)
    {
        Sleep(speed);
        move();
        if(count)
        {
            while(1)
            {
                ch=getch();
                if(ch=='q')
                    return;
                else if(ch=='r')
                {
                    init();
                    break;
                }
            }
        }
        Goto_Top();
        for(i=0; i<20; i++)
        {
            for(j=0; j<40; j++)
                printf("%c",map[i][j]);
            printf("\n");
        }
    }
}
void menu()
{
    char ch;
    printf("--------------------------------------------\n");
    printf("|游戏指南:                                 |\n");
    printf("|向上按'w'  向下按's'  向左按'a'  向右按'd'|\n");
    printf("|碰到墙壁和自身死亡!    蛇越长跑得越快!!|\n");
    printf("|请按任意键开始游戏                        |\n");
    printf("--------------------------------------------\n");
    ch=getch();
}
void main()
{
    init();
    show_map();
}

使用EGE图形库代码:

#include<graphics.h>
#include <stdio.h>
#include <windows.h>
#include <stdlib.h>
#include<time.h>
#include<string.h>

int map[10][20];
int dx[4]= {0,0,-1,1};
int dy[4]= {-1,1,0,0};
int len=4;
int speed=500;
int counts=0;
struct Snake
{
    int x;
    int y;
    int dire;
    PIMAGE img;
} S[100];
void Goto_Top()
{
    COORD pos= {0,0};
    HANDLE hout=GetStdHandle(STD_OUTPUT_HANDLE);
    SetConsoleCursorPosition(hout,pos);
}
void food()
{
    int x,y;
    while(1)
    {
        x=rand()%19+1;
        y=rand()%9+1;
        if(map[y][x]==' ')
        {
            map[y][x]='Q';
            break;
        }
    }
}
void init()
{
    int i,j;
    for(i=0; i<10; i++)
        for(j=0; j<20; j++)
            map[i][j]='@';
    for(i=1; i<9; i++)
        for(j=1; j<19; j++)
            map[i][j]=' ';
    for(i=0; i<100; i++)
    {
        S[i].x=0;
        S[i].y=0;
        S[i].dire=0;
    }
    S[0].y=1;
    S[0].x=1;
    S[1].y=1;
    S[1].x=2;
    S[2].y=1;
    S[2].x=3;
    S[3].y=1;
    S[3].x=4;
    S[3].dire=3;
    for(i=0; i<len-1; i++)
        map[S[i].y][S[i].x]='X';
    map[S[3].y][S[3].x]='H';
    srand(time(0));
    food();
}

void turn()
{
    char dir;
    if(kbhit())
    {
        dir=getch();
        switch (dir)
        {
        case 'w':
            S[len-1].dire=0;
            break;
        case 's':
            S[len-1].dire=1;
            break;
        case 'a':
            S[len-1].dire=2;
            break;
        case 'd':
            S[len-1].dire=3;
            break;
        }
    }
}
void check()
{
    int x,y;
    x=S[len-1].x+dx[S[len-1].dire];
    y=S[len-1].y+dy[S[len-1].dire];
    if(map[y][x]=='@'||map[y][x]=='X')
    {
        counts = 1;
        return;

    }
    else if(map[y][x]=='Q')
    {
        len++;
        speed=((600-len*20)>100)?(600-len*20):100;
    }
}
void moves()
{
    int i,t=len;
    turn();
    check();
    if(t==len)
    {
        for(i=0; i<len-1; i++)
        {
            if(i==0)
            {
                map[S[i].y][S[i].x]=' ';
                S[i].y=S[i+1].y;
                S[i].x=S[i+1].x;
            }
            else
            {
                S[i].y=S[i+1].y;
                S[i].x=S[i+1].x;
            }
            map[S[i].y][S[i].x]='X';
        }
        S[len-1].x=S[len-1].x+dx[S[len-1].dire];
        S[len-1].y=S[len-1].y+dy[S[len-1].dire];
        map[S[len-1].y][S[len-1].x]='H';
    }
    else if(t<len)
    {
        map[S[len-2].y][S[len-2].x]='X';
        S[len-1].x=S[len-2].x+dx[S[len-2].dire];
        S[len-1].y=S[len-2].y+dy[S[len-2].dire];
        S[len-1].dire=S[len-2].dire;
        map[S[len-1].y][S[len-1].x]='H';
        food();
    }
}
void menu()
{
    printf("--------------------------------------------\n");
    printf("|游戏指南:                                 |\n");
    printf("|向上按'w'  向下按's'  向左按'a'  向右按'd'|\n");
    printf("|碰到墙壁和自身死亡!    蛇越长跑得越快!!|\n");
    printf("|请按任意键开始游戏                        |\n");
    printf("--------------------------------------------\n");
}
void show_map()
{
    int i,j;
    char ch;
    PIMAGE img1=newimage();
    PIMAGE img2=newimage();
    PIMAGE img3=newimage();
    S[len-1].img=newimage();
    S[0].img=newimage();
    getimage(S[0].img, "game\\3.png");
    getimage(img1, "game\\hua.jpg");
    getimage(img2, "game\\fsf.png");
    getimage(img3, "game\\22.png");
    getimage(S[len-1].img, "game\\zly.png");
    putimage(0, 0, img1);

    for(i=0; i<10; i++)
    {
        for(j=0; j<20; j++)
        {
            if(map[i][j]=='Q')
                putimage_transparent(NULL,img2,j*50,i*50,0);
            else if(map[i][j]=='@')
                putimage_transparent(NULL,img3,j*50,i*50,0);
            else if(map[i][j]=='H')
                putimage_transparent(NULL,S[len-1].img,j*50,i*50,0);
            else if(map[i][j]=='X')
                putimage_transparent(NULL,S[0].img,j*50,i*50,0);
        }
        //printf("%c",map[i][j]);
        //printf("\n");
    }
}
int main()
{
    initgraph(1000,500);
    init();
    //menu();
    show_map();
    while(1)
    {
        Sleep(speed);
        moves();
        if(counts==1)
        {
            printf("game over ");
            return 0;
        }
        //Goto_Top();
        show_map();
    }
    getch();
    closegraph();
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值