- 分享
我完成(一半)力!
- @ 2026-1-10 19:46:46
开始前,请确保你已经按照教程做了.
思路
其实也没别的,只是感觉有一个比较好用的思路推荐一下
EMMM
反正就是看到了一种随机算法,叫 柏林噪声 ,能生成比较自然的纹理,但我不用纹理,就稍微改了一下,让他能生成比较自然的地形:
int bj[120];
void dj__(){
int bj_[126];
for(int i=0;i<126;i++){
bj_[i]=rand_(750,769);
}
for(int i=0;i<120;i++){
bj[i]=0;
for(int j=i;j<6+i;j++) bj[i]+=bj_[j];
bj[i]/=6;
}
}
代码(知道你们只看这里)
bits.h:
//这将是一个easyx的神人头文件
/*
1.函数
1.qian() 把画布挪至最前方(最好必用)
2.in() 输入
3._out() 在画布上新建一行文字
4.outph() 显示图片
5.getph() 把图片名加上地址
例(显示一张图片):
string s="start.jpg";(一定要一个变量)
s=getph(s);(加上地址,默认是.exe地址+\ph\(就是把照片存到.exe所在文件夹下再建一个ph文件夹,在里面存照片))
outph(0,0,s);(在0,0显示图片)
2.头文件
包含所有头文件,最好不要改
*/
#include <windows.h>
#include <easyx.h>
#include <conio.h>
#include <string>
#include <vector>
#include <map>
#include <bits/stdc++.h>
using namespace std;
int rand_(int l,int r);
struct body{
int x,y;
int to_x,to_y;
int xf,yf;
}b[3];
// 全局变量,记录每个按键的上一次状态
map<char, bool> keyPrevState;
void qian_() {
HWND hWnd = GetHWnd();
SetWindowPos(hWnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);
}
void chbkc(COLORREF W){
setbkcolor(W);
cleardevice();
}//清空画布
void drso(int xx,int xy,int chx,int chy,COLORREF W){
int yx=xx+chx,yy=xy+chy;
setfillcolor(W);
solidrectangle(xx,xy,yx,yy);
}//绘制填充矩形
////
int bj[120];
void dj__(){
int bj_[126];
for(int i=0;i<126;i++){
bj_[i]=rand_(750,769);
}
for(int i=0;i<120;i++){
bj[i]=0;
for(int j=i;j<6+i;j++) bj[i]+=bj_[j];
bj[i]/=6;
}
}
int dt[1200];
void rdt(){
for(int i=0;i<120;i++){
for(int j=10*i;j<10*(i+1);j++) dt[j]=bj[i];
}
}
int dux[1000][120];
int dxbj=0;
void dx(bool x){
if(x==0){
if(dxbj==0) dxbj=999;
else dxbj=dxbj-1;
}
if(x==1){
if(dxbj==999) dxbj=0;
else dxbj++;
}
if(dux[dxbj][0]==0){
dj__();
for(int i=0;i<120;i++) dux[dxbj][i]=bj[i];
}
else{
for(int i=0;i<120;i++) bj[i]=dux[dxbj][i];
}
rdt();
}
////只有dx能用,给的参数是向左还是向右,0为左,dt[i]表示x=i时地的高度
bool in(char x, bool flag = 1) {
char e = x;
if (flag) {
e -= 32; // 转换为大写(假设x是小写)
}
return (GetAsyncKeyState(x) || GetAsyncKeyState(e));
}
void _out(string s, int x, int y,COLORREF c=WHITE) {
setbkmode(TRANSPARENT);
settextcolor(c);
settextstyle(20, 0, _T("宋体"));
TCHAR tstr[256];
_stprintf(tstr, _T("%s"), s.c_str());
outtextxy(x, y, tstr);
}
// 显示图片函数
// 参数: x - x坐标, y - y坐标, filename - 图片文件名
// 返回值: bool - 成功返回true,失败返回false
// 显示图片函数
void outph(int x, int y, const std::string& s) {
// 加载图片
IMAGE img;
loadimage(&img, s.c_str());
// 在指定位置显示图片
putimage(x, y, &img);
}
string getph(const string& pl) {
char buffer[MAX_PATH] = {0};
GetModuleFileNameA(NULL, buffer, MAX_PATH);
string path(buffer);
size_t pos = path.find_last_of("\\/");
if (pos != string::npos) {
path = path.substr(0, pos) + "\\ph\\" + pl;
} else {
path = path + "\\ph\\" + pl;
}
return path;
}
// 侧身人形改进版 - 更明显的侧身效果
void drawman(int x, int y,bool fla) {
int baseX = x - 10;
int baseY = y - 30;
// 1. 头 - 侧脸(椭圆)
setfillcolor(RGB(255, 205, 148));
solidrectangle(baseX + 10, baseY + 1, baseX + 15, baseY + 8);
solidrectangle(baseX + 12, baseY + 8, baseX + 13, baseY + 9);
setfillcolor(RGB(0, 0, 0));
solidrectangle(baseX + 10, baseY + 1, baseX + 15, baseY + 2);
if(fla==0) solidrectangle(baseX + 10, baseY + 4, baseX + 11, baseY + 5);
else solidrectangle(baseX + 14, baseY + 4, baseX + 15, baseY + 5);
if(fla==1) solidrectangle(baseX + 10, baseY + 3, baseX + 11, baseY + 4);
else solidrectangle(baseX + 14, baseY + 3, baseX + 15, baseY + 4);
setfillcolor(RGB(255, 205, 148)); // 肤色
if(fla==1) solidrectangle(baseX + 10, baseY + 10, baseX + 12, baseY + 20);
else solidrectangle(baseX + 14, baseY + 10, baseX + 16, baseY + 20);
// 2. 身体 - 侧身(窄矩形)
setfillcolor(RGB(220, 100, 100)); // 红色上衣
solidrectangle(baseX + 11, baseY + 10, baseX + 15, baseY + 22);
// 3. 腿 - 侧身(一条腿)
setfillcolor(RGB(50, 50, 50)); // 黑色裤子
solidrectangle(baseX + 12, baseY + 22, baseX + 14, baseY + 30);
// 4. 前臂 - 在身体前方
setfillcolor(RGB(255, 205, 148)); // 肤色
if(fla==0) solidrectangle(baseX + 10, baseY + 10, baseX + 12, baseY + 20);
else solidrectangle(baseX + 14, baseY + 10, baseX + 16, baseY + 20);
}
int rand_(int l, int r) {
static unsigned seed = std::chrono::system_clock::now().time_since_epoch().count();
static std::mt19937 gen(seed);
std::uniform_int_distribution<> dis(l, r);
return dis(gen);
}
bool u_d_(body xx,body yy){
if(xx.x==yy.x && xx.y==yy.y) return 1;
return 0;
}
int jumpv=-20;
bool isjump=0;
bool go(int zy,int& x,int& y){
if(zy==0){
if(x-6<0){
x-=6;
x+=1200;
if(isjump==0) y=dt[x];
return 1;
}
x-=6;
if(isjump==0) y=dt[x];
}
if(zy==1){
if(x+6>=1200){
x+=6;
x-=1200;
if(isjump==0) y=dt[x];
return 1;
}
x+=6;
if(isjump==0) y=dt[x];
}
return 0;
}
void jump(int& x,int& y){
if(y>=dt[x]){
isjump=0;
jumpv=-20;
y=dt[x];
return ;
}
y+=jumpv;
if(y>=dt[x]) y=dt[x];
jumpv=min(jumpv+1,20);
}
int n=3;
void start_csh(){
cont:;
for(int i=0;i<n;i++){
con:;
b[i].x=rand_(10,1190);
b[i].y=rand_(10,790);
b[i].to_x=rand_(10,1190);
b[i].to_y=rand_(10,790);
b[i].xf=b[i].to_x-b[i].x;
b[i].yf=b[i].to_y-b[i].y;
if(abs(b[i].xf)+abs(b[i].yf)>20) goto con;
}
if(u_d_(b[0],b[1]) || u_d_(b[0],b[2]) || u_d_(b[1],b[2])) goto cont;
}
main.cpp:
#include"bits.h"
using namespace std;
int main(){
std::srand(static_cast<unsigned int>(
std::chrono::system_clock::now().time_since_epoch().count()));
initgraph(1200,800);
qian_();
string lo=getph("ling.png");
outph(0,0,lo);
start_csh();
// for(int i=0;i<n;i++){
// cout << b[i].x<<' '<<b[i].y<<endl;
// cout << b[i].xf<<' '<<b[i].yf<<endl;
// }
dx(0);
bool manf=1;
int manx=350,many=0;
go(manf,manx,many);
while(1){
int uuu=1;
BeginBatchDraw();
if(in('a') || in(VK_LEFT,0)) manf=0;
else if(in('d') || in(VK_RIGHT,0)) manf=1;
else uuu=0;
if((in('w') || in(VK_UP,0)) && !isjump){
isjump=1;
many--;
}
chbkc(RGB(160, 82, 45));
for(int i=0;i<1200;i++) drso(i,0,1,dt[i],RGB(135, 206, 235));
_out(to_string(dxbj),0,0,BLACK);
bool wk=0;
if(uuu==1) wk=go(manf,manx,many);
if(wk){
if(manx<300) dx(1);
else dx(0);
}
if(isjump){
jump(manx,many);
}
drawman(manx,many,manf);
EndBatchDraw();
Sleep(15);
}
return 0;
}
备注
1.此代码含有约20%的AI成分,但注释是自己写的,而且核心和50%多的函数是自己写的(防止有人说不是我写的)
2.请确保你已经按照
照做,否则出错我不负任何责任
3.请确保你用C++14或以上版本,否则出错我不负任何责任
4.建议新建项目时创建一个文件夹
5.仅支持DEV
0 comments
No comments so far...