单一职责原则 实现贪吃蛇代码的封装

单一职责原则(SRP),就一个类而言,应该仅有一个引起它
变化的原因。
一个c语言的贪吃蛇代码 如何使用单一职责原则封装成c++面向对象呢

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include <windows.h>
#include <conio.h>
#define WIDE  60
#define HIGH  20
//1 设置地图范围(边界) 宽 高
//2 初始化蛇  初始化食物
//3 将蛇和食物显示在屏幕上
//4 蛇的移动(通过wasd按键控制蛇的移动方向)
/*a> 蛇碰到墙b> 蛇碰到蛇的身体c> 蛇碰到障碍物d> 蛇碰到食物( 蛇的身体增长一节,原食物消失,生成新的食物,增加分数)*/
//5 蛇的死亡 积分typedef struct _body
{int x;int y;}BODY;
typedef struct snake
{BODY list[WIDE*HIGH];//身体.身体的每一节坐标都是BODY类型int size;//蛇的身体大小BODY food;//食物的坐标COORD coord;//光标的位置信息int dx;//蛇x轴移动的方向int dy;//蛇y轴移动的方向int score;//得分BODY tail;
}SNAKE;void init_ui()
{for (int i = 0; i <HIGH;i++ ){for (int j = 0; j < WIDE; j++){printf("#");}printf("\n");}}
void init_food(SNAKE  *snake)
{srand(time(NULL));//设置随机数种子//初始化食物坐标snake->food.x =  rand() % WIDE;snake->food.y = rand() % HIGH;
}
void init_snake(SNAKE  *snake)
{//初始化蛇头坐标snake->list[0].x = WIDE / 2;snake->list[0].y = HIGH / 2;//初始化蛇尾坐标snake->list[1].x = WIDE / 2-1;snake->list[1].y = HIGH / 2;//初始化蛇的身体大小snake->size = 2;//初始化食物的坐标init_food(snake);//初始化蛇的移动方向snake->dx = 1;snake->dy = 0;//初始化分数snake->score = 0;}
void show_ui(SNAKE  *snake)
{//显示蛇 注意: 每次显示蛇或食物,都要设置显示的位置,(光标的位置)for (int i = 0; i < snake->size; i++){snake->coord.X = snake->list[i].x;snake->coord.Y = snake->list[i].y;SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), snake->coord);if (0 == i){printf("@");}else{printf("*");}}//显示食物snake->coord.X = snake->food.x;snake->coord.Y = snake->food.y;SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), snake->coord);printf("#");//将原来尾巴的位置显示为空格snake->coord.X = snake->tail.x;snake->coord.Y = snake->tail.y;SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), snake->coord);printf(" ");
}
void move_snake(SNAKE  *snake)
{//记录尾巴的坐标snake->tail.x = snake->list[snake->size - 1].x;snake->tail.y = snake->list[snake->size - 1].y;//更新蛇的身体坐标,除蛇头for (int i = snake->size - 1; i > 0; i--){snake->list[i] = snake->list[i-1];//将数组的前一个元素的坐标给后一节}//更新蛇头snake->list[0].x += snake->dx;snake->list[0].y += snake->dy;}
void control_snake(SNAKE  *snake)
{char  key=0;while (_kbhit()) //判断是否按下按键,按下不等于0 {key = _getch();}switch (key){case 'a':snake->dx = -1;snake->dy = 0;break;case 'w':snake->dx = 0;snake->dy = -1;break;case 's':snake->dx = 0;snake->dy = 1;break;case 'd':snake->dx = 1;snake->dy = 0;break;}}
void game_end(SNAKE  *snake)
{snake->coord.X = 25;snake->coord.Y = 25;SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), snake->coord);printf("游戏结束 得分为%d\n",snake->score);Sleep(3000);exit(0);//退出进程}
//咬到自己
void snake_eat_body(SNAKE  *snake)
{//如果蛇头和蛇的身体的任意一节身体坐标相同,则吃到自己身体for (int i = 1; i < snake->size; i++){if (snake->list[0].x == snake->list[i].x &&snake->list[0].y == snake->list[i].y){game_end(snake);}}}
void snake_eat_food(SNAKE  *snake)
{//如果蛇头和食物的坐标重合.则吃到了食物if (snake->list[0].x == snake->food.x &&snake->list[0].y == snake->food.y){//原食物消失,生成新的食物init_food(snake);//蛇的身体增长一节snake->size++;//分数增加if()snake->score += 10;}}
void init_wall()
{for (int i = 0; i <= HIGH; i++){for (int j = 0; j <= WIDE; j++){if (i == HIGH || j == WIDE){printf("+");}else{printf(" ");}}printf("\n");}
}
void start_game(SNAKE  *snake)
{while ( snake->list[0].x <60  && snake->list[0].x >= 0 &&snake->list[0].y <20 && snake->list[0].y >=0){//控制蛇的方向control_snake(snake);//更新蛇的坐标move_snake(snake);//蛇移动//system("cls");//清屏//init_wall();show_ui(snake);//蛇是否碰到自己snake_eat_body(snake);//蛇是否碰到食物-(碰到食物,原食物消失,产生新的食物)snake_eat_food(snake);Sleep(100);//延时0.5s}game_end(snake);}void hide_cur()
{//隐藏控制台光标CONSOLE_CURSOR_INFO  cci;cci.dwSize = sizeof(cci);cci.bVisible = FALSE;SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cci);
}
int main()
{hide_cur();//init_ui();init_wall();//申请蛇的结构体SNAKE  *snake = (SNAKE  *)malloc(sizeof(SNAKE));init_snake(snake);//初始化蛇和食物show_ui(snake);//显示界面信息start_game(snake);//开始游戏system("pause");return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/447053.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

android ProgressBar实现扫描SD卡文件 + SimpleAdapter绑定ListView

代码 activity_main.xml <RelativeLayout xmlns:android"http://schemas.android.com/apk/res/android"xmlns:tools"http://schemas.android.com/tools"android:layout_width"match_parent"android:layout_height"match_parent"to…

C++标准库函数begin和end函数

主要的目的 为了让指针更加简单、安全&#xff0c;引入了begin和end函数&#xff0c;这两个函数和容器中两个同名的成员函数类似。但是由于数组毕竟不是类类型&#xff0c;因此这两个函数不是成员函数。正确的使用形式就是将数组作为他们的参数int ia[] {0,1,2,3,4,5,6,7,8,9…

dex分包之--------multidex包的配置使用

目录&#xff1a;一、前言二、产生原因三、MultiDex的简要原理四、MultiDex的使用 一、前言 首先说一下我遇到的情况&#xff0c;最近接手了一个项目是在已有的项目里进行更新添加一些功能&#xff0c;然后该项目导了N多的包&#xff0c;在我使用Android Studio的run”App”直…

C++ primer第六章函数的学习

介绍 首先介绍函数的定义和声明&#xff0c;包括如何传入参数以及函数如何返回结果。C语言允许使用重载函数&#xff0c;即几个不同的函数可以使用向同一个名字。所以接下来介绍重载函数的方法&#xff0c;以及编译器选择如何从函数的若干重载的形式中选取一个与调用模板相互匹…

C语言指针作为函数参数 以及智能指针作为函数参数

总所周知指针作为函数参数传递的时候 传递的是指针的拷贝&#xff08;指针也是变量&#xff09; 这里提供四种指针的传递方法 改到实际的指针。 #include <stdio.h> #include <memory> #include <iostream> using namespace std; void test1(char **string)…

Android Studio打包和引用aar

一、简介 Android 库在结构上与 Android 应用模块相同。它可以提供构建应用所需的一切内容&#xff0c;包括源代码、资源文件和 Android 清单。不过&#xff0c;Android 库将编译到您可以用作 Android 应用模块依赖项的 Android 归档 (AAR) 文件&#xff0c;而不是在设备上运行…

C++ primer第六章6.4函数的学习 之函数的重载

6.4 函数的重载 函数的名字相同但是形参的列表不同&#xff0c;将其称之为重载函数 void print(const char *cp); void print(const int *beg,const int * end); void print(const int ia[],size_t size); 形如上面所展现的这样&#xff0c;当调用这些函数的时候&#xff0c;…

C++有限状态机的实现

//待完善 有限状态机是一个很常用的技术&#xff0c;在流程控制和游戏AI中都比较实用&#xff0c;因为状态机编程简单又很符合直觉。与有限状态机类似的是设计模式中的状态模式。本文是参考《Programming Game AI by Example》 一、 记得最开始工作时候也接触过有限状态机&…

手势希尔排序

void shell_sort(int *data, int length){int gap0;int i0,j0;for(gaplength/2;gap>1;gap/2){//组内插入排序for(igap;i<length;i){int temp data[i];for(ji-gap;j>0&&temp<data[j];jj-gap){data[jgap]data[j];}data[jgap]temp;}} }

Android之android.os.Build

一、类概述&#xff1a;从系统属性中提取设备硬件和版本信息。 二、内部类&#xff1a; 1、Build.VERSION 各种版本字符串 2、Build.VERSION_CODES 目前已知的版本代码的枚举类 三、常量&#xff1a;UNKNOWN 当一个版本属性不知道时所设定的值。其字符串值为 “unknown” 。 …

C++ unsigned char*转化为string的形式

unsigned char*转化为string int main(int argc,char **argv){//unsigned char * 转化为string//参考链接 https://www.itdaan.com/tw/4ff531a5e6651468a5b7c6d95927ba3dunsigned char *foo;unsigned char str[] "Hello world";string strHH;foo str;strHH.append…

KMP算法面试题

面试题&#xff1a;写一个在一个宇符串(n)中寻找一个子串&#xff08;m)第一个位置的函数。 10G的日志中&#xff0c;如何快速地查找关键字&#xff1f;

C++对于程序调试很有用的系统自带的名字

简单介绍 __func__当前调试的函数的名字__FILE__存放文件名的字符串的字面值__LINE__存放当前行号的整型字面值__TIME__存放文件编译时间的字符串的字面值__DATE__存放文件编译日期的字符串的字面值 例子 if(word.size() < threshold){cerr << "Error: " …

Android中List、Set、Map数据结构详解

Android中一般使用的数据结构有java中的基础数据结构List&#xff0c;Set&#xff0c;Map。还有一些Android中特有的几个&#xff0c;SparseArray(使用Map时Key是int类型的时候可以用这个代替)等。 继承关系&#xff1a; Collection<–List<–ArrayList Collection<…

Android设计模式之——单例模式

一、介绍 单例模式是应用最广的模式之一&#xff0c;也可能是很多初级工程师唯一会使用的设计模式。在应用这个模式时&#xff0c;单例对象的类必须保证只有一个实例存在。许多时候整个系统只需要拥有一个全局对象&#xff0c;这样有利于我们协调系统整体的行为。 二、定义 …

我的职业生涯规划(软件工程)

以后笔记先在语雀整理 方便一点https://www.yuque.com/juhao-pqdor/goeie3 整理一下自己的笔记 弥补一下以前没写博客的遗憾吧 二十载求学路将尽&#xff0c;行文至此&#xff0c;思绪万千。求学之路始于家乡&#xff0c;竿转热河&#xff0c;而今终于石门。一路行之如人饮水…

C++ primer第六章6.5函数的学习 之特殊用途的语言特性

6.5.1 默认实参 将反复出现的数值称为函数的默认实参&#xff0c;调用含有默认实参的时候可以包含该实参也可以不包含比如程序打开页面会有一个默认的宽高&#xff0c;如果用户不喜欢也允许用户自由指定与默认数值不同的数值&#xff0c;具体例子如下图所示 typedef string::s…

Android设计模式之——Builder模式

一、介绍 Builder模式是一步一步创建一个复杂对象的创建型模式&#xff0c;它允许用户在不知道内部构建细节的情况下&#xff0c;可以更精细的控制对象的构造流程。该模式是为了将构建复杂对象的过程和它的部件解耦&#xff0c;使得构建过程和部件的表示隔离开来。 因为一个复…

c++后端开发书籍推荐

推荐书籍: 略读80% 精读50% C&#xff1a; C Primer Plus C和指针&#xff08;入门书 不只是指针&#xff09; C陷阱与缺陷&#xff08;宏相关&#xff09; C专家编程 C&#xff1a; 有专门的视频 C primer C程序设计原理与实践&#xff08;c之父写的 入门经典&#xff09; Ef…