• [010]转+修正---C++的贪吃蛇程序(未用面向对象封装)


    在网上看到一段贪吃蛇程序,自己心痒下了下来又稍微做了一点修改。

    没有用面向对象的方式来进行封装,下次准备试试。

    需要在windows环境下进行编译

      1 #include<iostream>
      2 #include<windows.h>
      3 #include<conio.h>
      4 #include<time.h>
      5 #include<stdlib.h>
      6 
      7 using namespace std;
      8 
      9 #define COUT cout<<"■"
     10 #define MOVE_UP 1
     11 #define MOVE_LEFT 2
     12 #define MOVE_DOWN 3
     13 #define MOVE_RIGHT 4
     14 
     15 struct Body {
     16     int x,y;
     17     Body *next;
     18 };
     19 
     20 int Food=0,Food_x,Food_y,Direction=MOVE_RIGHT,Grade,Score=0;
     21 // 定义蛇的头部
     22 Body *body001=new Body[sizeof(Body)];
     23 
     24 // 在指定位置输出需要显示的字符
     25 void Position(int x,int y) {
     26     // 定位坐标
     27     COORD pos={y-1,x-1};
     28     // 把字符输出到屏幕(命令行)
     29     HANDLE Out=GetStdHandle(STD_OUTPUT_HANDLE);
     30     // 定位光标位置
     31     SetConsoleCursorPosition(Out,pos);
     32 }
     33 
     34 // 初始化蛇开始时的数量(4)
     35 void CreatSneak() {
     36     // 定义初始状态蛇头后的三个身体
     37     Body *body002=new Body[sizeof(Body)];
     38     Body *body003=new Body[sizeof(Body)];
     39     Body *body004=new Body[sizeof(Body)];
     40     // 固定初始状态的蛇的位置
     41     body001->x=11;body001->y=35;
     42     body002->x=11;body002->y=33;
     43     body003->x=11;body003->y=31;
     44     body004->x=11;body004->y=29;
     45     // 初始状态的蛇连接(最后一个蛇身体指向即将被连接的身体)
     46     body001->next=body002;
     47     body002->next=body003;
     48     body003->next=body004;
     49     body004->next=NULL;
     50 }
     51 
     52 // 创建游戏的框体
     53 void Prt_Map() {
     54     int i;
     55     for(i=1;i<=80;i+=2) {
     56         Position(1,i);COUT;
     57         Position(24,i);COUT;
     58     }//x:2~23 共22个
     59     for(i=1;i<=24;i++) {
     60         Position(i,1);COUT;
     61         Position(i,57);COUT;//y:3~55共27个
     62         Position(i,79);COUT;
     63     }
     64 }
     65 
     66 // 创建右侧的分数和选取的速度级别
     67 void Prt_Sneak() {
     68     // 定义蛇并使其指向蛇头
     69     Body *p;
     70     p=body001;
     71     // 通过循环不断指向下一个指针指向的位置来实现蛇的移动
     72     while(p!=NULL) {
     73         Position(p->x,p->y);COUT;
     74         p=p->next;
     75     }
     76     Position(Food_x,Food_y);COUT;
     77     // 实时分数
     78     Position(7,63);cout<<"Score: "<<Score;
     79     // 选取的速度级别
     80     Position(10,63);cout<<"Grade: "<<Grade;
     81 }
     82 
     83 // 是否有异常的操作导致游戏结束
     84 int JudgeOver() {
     85     Body *p;
     86     p=body001->next;
     87     // 如果蛇碰到边框,则游戏结束
     88     if(body001->y==1||body001->y==57||body001->x==1||body001->x==24){
     89         return 1;
     90     }
     91     // 如果没有碰到自身,那么正常执行
     92     while(!(p->x==body001->x&&p->y==body001->y)) {
     93         if(p->next==NULL) {
     94             return 0;
     95         }
     96         p=p->next;
     97     }
     98     // 碰到自身,游戏结束
     99     return 1;
    100 }
    101 
    102 // 创建贪吃蛇的下一个食物
    103 void Creat_Food() {
    104     // 如果页面上没有食物,则创建
    105     if(Food==0) {
    106         // 用当前的时间值来作为随机数种子,在随机位置定义
    107         srand((int)time(0));
    108         // 取随机数定义食物的横轴,后面的数操作是确保生成的食物在游戏框体内
    109         Food_x=rand()%21+2;
    110         int temp=rand()%52+3;
    111         // 定义食物的竖轴
    112         if(temp%2==0) {
    113             Food_y=temp+1;
    114         }
    115         else { 
    116             Food_y=temp;
    117         }
    118         Food=1;
    119     }
    120 }
    121 
    122 // 操作贪吃蛇随着键盘的移动而移动
    123 void Move() {
    124     Body *p=new Body[sizeof(Body)],*q,*temp=new Body[sizeof(Body)];
    125     // 向上
    126     if(Direction==MOVE_UP) {
    127         if(body001->x==(Food_x+1)&&body001->y==Food_y) {
    128             temp->x=Food_x;temp->y=Food_y;temp->next=body001;body001=temp;Food=0;Score+=5;
    129         }
    130         else {
    131             temp->x=body001->x-1;temp->y=body001->y;temp->next=body001;body001=temp;
    132             q=body001;
    133             while((q->next)->next!=NULL)q=q->next;
    134             Position((q->next)->x,(q->next)->y);cout<<" ";
    135             delete(q->next); q->next=NULL;
    136         }
    137     }
    138     // 向左
    139     if(Direction==MOVE_LEFT) {
    140         if(body001->x==Food_x&&body001->y==(Food_y+2)) {
    141             temp->x=Food_x;temp->y=Food_y;temp->next=body001;body001=temp;Food=0;Score+=5;
    142         }
    143         else {
    144             temp->x=body001->x;temp->y=body001->y-2;temp->next=body001;body001=temp;
    145             q=body001;
    146             while((q->next)->next!=NULL)q=q->next;
    147             Position((q->next)->x,(q->next)->y);cout<<" ";
    148             delete(q->next); q->next=NULL;
    149         }
    150     }
    151     // 向下
    152     if(Direction==MOVE_DOWN) {
    153         if(body001->x==(Food_x-1)&&body001->y==Food_y) {
    154             temp->x=Food_x;temp->y=Food_y;temp->next=body001;body001=temp;Food=0;Score+=5;
    155         }
    156         else {
    157             temp->x=body001->x+1;temp->y=body001->y;temp->next=body001;body001=temp;
    158             q=body001;
    159             while((q->next)->next!=NULL)q=q->next;
    160             Position((q->next)->x,(q->next)->y);cout<<" ";
    161             delete(q->next); q->next=NULL;
    162         }
    163     }
    164     // 向右
    165     if(Direction==MOVE_RIGHT) {
    166         if(body001->x==Food_x&&body001->y==(Food_y-2)) {
    167             temp->x=Food_x;temp->y=Food_y;temp->next=body001;body001=temp;Food=0;Score+=5;
    168         }
    169         else{
    170             temp->x=body001->x;temp->y=body001->y+2;temp->next=body001;body001=temp;
    171             q=body001;
    172             while((q->next)->next!=NULL)q=q->next;
    173             Position((q->next)->x,(q->next)->y);cout<<" ";
    174             delete(q->next); q->next=NULL;
    175         }
    176     }
    177 }
    178 
    179 // 执行游戏
    180 void Game() {
    181     while(1) {
    182         // 如果游戏失败,返回
    183         if(JudgeOver()==1) {
    184             return;
    185         }
    186         // 键盘操作光标键上
    187         if(GetAsyncKeyState(VK_UP)&&Direction!=MOVE_DOWN) {
    188             Direction=MOVE_UP;
    189         }
    190         // 键盘操作光标键左
    191         if(GetAsyncKeyState(VK_LEFT)&&Direction!=MOVE_RIGHT) {
    192             Direction=MOVE_LEFT;
    193         }
    194         // 键盘操作光标键下
    195         if(GetAsyncKeyState(VK_DOWN)&&Direction!=MOVE_UP) {
    196             Direction=MOVE_DOWN;
    197         }
    198         // 键盘操作光标键右
    199         if(GetAsyncKeyState(VK_RIGHT)&&Direction!=MOVE_LEFT) {
    200             Direction=MOVE_RIGHT;
    201         }
    202         // 创建贪吃蛇的下一个食物
    203         Creat_Food();
    204         // 取得贪吃蛇随着键盘的移动而移动的坐标
    205         Move();
    206         // 移动蛇
    207         Prt_Sneak();
    208         // 根据输入的速度,决定程序执行挂起的时间,以便得到移动速度
    209         Sleep(550-Grade*50);
    210     }
    211 }
    212 
    213 void main() {
    214     Position(12,24);
    215     cout<<"Plese Select Grade:[1~10]";
    216     // 输入蛇的运行速度
    217     cin>>Grade;
    218     
    219     // 限制速度在1~10
    220     if(Grade<1||Grade>10) {
    221         system("cls");
    222         Position(12,35);
    223         cout<<"Wrong Grade!"<<endl;
    224         return;
    225     }
    226     // 清除屏幕上的显示信息
    227     system("cls");
    228     // 创建初始状态的蛇
    229     CreatSneak();
    230     // 创建并显示游戏的框体
    231     Prt_Map();
    232     // 定义蛇的移动,创建右侧的分数和选取的速度级别
    233     Prt_Sneak();
    234 
    235     // 运行游戏
    236     Game();
    237     system("cls");
    238     Position(12,35);
    239     // 如果满屏,则输出成功,反之则输出失误
    240     if (Score >= 2790) {
    241         cout<<"You Win !"<<endl;
    242     } else {
    243         cout<<"You Lost !"<<endl;
    244     }
    245     Position(13,31);
    246     cout<<"You Got "<<Score<<" Scores"<<endl;
    247     Position(24,29);
    248     getch();
    249 }
  • 相关阅读:
    Python 基础之 线程与进程
    python 基础之 模块
    Python 基础之socket编程(三)
    Python 基础之socket编程(二)
    Python全栈开发之11、进程和线程
    用 Python实现一个ftp+CRT(不用ftplib)
    Python全栈开发之10、网络编程
    Python全栈开发之9、面向对象、元类以及单例
    Python全栈开发之8、装饰器详解
    用python实现一个无界面的2048
  • 原文地址:https://www.cnblogs.com/hustcser/p/3636264.html
Copyright © 2020-2023  润新知