探索之路

一个群里的大佬做的 DOS 版我的世界让我想到了这个游戏,后面去看了看 Terraria 的视频,学习了下,做了个极其简陋的沙盒游戏

开发环境:VS2019 + EasyX_20210730

游戏说明:

一个类似于二维版我的世界和泰拉瑞亚的沙盒游戏,你可以建造属于你的一片天地

(但因为目前方块过少,效果极其单调。。)

WASD 键:移动

Q 键:打开制作页面,再次按下返回

E 键:打开背包页面,再次按下返回

R 键:查看角色属性

ESC:设置页面(可调整为观察模式、普通模式,查看当前坐标)

大键盘1键:保存!!

制作页面:鼠标滚轮选择目标制作物品(部分物品需在工作台或熔炉旁才能制作)

背包页面:鼠标选中背包物品后拖动至使用栏便可更换使用栏物

...

合成立方体 (模仿)

游戏介绍

在 4399 上面看到一个很有趣的小游戏:合成立方体(游戏原地址)。

游戏中,玩家需要通过所给的形状去尽可能拼凑出完整的一行一列,然后完整的行列会增加分数,一旦所给的形状无法被塞下,游戏结束。非常简单的游戏,我用了 EasyX 去复原了一下。

游戏运行截图如下:

游戏源码下载

点击这里下载游戏完整源代码

井字棋(release)

说明

简易实现了井字棋,未使用深搜算法。

基本原理

设立气的概念:

棋子的气:己方棋子的气大小为 1,对手棋子气的大小为 -1。

总气:所有外气的和,己方尽可能提高这个值,对手是负降低这个值。同理可推算中心点四个气,角三个,边两个。

外气:一共八个外气,对应两个对角线以及横竖三条线,气的大小对应该条线上的棋子气之和。

内气:一共九个内气,对应棋谱的九个位置,每个位置的气为该位置涉及到的外气之和。

计算步骤:

1. 优先处理外气为 2 的位置,该位置是己方的胜利位置。

2. 其次处理外气为 -2 的位置,该位置是对手的获胜位置。

3. 然后处理内气位置为 2 的位置,该位置是己方的绝杀点。

4. 然后对于一个进行区别对待:有一个情况边优先度比中心点高。

5. 如果中间位置没有占,占中间位置。

6. 遍历内气,取得有意义的内气的中值,二次遍历,找内气大小是中值的位置,在这些位

...

七巧板Plus

游戏介绍

鼠标左键拖动图形移动,松开时自动吸附,按下 ctrl 键的同时拖动则不进行吸附,右键单击图形顺时针旋转 45°,ESC 结束游戏。

新增内容

1. 增加了点吸附效果,拖动图形松开后,触发边吸附的同时也会触发点吸附。

2. 拖动图形的同时,若按下 ctrl 键,则不会进行吸附。

不定期更新,力求完善。。。

程序说明

简要介绍程序中的一些点。

属性

使用模板类和 lambda 表达式实现了属性,用于对外暴露字段,详见 C# 属性。

使用属性可以简化程序,减少繁琐的 get 函数和 set 函数,提高了程序的可读性。

因为是自行封装的属性,所以存在很大的缺陷,很大程度上增加了类的大小(因为把函数成员变成了数据成员),属性的重写以及访问控制的不完善等。

对象管理机制

使用 Tangram 类来管

...

四杆机构-机械原理

四杆机构模拟。

四杆机构介绍:维基百科、哈工大机械原理课件.

说明

AB 作为主动件,AD 为机架。

根据传入的杆长自动绘制出相应的四杆机构。

如下图,程序绘制了曲柄摇杆、双摇杆、摇杆曲柄、双摇杆机构。

单击鼠标右键循环隐藏圆圈、C2 点、C1 点。

/////////////////////////////////////////////////////////////
// 程序名称:四杆机构-机械原理
// 编译环境:Visual Studio 2019 (v142),EasyX_20210730
// 作  者:luyiran <872289455@qq.com>
// 发布日期:2021-8-11
//
#pragma warning(disable:4244)	
...

解决编译错误:C4996:'GetMouseMsg': This function is deprecated.

问题概述

EasyX 提供了两个头文件:

  • graphics.h
  • easyx.h

easyx.h 包含最新的函数,并且删掉了旧函数。graphics.h 引用了 easyx.h,同时提供了对旧函数的支持。使用 graphics.h 里面提供的旧函数时,会收到一个 Warning C4996,例如使用旧函数 GetMouseMsg,会收到编译提醒:

C4996:'GetMouseMsg': This function is deprecated. Instead, use this new function: getmessage. See https://docs.easyx.cn/getmessage for details.

在过去,Visual&nb

...

Tony's Jumper

介绍

这是一个模仿 Doodle Jump 的小游戏,实现了原游戏中的部分元素。

             

操作说明

由于没有重力感应,所以用键盘替代。

按下 A/D 或方向键会给予角色水平向左或向右的恒定加速度,此加速度可以在 OPTIONS 界面通过改变灵敏度来调节。同时角色也受水平阻力影响,阻力大小与水平速度的平方成正比,因此达到一定速度会变为匀速运动。竖直方向只受重力加速度,碰到平台或踩到怪物会获得一定的初速度。

鼠标点击可向光标方向射击(只能向角色上方区域发射),怪物头上的一个红点代表一点生命值,为零时被击落。

其他操作见游戏中的 HELP 界面。

文件说明

  • game.h/cpp: 全局常量,点、向量、得分等基本结构体,以及计算、文件、声音、图像处理等函数。
  • interface.h/cpp: 游戏界面类,
...

VS 中的生成事件

简介

VS的项目中有一个 生成事件 的选项,即在执行相关操作时运行的一些命令行,只要能运用好这一功能可以很好地编程提升效率。


生成事件具体位置

命令行的命令可通过 cmd 中的 help 命令查询,这里便不再赘述。

实例1:根据 x86/x64 环境,将对应的 dll 文件移到项目文件夹下

在使用外部的库时,常有 x86/x64 两种不同的版本的 dll ,若改变编译环境,就要手动移动相应的 dll 文件,十分麻烦,因此可以利用生成前命令(此处以 fmod 为例),在编译前将相应的 dll 移动到项目文件夹中。

具体步骤:

1.打开项目属性页

2.选择平台 x64 选择配置 所有配置

3.点击生成事件页

4.点击生成前事件

5.在命令行一栏添加以下命令

copy /Y lib\x64\fmod.dll

...

简单的音乐游戏

介绍

这是一款十分简单的音乐游戏.

编译环境:Visual Studio 2019,EasyX_20210730

游戏说明

  1. 介绍 玩家需根据音乐节奏,控制方向块,接住不断靠近的note。
  2. 控制: Q 逆时针旋转 W 后移 E 顺时针旋转 esc 暂停游戏 具体可于游戏中进行设置。 
  3. 若想游玩其他谱面可以访问 osu 或镜像站 v mirror (推荐 使用时可以下载其中的MINI谱面,减少不必要的空间占用)下载谱面 并将下载的 .osz 文件以 zip 格式打开并解压到obm文件夹中
  4. 对于任何音乐游戏,包括该游戏都建议从最低难度开始。

项目共包含以下文件

源程序文件:

  1. main.cpp 主程序
  2. Control.h/cpp 游戏控制部分 包含类 keycheck 单独按键控制,timer 计时器,FPSCounter 帧数计算;
...

绘制一只奥特曼

奥特曼的组成

奥特曼是由斜的椭圆,圆角矩形,圆形,以及曲线的组成的。此处绘制中,主要应用了曲线的的绘制,将奥特曼画的比较饱满。

值得学习的地方

本次绘制过过程中,自己编写了两个函数。一个是绘制有倾斜角的椭圆,用来表示奥特曼的眼睛,这样可以使得奥特曼更加有灵魂。另一个是心形。在平时绘制别的东西时,如果需要,可以直接借鉴。

效果图

源码

///////////////////////////////////////////////////
// 程序名称:绘制奥特曼
// 编译环境:Mictosoft Visual Studio 2013, EasyX_20200315(beta)
// 作  者:luoyh <2864292458@qq.com>
// 最后修改:2020-6-10
//

#include<conio.h>
#include&
...

数字拼图游戏

这是一个简易的拼图游戏。

其实很多时候,精彩的游戏不一定非要用图片。将游戏的功能和手感都做好,游戏一样好玩。

所以我就做了这个拼图游戏当作例子。运行效果如下:

完整的 VC 源代码如下:

/////////////////////////////////////////////////////////
// 程序名称:数字拼图游戏
// 编译环境:Visual C++ 2010,EasyX_20210730
// 作    者:慢羊羊
// 发布日期:2021-3-26
// 最后修改:2021-8-3
//
#include <graphics.h>
#include <time.h>
#include <conio.h>


IMAGE	g_Block[16];		// 拼图碎片
byte	g_Map[4][4];		// 游戏地图(存储了每个碎片的下标)
byte	g_E
...

C 语言天罡三十六题 - 基础九题(2021-4-10)

许多同学在学完 C 语言之后,感觉会比较迷茫,不知道该怎样进行下一步练习。接着学《数据结构》像听天书一样,无论怎么努力都学不通透。这都是因为缺少足够的练习所致。本文总结出有限的 36 个练习程序,能独立完成这些程序,再学《数据结构》,会让你有醍醐灌顶的感觉。

这些题目的难度是递增的。如果觉得前面的题目比较简单,可以直接跳过。练习的目标,是可以独立写出代码量超过 2000 行的项目。在这个基础上,再学习数据结构、面向对象等进阶内容,才能真正理解其意义。

很遗憾,天罡36题没有标准答案。每个题目都可以根据自己的理解来完成,完成后可以和其他人交换代码相互学习,以期提高。

这 36 个练习程序我会根据大家的反馈逐步完善,标题中的日期就是当前文档的最后更新日期,希望大家根据最新版本练习。

题目分为四组:

  • 基础九题 https://codebus.cn/yangw/36-tasks-g1 (本篇)
  • 进阶九题&nb
...

第11章 樱花树

童晶老师《C和C++游戏趣味编程》一书各个章节的案例代码,每章案例逐步利用学到的语法知识。

本章我们将绘制一些漂亮的樱花树,如图所示。鼠标位置设定樱花树的高度和分散程度,鼠标右键点击设置是否显示过程动画,鼠标左键点击开始绘制。

首先学习递归的概念,实现汉诺塔问题的求解;然后学习分形的概念,并利用递归调用绘制一棵分形树;最后修改分形树的生成与绘制参数,实现了随机樱花树的绘制。

源码:

#include <graphics.h>  
#include <conio.h>
#include <stdio.h>
#include <math.h>
#include <time.h>
#define  PI 3.1415926
#define  WIDTH 800   // 画面宽度
#define  HEIGHT 600  // 画面高度度

float offsetAn
...

第10章 十字消除

童晶老师《C和C++游戏趣味编程》一书各个章节的案例代码,每章案例逐步利用学到的语法知识。

本章我们将编写十字消除游戏,用户点击空白方块,沿其上下左右方向寻找第一个彩色方块,如果有两个或两个以上颜色一致,就将其消除。在进度条时间结束前消除足够的方块,可以进入下一关,效果如图所示。

首先实现随机颜色方块的表示与绘制,鼠标点击与十字消除算法;然后绘制了提示框,绘制倒计时进度条;接着进行了得分计算、胜负判断、多关卡功能的开发;学习了地址与指针的概念,并利用地址传递使得程序更加模块化;最后学习了指针和数组的知识,应用动态数组实现了游戏尺寸的动态大小调整。

源码:

#include <graphics.h>  
#include <conio.h>
#include <stdio.h>
#include <time.h>
#include <stdlib.h>

# def
...

第9章 推箱子

童晶老师《C和C++游戏趣味编程》一书各个章节的案例代码,每章案例逐步利用学到的语法知识。

本章我们将编写推箱子游戏,玩家键盘控制游戏角色将所有黄色箱子推到白色方块处,效果如图所示。

首先学习字符串与字符数组的概念,并应用字符数组初始化关卡数据;然后利用键盘控制游戏角色移动,实现地图元素更新和游戏胜利的判断;接着利用三维字符数组,实现多关卡的游戏;最后学习基于文件的关卡数据读取,利用枚举类型改进游戏代码。

源码:

#include <graphics.h>  
#include <conio.h>
#include <stdio.h>
#define B_SIZE 60 // 方块大小
#define B_NUM 8 // 方块个数,一共8*8个方块

struct Player // 结构体,用于记录玩家位置
{
	int i;
	int j;
};
Player player; //
...