本文实例讲述了C++实现基于控制台界面的吃豆子游戏。分享给大家供大家参考。具体分析如下:

程序运行界面如下所示:

ESC键可退出游戏。

main.cpp源文件如下:

#include "lib.h"

#pragma once

extern int level;

int main()

{

FOOD food;

WALL wall;

BODY CurPos;

HALL hall;

int iExit = 0;

while(1)

{

if(iExit)

break;

Init(&food,&wall,&CurPos,&hall);

MakeWall(&wall);

while(1)

{

Sleep(200);

int res = Move(&food,&wall,&CurPos);

if(1 == res) //重新开局

break;

else if(-1 == res) //用户退出

{

iExit = 1;

break;

}

ShowScore(&CurPos,&food);

}

}

return 0;

}

lib.h头文件如下:

#include

#include

#include

#include

//标识用户按下的方向键

#define KEY_UP WM_USER + 1

#define KEY_DOWN WM_USER + 2

#define KEY_LEFT WM_USER + 3

#define KEY_RIGHT WM_USER + 4

//标识用户当前运动方向

#define DIRECTION_UP WM_USER + 5

#define DIRECTION_DOWN WM_USER + 6

#define DIRECTION_LEFT WM_USER + 7

#define DIRECTION_RIGHT WM_USER + 8

//标识要打印的元素类型

#define PRINT_WALL WM_USER + 9

#define PRINT_FOOD WM_USER + 10

#define PRINT_BODY WM_USER + 11

#define PRINT_CLEAN WM_USER + 12

#define KNOCK_WALL WM_USER + 13

#define KNOCK_FOOD WM_USER + 14

struct POS

{

int x;

int y;

};

struct WALL

{

POS pos[9999];

int len;

};

struct FOOD

{

POS pos[8];

int len;

int IsHidden;

};

struct BODY

{

POS pos;

int Direction;

};

struct HALL{

POS pos[200];

int len;

};

void Init(FOOD *pFood,WALL *pWall,BODY *pBody,HALL *pHall);

//进行一些初始化操作

void Print(POS *pos,int TYPE,int ix = 0);

//完成打印功能

void MakeWall(WALL *pWall);

//生成墙

void MakeFood(HALL *pHall,FOOD *pFood);

//生成食物

int Move(FOOD *pFood,WALL *pWall,BODY *pBody);

//用户移动

void ShowScore(BODY *pBody,FOOD *pFood);

//显示等级 和剩余豆子数

int IsOver(POS pos1,POS pos2,int TYPE);

//判断2点是否重合

int IsKnock(WALL *pWall,BODY *pBody,FOOD *pFood,int TYPE);

//判断是否撞墙、吃到豆子

int GetKey();

//得到用户按键

lib.cpp源文件如下:

#include "lib.h"

#pragma once

HANDLE hMain_Out;

HANDLE hMain_In;

CONSOLE_CURSOR_INFO info;

int iBeans = 0;

int level = 1;

//extern short wall[17][24];

short wall[17][24] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,

0,-1,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,

0,-1,-1,-1,-1,-1,-1,0,0,0,0,0,0,-1,0,0,0,0,0,-1,-1,-1,0,0,

0,-1,0,0,0,-1,0,0,0,0,0,0,0,-1,0,0,0,0,0,-1,0,0,0,0,

0,-1,-1,-1,-1,-1,0,-1,-1,-1,-1,-1,0,-1,0,-1,-1,-1,-1,-1,-1,-1,0,0,

0,-1,0,0,-1,0,-1,0,0,0,0,-1,0,-1,-1,-1,0,0,0,0,0,0,0,0,

0,-1,-1,-1,-1,-1,-1,0,0,0,0,-1,0,0,0,-1,0,0,0,0,0,0,0,0,

0,-1,0,0,0,0,0,0,0,0,0,-1,0,0,0,-1,-1,-1,-1,-1,-1,-1,-1,0,

0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,-1,0,0,-1,0,0,0,0,

0,0,0,0,0,0,-1,0,0,0,0,0,0,0,-1,0,-1,0,0,-1,0,0,0,0,

0,0,0,0,0,0,-1,0,0,0,0,0,0,0,-1,0,-1,-1,-1,-1,0,-1,-1,0,

0,0,0,0,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,0,0,0,-1,0,0,

0,0,0,0,0,-1,0,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,-1,0,0,

0,0,-1,-1,-1,-1,0,0,0,0,0,0,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,0,

0,-1,-1,0,0,0,0,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,

0,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,0,0,0,0,0,0,0,0,0,

0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0

};

/**********************************

* 功能:

* 判断用户与墙相撞或吃到食物

***********************************/

int IsKnock(WALL *pWall,BODY *pBody,FOOD *pFood,int TYPE)

{

if(KNOCK_WALL == TYPE)

{

int i;

for(i = 0 ; i < pWall->len ; ++i)

{

if(IsOver(pBody->pos,pWall->pos[i],KNOCK_WALL))

return 1; //与墙相撞

}

}

else if(KNOCK_FOOD == TYPE)

{

int i;

for(i = 1 ; i <= pFood->len ; ++i)

{

if(IsOver(pFood->pos[i],pBody->pos,KNOCK_WALL))

return i; //与食物相撞

}

}

return 0;

}

/**********************************

* 功能:

* 用户移动

***********************************/

int Move(FOOD *pFood,WALL *pWall,BODY *pBody)

{

BODY prePos = *pBody;

// POS prePos = pBody->pos;

int iKey = GetKey();

if(-1 == iKey) //用户退出

return -1;

if(iKey)

{

pBody->Direction = iKey + 4;

iKey = 0;

}

if(0 == iKey)

{

if(DIRECTION_UP == pBody->Direction)

--pBody->pos.y;

else if(DIRECTION_DOWN == pBody->Direction)

++pBody->pos.y;

else if(DIRECTION_LEFT == pBody->Direction)

--pBody->pos.x;

else if(DIRECTION_RIGHT == pBody->Direction)

++pBody->pos.x;

}

if(IsKnock(pWall,pBody,pFood,KNOCK_WALL))

{

*pBody = prePos;

return 0;

}

int ix = IsKnock(pWall,pBody,pFood,KNOCK_FOOD);

if(ix)

{

++iBeans;

//删除初吃掉的食物

int i;

for(i = ix ; i <= (pFood->len - 1) ; ++i)

pFood->pos[i] = pFood->pos[i + 1];

--(pFood->len);

if(0 == pFood->len) //当局完成

{

++level;

return 1;

}

}

Print(&prePos.pos,PRINT_CLEAN); //先删除上一个输出

Print(&pBody->pos,PRINT_BODY);

return 0;

}

/**********************************

* 功能:

* 判断2点是否重合

***********************************/

int IsOver(POS pos1,POS pos2,int TYPE)

{

if(KNOCK_WALL == TYPE) //pos1,the body. pos2,the wall

if((pos1.x == pos2.x && pos1.y == pos2.y) || (pos2.x + 1 == pos1.x && pos2.y == pos1.y))

return 1;

return 0;

}

/**********************************

* 功能:

* 生成墙

***********************************/

void MakeWall(WALL *pWall)

{

int x,y;

int ix = 0;

for(x = 0 ; x <= 16 ; ++x)

{

for(y = 0 ; y <= 23 ; ++y)

{

if(0 == wall[x][y])

{

pWall->pos[ix].x = 2 * y;

pWall->pos[ix].y = x;

Print(&pWall->pos[ix++],PRINT_WALL);

}

}

}

pWall->len = ix; //更新墙的数量

}

/**********************************

* 功能:

* 完成初始化操作

***********************************/

void Init(FOOD *pFood,WALL *pWall,BODY *pBody,HALL *pHall)

{

//得到控制台标准输入输出句柄

hMain_Out = GetStdHandle(STD_OUTPUT_HANDLE);

hMain_In = GetStdHandle(STD_INPUT_HANDLE);

//隐藏光标

GetConsoleCursorInfo(hMain_Out,&info);

info.bVisible = FALSE;

SetConsoleCursorInfo(hMain_Out,&info);

//初始化结构体

pFood->len = 0;

pWall->len = 0;

pHall->len = 0;

//改变控制台大小

system("mode con cols=50 lines=21");

//走廊结构体赋值

int x,y;

int ix = 0;

for(x = 0 ; x < 17 ; ++x)

{

for(y = 0 ; y < 24 ; ++y)

{

if(wall[x][y]) //非墙

{

pHall->pos[ix].x = 2 * y;

pHall->pos[ix++].y = x;

}

}

}

pHall->len = ix;

pBody->pos.x = 2;

pBody->pos.y = 1;

pBody->Direction = DIRECTION_DOWN;

printf("%d %d\n",pHall->pos[0].x,pHall->pos[0].y);

//输出食物

int i;

MakeFood(pHall,pFood);

for(i = 1 ; i <= 7 ; ++i)

{

Print(&pFood->pos[i],PRINT_FOOD,i);

}

}

/**********************************

* 功能:

* 得到用户按键

***********************************/

int GetKey()

{

if(GetAsyncKeyState(VK_UP))

return KEY_UP;

if(GetAsyncKeyState(VK_DOWN))

return KEY_DOWN;

if(GetAsyncKeyState(VK_LEFT))

return KEY_LEFT;

if(GetAsyncKeyState(VK_RIGHT))

return KEY_RIGHT;

if(GetAsyncKeyState(VK_ESCAPE))

return -1; //用户退出

return 0;//用户没有有效按键

}

/**********************************

* 功能:

* 完成打印功能

***********************************/

void Print(POS *p,int TYPE,int ix)

{

COORD pos;

pos.X = p->x;

pos.Y = p->y;

SetConsoleCursorPosition(hMain_Out,pos);

if(PRINT_WALL == TYPE)

printf("■");

else if(PRINT_FOOD == TYPE)

printf("%d",ix);

else if(PRINT_BODY == TYPE)

printf("\1");

else if(PRINT_CLEAN == TYPE)

printf(" ");

}

/**********************************

* 功能:

* 显示等级 和剩余豆子数

***********************************/

void ShowScore(BODY *pBody,FOOD *pFood)

{

COORD pos;

pos.X = 0;

pos.Y = 18;

SetConsoleCursorPosition(hMain_Out,pos);

printf("\tBeans left : %d | pos : x=%d,y=%d\n",pFood->len,pBody->pos.x,pBody->pos.y);

printf("\t\tLevel : %d",level);

// for(int i = 1 ; i <= pFood->len ; ++i)

// printf("(x=%d,y=%d)",pFood->pos[i].x,pFood->pos[i].y);

}

/**********************************

* 功能:

* 生成食物

***********************************/

void MakeFood(HALL *pHall,FOOD *pFood)

{

srand((unsigned)time(NULL));

int tot;

for(tot = 1 ; tot <= 7 ; ++tot)

{

int ixFood = rand() * pHall->len / RAND_MAX;

pFood->pos[tot].x = pHall->pos[ixFood].x;

pFood->pos[tot].y = pHall->pos[ixFood].y;

}

pFood->len = 7;

}

希望本文所述对大家的C++程序设计有所帮助。

吃豆豆游戏的C语言程序码,C++实现基于控制台界面的吃豆子游戏相关推荐

  1. 飞机游戏在C语言程序的基本语句能完成功能的体会

    论飞机游戏在C语言程序的基本语句能完成功能的体会 一.题目:  射击类飞机游戏 二.目的:  通过c语言编写一个射击类的打飞机小游戏,可以通过键盘来进行游戏,操作方法是"a"&qu ...

  2. 贪吃蛇的c语言程序码,C语言贪吃蛇代码下载_C语言贪吃蛇代码官方下载-太平洋下载中心...

    C语言编写贪吃蛇源代码,简单易懂,文件为VC源代码.如果你正在学习c语言,就来下载吧.很经典的. C语言贪吃蛇代码原理: 产生一个固定大小没有边界的游戏区域,蛇从区域的中心开始,由玩家通过键盘控制蛇的 ...

  3. c语言程序 电子钢琴按键,基于51单片机8按键电子琴-简易版系统设计(原理图+程序仿真+论文)...

    一. 引言 单片机因其体积小,功能强,价格低廉而得到广泛应用,同时随着我国经济的飞速发展,单片机在越来越多的领域得到了广泛的应用,现在国内的单片机多用于电话,玩具和LCD等产品,预计在未来,利用单片机 ...

  4. 简单的闪避游戏的c语言,谁有一些简单小游戏的C语言程序?

    匿名用户 1级 2010-03-25 回答 可以学写"贪吃蛇"代码: #include #include #include #include #include #define W ...

  5. 简单游戏的c语言程序,[C语言编写小程序]简单打飞碟游戏

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 同样是最初步的模拟,有待再完善下去.飞碟速度上的问题还是希望大家自己调整gamespeed的速度. 空格是发射,发射的具体样子我没写. #include ...

  6. 和尚吃馒头c语言程序,(八十一)约瑟夫环/鲁智深吃馒头

    问题:99个人,99个馒头,来了一个鲁智深,找个位置把他放进去,然后每逢五的人,吃一个馒头,并且退场,最后让他无法吃. 代码: #include int main() { using namespac ...

  7. [内附完整源码和文档] 基于C++的空中飞机大战游戏

    一.问题描述 项目选题为做一个飞行射击游戏.游戏中有各总各样的敌机和武器,敌机按一定的几率出现,玩家消灭敌机后可得分数奖励,达到一定分数后会升级,游戏难度随着玩家级数的增加而增大.游戏有很多爆炸场面, ...

  8. 链游开发,链游源码出售,基于Dapp合约的链上游戏

    随着NFT头像到数字收藏,紧接着域名到游戏与元宇宙,NFT的玩法层出不穷.NFT的火爆贯穿了整个2021 年,与之相关的新赛道层出不穷,从单纯的艺术画作,物资产,到游戏和元宇宙,每次创新出圈都赋予了N ...

  9. 基于pt100的温度测量系统设计 c语言程序 四臂电桥,基于PT100的温度测量系统设计毕业论文.DOC...

    开题信息 摘 要 根据要求设计一个基于STC12C5A60S2单片机处理,PT100为传感器的温度测量系统. 在本设计中,是以铂电阻PT100作为温度传感器,采用恒流测温的方法,通过单片机进行控制,以 ...

最新文章

  1. Mysql中的DCL
  2. 突破磁盘低级检测实现文件隐藏
  3. Python实例 -- 如何快速获取列表中最大的三个元素
  4. char[] 转换为LPWSTR
  5. IOS开发基础之使用XCode12快速生成代码段
  6. SQL Server的聚集索引和非聚集索引
  7. uboot阶段flash分区_1.12.uboot的烧写和flash分区1
  8. scala 写入文件_Scala文件IO –写入文件,读取文件
  9. 用c语言小游戏代码大全,c语言经典游戏代码
  10. easyui 合并单元格
  11. 行业发展 | 雷达信号处理领域面临的重大问题
  12. 论文解读-用于人口流动数据模拟的人口流动模型
  13. 巧用批处理cmd快速切换IP地址
  14. 天池历届大赛答辩PPT及视频
  15. Android系统分析之带着问题看事件分发机制
  16. 手把手教你学习Solidity|Solidity开发【一】
  17. Matlab TRL校准(简易版)
  18. CMWAP 和 CMNET 的主要区别与适用范围
  19. U盘打不开提示格式化,数据如何恢复?
  20. 基于SPI的OLED温湿度显示

热门文章

  1. OpenCASCADE:拓扑 API之历史支持
  2. wxWidgets:wxMBConv概述
  3. boost::quick_exit相关的测试程序
  4. boost::sort模块实现spreadsort 浮点函子排序示例
  5. boost::proto::make_expr相关的测试程序
  6. boost::hana::partial用法的测试程序
  7. GDCM:gdcm::Overlay的测试程序
  8. Boost:compute::copy的复制数据测试程序
  9. Boost:bimap双图lambda表达式的测试程序
  10. ITK:沿所选方向累积图像的像素