C 语言 ConsoleRogueLike 控制台肉鸽游戏 DEVC++ VS2022都可用

使用 C 语言和 windows 的键盘检测函数和延迟函数,开发的控制台 roguelike 游戏
点开 .exe 文件立即进入游戏
AWSD 移动
J 攻击
K 加成buff
没有结束条件,除非碰到敌人。
其他模块功能还没来得及开发

author : 民用级脑的研发记录
DEVC++ 项目工程代码副本:
链接:https://pan.baidu.com/s/1HVjKRDJrzxtRlddyfrBZow 
提取码:jhip
VS2022 项目工程代码副本
链接:https://pan.baidu.com/s/1vWCI2EIdNwpyqdoeNV2-DA 
提取码:aexz
CSDN 源代码 
https://mp.csdn.net/mp_blog/creation/editor?spm=1001.2101.3001.5352
代码请随意使用,在下抛砖引玉,给其他初学者的一点参考代码

BUG 说明:

在第一行时,敌人不会接触。
原理暂不明确,可能是坐标计算错了。
不打算修正了,直接当安全区可还行?

Have a good time

未完待续,后续若整好了 C 语言的 RPG 地图编辑器也一并开源

 

#include <stdio.h>
#include <time.h>
#include <string.h>
#include <windows.h>
#define KEY_DOWN(vKey) ((GetAsyncKeyState(vKey) & 0x8000) ? 1:0)							// 判断是否按下按键,按下之后,最高位变成1,所以需要位运算去除其他位,只检测最高位 
#define KEY_DOWN_FOREGROUND(hWnd,vk) (KEY_DOWN(vk) && GetForegroundWindow() == hWnd) 		// 前景窗口判断
#pragma warning(disable : 4996)																// VS2022 报错某些不安全函数,这里禁用 VS 的某些警告 方便在其他函数移植进 Visualstdio2022 
struct enemys
{int x;int y;int is_live;
};
inline void showgame(int** gamemap, int high, int wide, char* player, char* ai)
{			// 更新游戏,由于printf只能一行接着一行打印,所以不能覆盖先前字符,只能增加缓冲区,在缓冲区里实现覆盖char p[10000] = { '\0' };char pen[2];int tile;for (int j = 0; j < wide; j++)strcat(p, "#");strcat(p, "\n");for (int i = 0; i < high; i++){strcat(p, "#");for (int j = 0; j < wide; j++){tile = gamemap[i][j];switch (tile){case 0:strcpy(pen, " ");break;default:sprintf(pen, "%d", tile);break;}strcat(p, pen);}strcat(p, "#\n");}for (int j = 0; j < wide; j++){strcat(p, "#");}strcat(p, "\n");printf("%s", p);													// 加载进缓存数组,减少 printf 使用,解决 printf 速度慢导致的屏闪
}int main()
{int** bkmap;													// 游戏背景图int** gamemap;													// 记录当前游戏地图形式int high;														// 地图高,宽int wide;int limitx;int limity;high = 20;wide = 100;limitx = 100;limity = 20;bkmap = new int* [limity];										// 初始化游戏地图gamemap = new int* [high];for (int i = 0; i < limity; i++)bkmap[i] = new int[limitx];for (int i = 0; i < high; i++)gamemap[i] = new int[wide];for (int i = 0; i < limity; i++)for (int j = 0; j < limitx; j++)bkmap[i][j] = 0;for (int i = 0; i < high; i++)for (int j = 0; j < wide; j++)gamemap[i][j] = 0;int playerx;													//	玩家位置int playery;int gamex;														// 显示区域int gamey;int player;														// 玩家记号player = 1;playerx = 0;playery = 0;gamex = 0;gamey = 0;int field = 9;int enemy;														// 敌人记号int indix;														// 刷新敌人时更新数组int enemynum;													// 敌人个数int enemymax;													// 敌人上限enemy = 2;enemynum = 10;enemymax = 100;enemys ai[100];													// 敌人数组for (int i = 0; i < 100; i++){ai[i].is_live = 0;ai[i].x = 0;ai[i].y = 0;}char playerview[100] = "6";char enemyview[100] = "2";printf("%s", playerview);int characterx;													// 敌人位置int charactery;charactery = 10;characterx = 10;printf("%s", enemyview);showgame(gamemap, high, wide, playerview, enemyview);int flag_x;int flag_y;int is_atk;int atk_area;int is_buff;flag_x = 0;flag_y = 0;is_atk = 0;atk_area = 1;is_buff = 0;HWND hwnd;hwnd = GetForegroundWindow();										// 获取前端窗口句柄,由于程序刚运行时是在前端,所以这就是本程序的窗口句柄srand(time(NULL));												// 设置随机数种子int gameover;gameover = 0;int cnt = 0;														// 敌人计算位置,每两帧移动一次while (1){flag_x = 0;													// 默认不按键时速度为0flag_y = 0;if (KEY_DOWN_FOREGROUND(hwnd, 0x41)){flag_x -= 1;}if (KEY_DOWN_FOREGROUND(hwnd, 0x57)){flag_y -= 1;}if (KEY_DOWN_FOREGROUND(hwnd, 0x44)){flag_x += 1;}if (KEY_DOWN_FOREGROUND(hwnd, 0x53)){flag_y += 1;}if (is_atk == 0 && KEY_DOWN_FOREGROUND(hwnd, 0x4A)){is_atk = 1;}if (is_buff == 0 && KEY_DOWN_FOREGROUND(hwnd, 0x4B)){is_buff = 1;}if (KEY_DOWN_FOREGROUND(hwnd, VK_ESCAPE)){printf("游戏退出\n");break;}if (KEY_DOWN_FOREGROUND(hwnd, 0x30))									// 绘制地图bkmap[playery][playerx] = 0;if (KEY_DOWN_FOREGROUND(hwnd, 0x36))									// 绘制地图bkmap[playery][playerx] = 6;if (KEY_DOWN_FOREGROUND(hwnd, 0x37))									// 绘制地图bkmap[playery][playerx] = 7;if (KEY_DOWN_FOREGROUND(hwnd, 0x38))									// 绘制地图bkmap[playery][playerx] = 8;if (KEY_DOWN_FOREGROUND(hwnd, 0x39))									// 绘制地图bkmap[playery][playerx] = 9;if (flag_x > 1)														// 速度限制flag_x = 1;else if (flag_x < -1)flag_x = -1;if (flag_y > 1)flag_y = 1;else if (flag_y < -1)flag_y = -1;if (flag_x)															// 位移改变playerx += flag_x;if (flag_y)playery += flag_y;if (playerx >= limitx)													// 角色位置限制playerx = limitx - 1;else if (playerx < 0)playerx = 0;if (playery >= limity)playery = limity - 1;else if (playery < 0)playery = 0;for (int i = 0; i < high; i++)for (int j = 0; j < wide; j++)if (gamemap[i][j] != bkmap[i + gamey][j + gamex])									// 去除上次动作记录gamemap[i][j] = bkmap[i + gamey][j + gamex];if (is_atk % 12 != 0)  																	// 攻击{if (playerx < atk_area || playerx >= limitx - atk_area || playery < atk_area || playery >= limity - atk_area){is_atk = 0;}else{is_atk++;if (characterx - playerx >= -atk_area && charactery - playery >= -atk_area && characterx - playerx <= atk_area && charactery - playery <= atk_area)										// 是否攻击到敌人field = 0;for (int n = 0; n < 100; n++){if (ai[n].is_live){if (ai[n].x - playerx >= -atk_area && ai[n].y - playery >= -atk_area && ai[n].x - playerx <= atk_area && ai[n].y - playery <= atk_area)	// 是否攻击到敌群ai[n].is_live = 0;}}for (int i = playery - atk_area; i <= playery + atk_area; i++)for (int j = playerx - atk_area; j <= playerx + atk_area; j++)						// 范围攻击记号{gamemap[i][j] = is_atk;if (bkmap[i][j] != 0)bkmap[i][j] = 0;}}}else is_atk = 0;for (int n = 0; n < 100; n++)															// 打印存活敌人if (ai[n].is_live)gamemap[ai[n].y][ai[n].x] = enemy;gamemap[charactery][characterx] = field;												// 敌人比攻击晚赋值,所以敌人可以覆盖攻击图标if (is_buff % 22 != 0)																	// buff 持续时间 12 帧{is_buff++;atk_area = 3;player = is_buff;}else{is_buff = 0;atk_area = 1;player = 1;}indix = 0;enemynum = 0;cnt++;while (indix < enemymax)																	// 加入新的敌人{if (ai[indix].is_live){enemynum++;if (cnt % 2 == 0){if (ai[indix].x < playerx)ai[indix].x++;else if (ai[indix].x > playerx)ai[indix].x--;if (ai[indix].y < playery)ai[indix].y++;else if (ai[indix].y > player)ai[indix].y--;cnt = cnt % 2;}if (playerx == ai[indix].x && playery == ai[indix].y){gameover = 1;player = 1;}}else{ai[indix].x = rand() % 100;ai[indix].y = rand() % 20;ai[indix].is_live = 1;enemynum++;}indix++;if (enemynum >= 15)break;}printf("player x %d y %d\n", playerx, playery);gamemap[playery][playerx] = player;showgame(gamemap, high, wide, playerview, enemyview);while (gameover == 1){printf("game over\n");printf("按 R 重新开始\n按 ESC 退出游戏\n");if (KEY_DOWN_FOREGROUND(hwnd, 0x52)){gameover = 0;playerx = 0;playery = 0;enemynum = 0;break;}else if (KEY_DOWN_FOREGROUND(hwnd, VK_ESCAPE)){break;}showgame(gamemap, high, wide, playerview, enemyview);Sleep(50);system("cls");}if (gameover == 1)break;Sleep(100);system("cls");																		// 清屏}system("cls");printf("Have a good time\n");system("pause");Sleep(50);return 0;
}

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

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

相关文章

【Gitea】配置 Push To Create

引 在 Git 代码管理工具使用过程中&#xff0c;经常需要将一个文件夹作为仓库上传到一个未创建的代码仓库。如果 Git 服务端使用的是 Gitea&#xff0c;通常会推送失败。 PS D:\tmp\git-test> git remote add origin http://192.1.1.1:3000/root/git-test.git PS D:\tmp\g…

OpenHarmony—UIAbility组件与UI的数据同步

基于HarmonyOS的应用模型&#xff0c;可以通过以下两种方式来实现UIAbility组件与UI之间的数据同步。 使用EventHub进行数据通信&#xff1a;基于发布订阅模式来实现&#xff0c;事件需要先订阅后发布&#xff0c;订阅者收到消息后进行处理。使用globalThis进行数据同步&#…

【数据结构与算法】递归、回溯、八皇后 一文打尽!

&#x1f389;&#x1f389;欢迎光临&#x1f389;&#x1f389; &#x1f3c5;我是苏泽&#xff0c;一位对技术充满热情的探索者和分享者。&#x1f680;&#x1f680; &#x1f31f;特别推荐给大家我的最新专栏《数据结构与算法&#xff1a;初学者入门指南》&#x1f4d8;&am…

Vue3+Vite+TS+Pinia+ElementPlus+Router+Axios创建项目

目录 初始项目组成1. 创建项目1.1 下载项目依赖1.2 项目自动启动1.3 src 别名设置vite.config.ts配置文件tsconfig.json配置若新创项目ts提示 1.4 运行测试 2. 清除默认样式2.1 样式清除代码下载2.2 src下创建公共样式文件夹style2.3 main.js中引入样式2.4 安装sass解析插件 2.…

SNAT 与 DNAT

1.SNAT 1.1 SNAT 定义 SNAT 又称源地址转换。源地址转换是内网地址向外访问时&#xff0c;发起访问的内网ip地址转换为指定的ip地址&#xff08;可指定具体的服务以及相应的端口或端口范围&#xff09;&#xff0c;这可以使内网中使用保留ip地址的主机访问外部网络&#xff…

Leetcode 145.二叉树的后序遍历

题目 给你一棵二叉树的根节点 root &#xff0c;返回其节点值的 后序遍历 。 示例 1&#xff1a; 输入&#xff1a;root [1,null,2,3] 输出&#xff1a;[3,2,1] 示例 2&#xff1a; 输入&#xff1a;root [] 输出&#xff1a;[]示例 3&#xff1a; 输入&#xff1a;root…

应用回归分析:岭回归

岭回归&#xff0c;也称为Tikhonov正则化&#xff0c;是一种专门用于处理多重共线性问题的回归分析技术。多重共线性是指模型中的自变量高度相关&#xff0c;这种高度的相关性会导致普通最小二乘法&#xff08;OLS&#xff09;估计的回归系数变得非常不稳定&#xff0c;甚至无法…

32、IO/对文件读写操作相关练习20240218

一、使用fgets统计给定文件的行数 代码&#xff1a; #include<stdlib.h> #include<string.h> #include<stdio.h>int main(int argc, const char *argv[]) {FILE *fpNULL;if((fpfopen("./1.txt","r"))NULL)//只读形式打开1.txt文件{per…

【C++】类与对象【定义、访问限定符、this指针】

&#x1f308;个人主页&#xff1a;秦jh__https://blog.csdn.net/qinjh_?spm1010.2135.3001.5343&#x1f525; 系列专栏&#xff1a;http://t.csdnimg.cn/eCa5z 目录 面向过程和面向对象初步认识 类的引入 类的定义 成员变量命名规则的建议&#xff1a; 类的访问限定符及…

见智未来:数据可视化引领智慧城市之潮

在数字时代的浪潮中&#xff0c;数据可视化崭露头角&#xff0c;为打造智慧城市注入了强大的活力。不再被深奥的数据所束缚&#xff0c;我们通过数据可视化这一工具&#xff0c;可以更加接近智慧城市的未来。下面我就以可视化从业者的角度来简单聊聊这个话题。 数据可视化首先为…

模型超参数寻优

参考某篇QSAR的sci论文设置 根据上图&#xff0c;我设置我的XGBoost模型&#xff1a; # 定义要搜索的超参数的候选值 param_grid {model__learning_rate: [0.1, 0.01, 0.001], # 调整学习率model__n_estimators: [50, 100, 200, 300,400,500], # 调整树的数量model__max_de…

防御第五次作业

拓扑图及要求 1 创建安全区域 创建nat策略 测试 2 创建目标nat 测试 3 配置双向nat 配置IP 测试 查看会话表 4 FW1 FW3 结果 5 办公区限流 销售部限流 6 7

ansible自动化运维工具及常见模块的使用

目录 一、ansible概述 二、ansible的特性 三、ansible 环境安装部署 管理端安装 ansible&#xff1a; 配置主机清单&#xff1a; 配置密钥对验证&#xff1a; 四、ansible 常见模块的使用 1&#xff0e;command 模块 2&#xff0e;shell 模块 3&#xff0e;cron 模块…

拿捏c语言指针(中)

前言 书接上回 拿捏c语言指针&#xff08;上&#xff09; 此篇主要讲解的是指针与数组之间的爱恨情仇&#xff0c;跟着我的脚步一起来看看吧~ 创造不易&#xff0c;可以帮忙点点赞吗 如有差错&#xff0c;欢迎指出 理解数组名 数组名是首元素地址 例外 1.sizeof&#xff0…

【工作向】版本管理-IPD流程简介

1. IPD的由来 Integrated Product Development&#xff0c;集成产品开发 从IBM引进并结合自身实践 2. 引入IPD的过程 突破期 -> 全面推行期 -> 与时俱进发展 -> IPD2.0 19年开始 版本 -> 项目 -> 产品 产品开发流程&#xff0c;需求管理流程&#xff0c;生…

2024最新软件测试八股文(答案+文档)

&#x1f345; 视频学习&#xff1a;文末有免费的配套视频可观看 &#x1f345; 关注公众号【互联网杂货铺】&#xff0c;回复 1 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 1、B/S架构和C/S架构区别 B/S 只需要有操作系统和浏览器就行&a…

运行错误(竞赛遇到的问题)

在代码提交时会遇见这样的错误&#xff1a; 此处运行错误不同于编译错误和答案错误&#xff0c;运行错误是指是由于在代码运行时发生错误&#xff0c;运行错误可能是由于逻辑错误、数据问题、资源问题等原因引起的。这些错误可能导致程序在运行时出现异常、崩溃。 导致不会显示…

机器学习2---逻辑回归(基础准备)

逻辑回归是基于线性回归是直线分的也可以做多分类 ## 数学基础 import numpy as np np.pi # 三角函数 np.sin() np.cos() np.tan() # 指数 y3**x # 对数 np.log10(10) np.log2(2) np.e np.log(np.e) #ln(e)# 对数运算 # log(AB) log(A) logB np.log(3*4)np.log(3)np.log(4) #…

Linux之Shell

第 1 章 Shell 概述 1&#xff09;Linux 提供的 Shell 解析器有 [zhaohadoop101 ~]$ cat /etc/shells /bin/sh /bin/bash /usr/bin/sh /usr/bin/bash /bin/tcsh /bin/csh2&#xff09;bash 和 sh 的关系 [zhaohadoop101 bin]$ ll | grep bash -rwxr-xr-x. 1 root root 941880…

如何利用测评自养号成功运营沃尔玛、阿里国际等跨境平台?

沃尔玛&#xff0c;自1962年成立以来&#xff0c;已稳居全球最大零售商的行列&#xff0c;并连续多年荣登世界500强企业的榜单。凭借强大的企业实力和卓越的市场表现&#xff0c;该公司在美国《财富》杂志2014-2016年全球最大500家公司的评选中荣登榜首。如今&#xff0c;沃尔玛…