贪食蛇(文本模式)

贪食蛇(文本模式)

/**********************************************/
/* 程序名称:贪食蛇1.1(文本模式)            */
/* 程序作者:Knocker                          */
/* 完成日期:2004.10.20                       */
/* 编译环境:Windows me + Win-TC 1.9.1        */
/* Email   : knocker.k@163.com                */
/* 程序说明:有两种死法,一:蛇首被困闷死      */
/*                     二:咬到自己尾巴       */
/*           方向键控制蛇行方向               */
/* 修改说明:2004.10.21优化了print_mop()      */
/**********************************************/
#include <stdio.h>
#include <dos.h>

#define maxX  76
#define maxY  22

void exitt();
void moveadd(int*A,int*x,int*y);
void findend(int x,int y);
void rand_have();
void print_mop();

int X=0,Y=1,X1=0,Y1=0,a=2 ;
/*X,Y 蛇头所在数组下标,a表示蛇的运动方向,
                  0,1,2,3,分别标记蛇的运动方向上,右,下,左*/
int endX0=5,endY0=5;
int t=1 ;/*食物产生控制旗标*/
char mop[maxY][maxX]={0};
int main()
{
    char c ;
    union REGS regs;

    regs.h.ah=1;
    regs.h.ch=13;
    regs.h.cl=0;
    int86(0x10,&regs,&regs);

    mop[0][0]=-1 ;    /*-1标记蛇尾*/
    mop[0][1]=4 ;
    rand_have();
    while(1)
    {
        while(bioskey(1)==0)
        {   X1=X,Y1=Y;
            moveadd(&a,&X,&Y);
            print_mop();
            if(t==0)rand_have(),t=1 ;
            delay(3500);
        }
        c=bioskey(0)>>8 ;
        if(c==75)a=3 ;
        if(c==77)a=1 ;
        if(c==72)a=0 ;
        if(c==80)a=2 ;
    }
    
}
void moveadd(int*A,int*X,int*Y)
{
    int tmep;

    if(*A==0)
    if(*X-1>=0&&(!mop[*X-1][*Y]||mop[*X-1][*Y]==10||mop[*X-1][*Y]==-1))
    {
        if(mop[*X-1][*Y]==-1)exitt();
        if(mop[*X-1][*Y]!=10)findend(*X,*Y);
        else t=0 ;
        mop[*X-1][*Y]=(*A+2)%4+1 ;
        *X=*X-1 ;
    }
    else *A=rand()%2?3:1;

    if(*A==2)
    if(*X+1<maxY&&(!mop[*X+1][*Y]||mop[*X+1][*Y]==10||mop[*X+1][*Y]==-1))
    {
        if(mop[*X+1][*Y]==-1)exitt();
        if(mop[*X+1][*Y]!=10)findend(*X,*Y);
        else t=0 ;
        mop[*X+1][*Y]=(*A+2)%4+1 ;
        *X=*X+1 ;
    }
    else *A=rand()%2?1:3;

    if(*A==1)
    if(*Y+1<maxX&&(!mop[*X][*Y+1]||mop[*X][*Y+1]==10||mop[*X][*Y+1==-1]))
    {
        if(mop[*X][*Y+1]==-1)exitt();
        if(mop[*X][*Y+1]!=10)findend(*X,*Y);
        else t=0 ;
        mop[*X][*Y+1]=(*A+2)%4+1 ;
        *Y=*Y+1 ;
    }
    else*A=rand()%2?0:2 ;

    if(*A==3)
    if(*Y-1>=0&&(!mop[*X][*Y-1]||mop[*X][*Y-1]==10||mop[*X][*Y-1]==-1))
    {
        if(mop[*X][*Y-1]==-1)exitt();
        if(mop[*X][*Y-1]!=10)findend(*X,*Y);
        else t=0 ;
        mop[*X][*Y-1]=(*A+2)%4+1 ;
        *Y=*Y-1 ;
    }
    else*A=rand()%2?2:0 ;
}
void findend(int x,int y)
{
    switch(mop[x][y]-1)
    {
        case 0 :
        if(mop[x-1][y]==-1)
        {
            mop[x-1][y]=0 ;
            endX0=x-1;
            endY0=y;
            mop[x][y]=-1 ;
        }
        else findend(x-1,y);
        break ;
        case 1 :
        if(mop[x][y+1]==-1)
        {
            mop[x][y+1]=0 ;
            endX0=x;
            endY0=y+1;
            mop[x][y]=-1 ;
        }
        else findend(x,y+1);
        break ;
        case 2 :
        if(mop[x+1][y]==-1)
        {
            mop[x+1][y]=0 ;
            endX0=x+1;
            endY0=y;
            mop[x][y]=-1 ;
        }
        else findend(x+1,y);
        break ;
        case 3 :
        if(mop[x][y-1]==-1)
        {
            mop[x][y-1]=0 ;
            endX0=x;
            endY0=y-1;
            mop[x][y]=-1 ;
        }
        else findend(x,y-1);
        break ;
    }
}

void rand_have()
{
    int x,y ;
    
    qq :
    x=rand()%maxY ;
    y=rand()%maxX ;
    if(mop[x][y]==0)
    {
        mop[x][y]=10 ;
        gotoxy(y+1,x+2);
        printf("X");
    }
    else goto qq ;
}
void print_mop()
{

    gotoxy(endY0+1,endX0+2);
    printf(" ");
    gotoxy(Y+1,X+2);
    printf("O");
    gotoxy(Y1+1,X1+2);
    printf("o");
}
void exitt()
{
    gotoxy(10,10);
    printf("The game is over!");
    getch();
    exit();
}

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
是一款经典的游戏,玩家通过控制一条在一个有边界的区域内移动,吃掉物并尽可能长大。在Python中,可以使用Pygame等库来实现游戏。 在游戏中,需要实现以下功能: 1. 绘制游戏界面:使用图形库绘制游戏窗口、物等元素。 2. 控制的移动:根据玩家的输入控制的方向,并更新的位置。 3. 碰撞检测:检测是否与边界或自身相撞,以及是否吃到了物。 4. 更新游戏状态:根据碰撞检测的结果更新游戏状态,如增加的长度、生成新的物等。 5. 计分系统:记录玩家的得分,通常是根据吃到的物数量计算得分。 以下是一个简单的游戏的实现示例: ```python import pygame import random # 游戏初始化 pygame.init() width, height = 640, 480 screen = pygame.display.set_mode((width, height)) clock = pygame.time.Clock() # 的初始位置和速度 snake_pos = [[100, 50], [90, 50], [80, 50]] snake_speed = [10, 0] # 物的初始位置 food_pos = [random.randrange(1, width // 10) * 10, random.randrange(1, height // 10) * 10] food_spawn = True # 游戏主循环 running = True while running: for event in pygame.event.get(): if event.type == pygame.QUIT: running = False # 控制的移动 keys = pygame.key.get_pressed() if keys[pygame.K_UP]: snake_speed = [0, -10] if keys[pygame.K_DOWN]: snake_speed = [0, 10] if keys[pygame.K_LEFT]: snake_speed = [-10, 0] if keys[pygame.K_RIGHT]: snake_speed = [10, 0] # 更新的位置 snake_pos += snake_speed snake_pos += snake_speed # 碰撞检测 if snake_pos < 0 or snake_pos >= width or snake_pos < 0 or snake_pos[1] >= height: running = False if snake_pos in snake_pos[1:]: running = False if snake_pos == food_pos: food_spawn = False snake_pos.append([0, 0]) # 更新游戏状态 if not food_spawn: food_pos = [random.randrange(1, width // 10) * 10, random.randrange(1, height // 10) * 10] food_spawn = True # 绘制游戏界面 screen.fill((0, 0, 0)) for pos in snake_pos: pygame.draw.rect(screen, (0, 255, 0), pygame.Rect(pos, pos, 10, 10)) pygame.draw.rect(screen, (255, 0, 0), pygame.Rect(food_pos, food_pos, 10, 10)) pygame.display.flip() # 控制游戏帧率 clock.tick(30) # 游戏结束 pygame.quit() ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值