吃豆豆游戏的C语言程序码,C++实现基于控制台界面的吃豆子游戏
本文实例讲述了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++实现基于控制台界面的吃豆子游戏相关推荐
- 飞机游戏在C语言程序的基本语句能完成功能的体会
论飞机游戏在C语言程序的基本语句能完成功能的体会 一.题目: 射击类飞机游戏 二.目的: 通过c语言编写一个射击类的打飞机小游戏,可以通过键盘来进行游戏,操作方法是"a"&qu ...
- 贪吃蛇的c语言程序码,C语言贪吃蛇代码下载_C语言贪吃蛇代码官方下载-太平洋下载中心...
C语言编写贪吃蛇源代码,简单易懂,文件为VC源代码.如果你正在学习c语言,就来下载吧.很经典的. C语言贪吃蛇代码原理: 产生一个固定大小没有边界的游戏区域,蛇从区域的中心开始,由玩家通过键盘控制蛇的 ...
- c语言程序 电子钢琴按键,基于51单片机8按键电子琴-简易版系统设计(原理图+程序仿真+论文)...
一. 引言 单片机因其体积小,功能强,价格低廉而得到广泛应用,同时随着我国经济的飞速发展,单片机在越来越多的领域得到了广泛的应用,现在国内的单片机多用于电话,玩具和LCD等产品,预计在未来,利用单片机 ...
- 简单的闪避游戏的c语言,谁有一些简单小游戏的C语言程序?
匿名用户 1级 2010-03-25 回答 可以学写"贪吃蛇"代码: #include #include #include #include #include #define W ...
- 简单游戏的c语言程序,[C语言编写小程序]简单打飞碟游戏
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 同样是最初步的模拟,有待再完善下去.飞碟速度上的问题还是希望大家自己调整gamespeed的速度. 空格是发射,发射的具体样子我没写. #include ...
- 和尚吃馒头c语言程序,(八十一)约瑟夫环/鲁智深吃馒头
问题:99个人,99个馒头,来了一个鲁智深,找个位置把他放进去,然后每逢五的人,吃一个馒头,并且退场,最后让他无法吃. 代码: #include int main() { using namespac ...
- [内附完整源码和文档] 基于C++的空中飞机大战游戏
一.问题描述 项目选题为做一个飞行射击游戏.游戏中有各总各样的敌机和武器,敌机按一定的几率出现,玩家消灭敌机后可得分数奖励,达到一定分数后会升级,游戏难度随着玩家级数的增加而增大.游戏有很多爆炸场面, ...
- 链游开发,链游源码出售,基于Dapp合约的链上游戏
随着NFT头像到数字收藏,紧接着域名到游戏与元宇宙,NFT的玩法层出不穷.NFT的火爆贯穿了整个2021 年,与之相关的新赛道层出不穷,从单纯的艺术画作,物资产,到游戏和元宇宙,每次创新出圈都赋予了N ...
- 基于pt100的温度测量系统设计 c语言程序 四臂电桥,基于PT100的温度测量系统设计毕业论文.DOC...
开题信息 摘 要 根据要求设计一个基于STC12C5A60S2单片机处理,PT100为传感器的温度测量系统. 在本设计中,是以铂电阻PT100作为温度传感器,采用恒流测温的方法,通过单片机进行控制,以 ...
最新文章
- Mysql中的DCL
- 突破磁盘低级检测实现文件隐藏
- Python实例 -- 如何快速获取列表中最大的三个元素
- char[] 转换为LPWSTR
- IOS开发基础之使用XCode12快速生成代码段
- SQL Server的聚集索引和非聚集索引
- uboot阶段flash分区_1.12.uboot的烧写和flash分区1
- scala 写入文件_Scala文件IO –写入文件,读取文件
- 用c语言小游戏代码大全,c语言经典游戏代码
- easyui 合并单元格
- 行业发展 | 雷达信号处理领域面临的重大问题
- 论文解读-用于人口流动数据模拟的人口流动模型
- 巧用批处理cmd快速切换IP地址
- 天池历届大赛答辩PPT及视频
- Android系统分析之带着问题看事件分发机制
- 手把手教你学习Solidity|Solidity开发【一】
- Matlab TRL校准(简易版)
- CMWAP 和 CMNET 的主要区别与适用范围
- U盘打不开提示格式化,数据如何恢复?
- 基于SPI的OLED温湿度显示
热门文章
- OpenCASCADE:拓扑 API之历史支持
- wxWidgets:wxMBConv概述
- boost::quick_exit相关的测试程序
- boost::sort模块实现spreadsort 浮点函子排序示例
- boost::proto::make_expr相关的测试程序
- boost::hana::partial用法的测试程序
- GDCM:gdcm::Overlay的测试程序
- Boost:compute::copy的复制数据测试程序
- Boost:bimap双图lambda表达式的测试程序
- ITK:沿所选方向累积图像的像素