开始前,请确保你已经按照教程做了.

思路

其实也没别的,只是感觉有一个比较好用的思路推荐一下

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...