问题标题: 贪吃蛇游戏的程序

0
0

0
已采纳
王紫馨
王紫馨
高级守护
高级守护

贪吃蛇游戏c++代码(附加一部分注释)

#include <windows.h>
#include <stdlib.h>
#include <time.h>
#include <stdio.h>
#include <string.h>
#include <conio.h>
#define N 21
 
int apple[3],num;
char score[3];
char tail[3]; 
 
void gotoxy(int x, int y)    //输出坐标 
{
        COORD pos;
        pos.X = x; 
        pos.Y = y;
        SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), pos);
}
 
void color(int b)         //颜色函数 
{
    HANDLE hConsole = GetStdHandle((STD_OUTPUT_HANDLE)) ; 
    SetConsoleTextAttribute(hConsole,b) ;

 
int Block(char head[2])   //判断出界 
{
        if ((head[0] < 1) || (head[0] > N) || (head[1] < 1) || (head[1] > N))
                return 1;
        return 0;
}
 
int Eat(char snake[2])   //吃了苹果 
{
        if ((snake[0] == apple[0]) && (snake[1] == apple[1]))
       {
                apple[0] = apple[1] = apple[2] = 0;
                gotoxy(N+44,10);
                color(13);
                printf("%d",score[0]*10);
                color(11);
                return 1;
           }
        return 0;
}
 
void Draw(char **snake, int len)    //蛇移动 
{
        if (apple[2]) 
        {
                gotoxy(apple[1] * 2, apple[0]);
                color(12);
                printf("●");
                color(11);
        }
        gotoxy(tail[1] * 2, tail[0]);
        if (tail[2]) 
         {  
            color(num);
            printf("★");
            color(num);
         }
    else 
        printf("■");
        gotoxy(snake[0][1] * 2, snake[0][0]);
        color(num);
        printf("★");
        color(num);
        putchar('\n');
}
 
char** Move(char **snake, char dirx, int *len)   //控制方向 
{
        int i, full = Eat(snake[0]);
        memcpy(tail, snake[(*len)-1], 2);
        for (i = (*len) - 1; i > 0; --i) 
                memcpy(snake[i], snake[i-1], 2);
        switch (dirx) 
          { 
           case 'w': case 'W': --snake[0][0]; break;
              case 's': case 'S': ++snake[0][0]; break;
           case 'a': case 'A': --snake[0][1]; break;
           case 'd': case 'D': ++snake[0][1]; break;
           default: ;
         }  
        if (full)   
           { 
                snake = (char **)realloc(snake, sizeof(char *) * ((*len) + 1));
                snake[(*len)] = (char *)malloc(sizeof(char) * 2);
                memcpy(snake[(*len)], tail, 2);
                ++(*len);
                ++score[0];
                if(score[3] < 16) 
                ++score[3];
                tail[2] = 1;
           }
           else 
                tail[2] = 0;
                return snake;
}
 
void init(char plate[N+2][N+2], char ***snake_x, int *len)  //初始化 
{
        int i, j;
        char **snake = NULL;
 
        *len = 3;
        score[0] = score[3] =3;
        snake = (char **)realloc(snake, sizeof(char *) * (*len));
        for (i = 0; i < *len; ++i)
                snake[i] = (char *)malloc(sizeof(char) * 2);
 
        for (i = 0; i < 3; ++i) 
                {
                snake[i][0] = N/2 + 1;
                snake[i][1] = N/2 + 1 + i;
             } 
 
        for (i = 1; i <= N; ++i) 
                for (j = 1; j <= N; ++j) 
                        plate[i][j] = 1;
 
        apple[0] = rand()%N + 1; apple[1] = rand()%N + 1;
        apple[2] = 1;
 
        for (i = 0; i < N + 2; ++i) 
                {
                gotoxy(0, i);
                for (j = 0; j < N + 2; ++j) 
                        {
                        switch (plate[i][j]) 
                                {
                             case 0: 
                                 color(12);printf("□");color(11); continue;
                        case 1: printf("■"); continue;
                             default: ;
                             }
                    }
                   putchar('\n');
            } 
        for (i = 0; i < (*len); ++i)
       {
                gotoxy(snake[i][1] * 2, snake[i][0]);
                printf("★");
            } 
        putchar('\n');
        *snake_x = snake;
}
 
void Manual()
{
        gotoxy(N+30,2);
        color(10);
        printf("按 W S A D 移动方向");
        gotoxy(N+30,4);
        printf("按 space 键暂停"); 
        gotoxy(N+30,8);
        color(11);
        printf("历史最高分为: ");
        color(12);
        gotoxy(N+44,8);
        printf("%d",score[1]*10);
        color(11);
        gotoxy(N+30,12);
        printf("你现在得分为: 0");         
}
 
int File_in()     //取记录的分数 
{
   FILE *fp;
   if((fp = fopen("C:\\tcs.txt","a+")) == NULL)
   {
            gotoxy(N+18, N+2);
     printf("文件不能打开\n");
         exit(0);
   }
   if((score[1] = fgetc(fp)) != EOF);
   else
   score[1] = 0;
   return 0;
}
 
int File_out()    //存数据 
{
 
        FILE *fp;
        if(score[1] > score[0]) 
        {gotoxy(10,10);
        color(12);
        puts("闯关失败 加油耶");
        gotoxy(0,N+2); 
        return 0;
        }
        if((fp = fopen("C:\\tcs.txt","w+")) == NULL)
        {
                printf("文件不能打开\n");
                exit(0);
        }
    if(fputc(--score[0],fp)==EOF)
           printf("输出失败\n");
    gotoxy(10,10);
        color(12);
        puts("恭喜您打破记录"); 
        gotoxy(0,N+2);
        return 0;
}
 
void Free(char **snake, int len)    //释放空间 
{
        int i;
        for (i = 0; i < len; ++i) 
                free(snake[i]);
        free(snake);
}
 
int main(void)
{
        int len;
        char ch = 'g';
        char a[N+2][N+2] = {{0}};
        char **snake;
        srand((unsigned)time(NULL));
        color(11);
        File_in();
        init(a, &snake, &len);
        Manual();
        while (ch != 0x1B)   // 按 ESC 结束 
         { 
                Draw(snake, len);
                if (!apple[2]) {
                        apple[0] = rand()%N + 1;
                        apple[1] = rand()%N + 1;
                        apple[2] = 1;
                        num++;
                        if(num>8)
                           num=0;
                }
                Sleep(200-score[3]*10);
                setbuf(stdin, NULL);
                if (kbhit())
                   {
                        gotoxy(0, N+2);
                        ch = getche();
                    }
                 snake = Move(snake, ch, &len); 
                 if (Block(snake[0])==1) 
                  {
                        gotoxy(N+2, N+2);
                        puts("你输了");
                        File_out();
                        Free(snake, len);
                        getche();
                        exit(0); 
                  }                        
        }
        Free(snake, len);
        exit(0);
}

0
0
徐云皓
徐云皓
新手天翼
新手天翼

#include<iostream>
#include<windows.h>
#include<time.h>
#include<conio.h>
using namespace std;
// 刷新当前屏幕
inline void Refresh(char q[][22], int grade, int gamespeed){
    system("cls");     //  清屏
 int i,j;
 cout << endl;
 for(i=0;i<22;i++){
     cout << "\t";
  for(j=0;j<22;j++)
   cout<<q[i][j]<<' ';    //  输出贪吃蛇棋盘
        if(i==0) cout << "\t等级为:" << grade;
        if(i==4) cout << "\t自动前进时间";
        if(i==6) cout << "\t间隔为:" << gamespeed << "ms";
  cout<<endl;
 }
}
int main(){
    char tcsQipan[22][22];     //  贪吃蛇棋盘是一个二维数组(如22*22,包括墙壁)
    int i,j;
    for(i=1;i<=20;i++)
        for(j=1;j<=20;j++)
            tcsQipan[i][j]=' ';     //     初始化贪吃蛇棋盘中间空白部分
    for(i=0;i<=21;i++)
        tcsQipan[0][i] = tcsQipan[21][i] = '-';      //初始化贪吃蛇棋盘上下墙壁
    for(i=1;i<=20;i++)
        tcsQipan[i][0] = tcsQipan[i][21] = '|';      //初始化贪吃蛇棋盘左右墙壁
    int tcsZuobiao[2][100];     //蛇的坐标数组
    for(i=0; i<4; i++){
        tcsZuobiao[0][i] = 1;
        tcsZuobiao[1][i] = i + 1;
    }
    int head = 3,tail = 0;
    for(i=1;i<=3;i++)
        tcsQipan[1][i]='*';    //蛇身
    tcsQipan[1][4]='#';       //蛇头
    int x1, y1;           // 随机出米
    srand(time(0));
    do{
  x1=rand()%20+1;
  y1=rand()%20+1;
 }while(tcsQipan[x1][y1]!=' ');
 tcsQipan[x1][y1]='*';
 cout<<"\n\n\t\t贪吃蛇游戏即将开始 !"<<endl;//准备开始;;
 long start;
    int grade = 1, length = 4;
    int gamespeed = 500;  //前进时间间隔
 for(i=3;i>=0;i--){
  start=clock();
  while(clock()-start<=1000);
  system("cls");
  if(i>0)
   cout << "\n\n\t\t进入倒计时:" << i << endl;
  else
   Refresh(tcsQipan,grade,gamespeed);
 }
    int timeover;
    char direction = 77;  // 初始情况下,向右运动
    int x,y;
    while(1){
        timeover = 1;
        start = clock();
        while((timeover=(clock()-start<=gamespeed))&&!kbhit());
             //如果有键按下或时间超过自动前进时间间隔则终止循环
        if(timeover){
            getch();direction = getch();
        }
        switch(direction){
        case 72: x= tcsZuobiao[0][head]-1; y= tcsZuobiao[1][head];break;     // 向上
        case 80: x= tcsZuobiao[0][head]+1; y= tcsZuobiao[1][head];break;      // 向下
        case 75: x= tcsZuobiao[0][head]; y= tcsZuobiao[1][head]-1;break;      // 向左
        case 77: x= tcsZuobiao[0][head]; y= tcsZuobiao[1][head]+1;           // 向右
        }
        if(!(direction==72||direction==80||direction==75 ||direction==77)){   //  按键非方向键
            cout << "\tGame over!" << endl;return 0;
        }
        if(x==0 || x==21 ||y==0 || y==21){   // 碰到墙壁
            cout << "\tGame over!" << endl;return 0;
        }
        if(tcsQipan[x][y]!=' '&&!(x==x1&&y==y1)){ //   蛇头碰到蛇身
            cout << "\tGame over!" << endl;return 0;
        }
        if(x==x1 && y==y1){      //  吃米,长度加1
            length ++;
            if(length>=8){
                length -= 8;
                grade ++;
                if(gamespeed>=200)
                    gamespeed = 550 - grade * 50; // 改变自动前进时间间隔
            }
            tcsQipan[x][y]= '#';
            tcsQipan[tcsZuobiao[0][head]][tcsZuobiao[1][head]] = '*';
            head = (head+1)%100;
            tcsZuobiao[0][head] = x;
            tcsZuobiao[1][head] = y;
            do
            {
                x1=rand()%20+1;
                y1=rand()%20+1;
            }while(tcsQipan[x1][y1]!=' ');
            tcsQipan[x1][y1]='*';
            Refresh(tcsQipan,grade,gamespeed);
        }
 
        else{       //  不吃米
            tcsQipan [tcsZuobiao[0][tail]][tcsZuobiao[1][tail]]=' ';
            tail=(tail+1)%100;
            tcsQipan [tcsZuobiao[0][head]][tcsZuobiao[1][head]]='*';
            head=(head+1)%100;
            tcsZuobiao[0][head]=x;
            tcsZuobiao[1][head]=y;
            tcsQipan[tcsZuobiao[0][head]][tcsZuobiao[1][head]]='#';
            Refresh(tcsQipan,grade,gamespeed);
        }
    }
    return 0;
}

我要回答