hello,各位学编程的小伙伴们!学习C语言C++已经这么久了,你们的语法知识已经学到哪里了来了呢?不会还只停留在完成学校老师布置的小作业这样的基础层次吧!

今天这篇文章主要就是带你突破目前的瓶颈,学会了基础语法后,我们就要把它变成我们的能力展现对不对!大家都是已经是成年人了,改写成熟的代码啦!所以今天我们就来试试《火柴人游戏》,用C++结合图形库,将它开发出来吧!

代码也不多哦~也就几百行吧!

PS:要安装easyx图形库哦 #include<easyx.h> / #include <graphics.h> (文末领取)编译器建议VS2019/2022,因为其他的编译器可能要自己配置easyX的环境哦~

第一步:创建一个项目工程,并将准备好的素材资源放到同级目录下(素材可以在文章最下方领取)如图:

第二步:首先我们添加必要的头文件,然后将一些必要的标识符定义,这里也用到了类封装,C++的话类封装还是很重要的哦:

#include <iostream>
#include <fstream>
#include <graphics.h>
#include <conio.h>
#include <time.h>using namespace std;/******全局变量******/
#define STEPDISTANCE    6       // 一步的距离。数值越大,移动速度越快
#define JUMPSPEED       10      // 数值越小,跳得越远
#define ROLLDISTANCE    30      // 滚动的总步数。数值越大,滚得越远/******全局变量******/
int s_v     = STEPDISTANCE;        //障碍物和人物移动速度
int p_v     = JUMPSPEED;       //人物跳跃速度
int score   = 0;               //分数
int max_s   = 0;
char keydown;                   //按键值/********************/
void move();
void Login();/*************************************障碍物类****************************************/
// 障碍物
class zhangai
{
public:int left;int top;int right;int bottom;int r;
public:void draw(int l, int t, int r, int b);   // 绘制障碍物void style();                           // 障碍物类型} s1, s2, s3;// 障碍物类型
void zhangai::style()
{int a;srand((unsigned int) time(NULL));a = rand() % 5 + 1;switch(a){case 0:case 1:case 2:case 3:case 4:top = 330;bottom = 361;break;case 5:top = 260;bottom = 291;break;}
}//障碍物初始化
void zhangai::draw(int l,int t,int ri,int b)
{left=l;top=t;right=ri;bottom=b;solidrectangle(l, t, ri, b);
}/**************************************人物类***********************************/
class people
{
public:int i;                   // 控制人物移动帧数int b;                   // 控制人物滚动帧数int b1;                  // 控制人物滚动时间int j;                   // 人物跳跃上升的速度int k;                  // 人物下降的速度int left;int top;int right;int bottom;private:IMAGE img1[8];          // 人物图像IMAGE img2[8];           // 滚动图像IMAGE img3;              // 跳跃图像public:people();             // 构造函数void jump();         // 人物跳跃void move();         // 人物移动void roll();         // 人物滚动bool impact(zhangai *ps);            // 碰撞
} p;

第三步:写一个构造函数来加载出我们的火柴人图片资源:

people::people()
{// 加载跑动图像loadimage(&img1[0], _T("rc\\picture\\move8_1.jpg"), 70, 100);loadimage(&img1[1], _T("rc\\picture\\move8_2.jpg"), 70, 100);loadimage(&img1[2], _T("rc\\picture\\move8_3.jpg"), 70, 100);loadimage(&img1[3], _T("rc\\picture\\move8_4.jpg"), 70, 100);loadimage(&img1[4], _T("rc\\picture\\move8_5.jpg"), 70, 100);loadimage(&img1[5], _T("rc\\picture\\move8_6.jpg"), 70, 100);loadimage(&img1[6], _T("rc\\picture\\move8_7.jpg"), 70, 100);loadimage(&img1[7], _T("rc\\picture\\move8_8.jpg"), 70, 100);// 加载滚动图像loadimage(&img2[0], _T("rc\\picture\\gun8_1.jpg"), 50, 50);loadimage(&img2[1], _T("rc\\picture\\gun8_2.jpg"), 50, 50);loadimage(&img2[2], _T("rc\\picture\\gun8_3.jpg"), 50, 50);loadimage(&img2[3], _T("rc\\picture\\gun8_4.jpg"), 50, 50);loadimage(&img2[4], _T("rc\\picture\\gun8_5.jpg"), 50, 50);loadimage(&img2[5], _T("rc\\picture\\gun8_6.jpg"), 50, 50);loadimage(&img2[6], _T("rc\\picture\\gun8_7.jpg"), 50, 50);loadimage(&img2[7], _T("rc\\picture\\gun8_8.jpg"), 50, 50);// 加载跳跃图像loadimage(&img3, _T("rc\\picture\\move8_5.jpg"), 70, 100);
}

第四步:实现火柴人的各种动作(包括跳跃、移动和滚动),需要理解一下逻辑:

//人物跳跃
void people::jump()
{if(j >= 70)            //上升{putimage(left,j, &img3);clearrectangle(40,j+100,120,j+120);p.top = j;p.bottom = p.top  + 120;j=j-p_v;k=j;}else if(k <= 240)     //下降{putimage(left,k+20, &img3);clearrectangle(40,70,120,k+20);p.top = k;p.bottom = p.top  + 120;k=k+p_v;}
}//人物移动
void people::move()
{putimage(50, 260, &img1[p.i]);p.left   = 50;p.top = 240;p.right  = p.left + 65;p.bottom= p.top  + 120;p.i++;               // 改变人物帧数if(p.i == 8)     // 人物循环移动{p.i = 0;}
}//人物滚动
void people::roll()
{putimage(50, 300, &img2[p.b]);p.left=50;p.top =300;p.right = p.left + 50;p.bottom = p.top + 50;p.b1++;p.b++;             // 改变人物滚动帧数if(p.b==8)         // 人物循环滚动{p.b=0;}
}

第五步:然后写出关于火柴人游戏的一个障碍部分(包括设置障碍,障碍物的生成和移动,障碍的删除和人物和障碍的触碰等等),具体代码如下:

// 返回是否与指定障碍发生碰撞
bool people::impact(zhangai *ps)
{return (max(left, ps->left) < min(right, ps->right) && max(top, ps->top) < min(bottom, ps->bottom));
}/*************************函数********************************/
// 随机障碍
void zhangai_rnd()
{s1.r=rand() % 200 + 200;s2.r=rand() % 200 + 200;s3.r=rand() % 200 + 200;
}// 初始化障碍
void chushi()
{s1.left = 640;s2.left = s1.left + s1.r;s3.left = s2.left + s2.r;s1.style();s2.style();s3.style();
}// 绘制障碍
void show_zhangai()
{s1.draw(s1.left, s1.top, s1.left + 40, s1.bottom);s2.draw(s2.left, s2.top, s2.left + 40, s2.bottom);s3.draw(s3.left, s3.top, s3.left + 40, s3.bottom);
}// 删除障碍
void delete_zhangai()
{clearrectangle(s1.left, s1.top, s1.left+40, s1.bottom);clearrectangle(s2.left, s2.top, s2.left+40, s2.bottom);clearrectangle(s3.left, s3.top, s3.left+40, s3.bottom);
}// 障碍物循环
void xunhuan()
{if(s1.left+40<=0){s3.r = rand() % 200 + 200;s1.left = s3.left + s3.r;s1.style();}else if(s2.left+40<=0){s1.r = rand() % 200 + 200;s2.left = s1.left + s1.r;s2.style();}else if(s3.left + 40 <= 0){s2.r = rand() % 200 + 200;s3.left = s2.left + s2.r;s3.style();}
}// 设置障碍移动速度
void set_speed()
{s1.left -= s_v;s2.left -= s_v;s3.left -= s_v;
}

第六步:实现分数和排行榜,这里会用到文件操作的知识,所以说语法是我们实现一切的前提,大家一定要学好哦!

// 储存成绩
void gave_score()
{ofstream outfile("score.txt", ios::out);if(!outfile){cerr << "open error!" << endl;exit(1);}outfile << score << " ";outfile.close();
}// 读取最高分
void max_score()
{int value;ifstream infile("score.txt", ios::in);if(!infile){cerr << "open error!" << endl;exit(1);}infile>>value;infile.close();max_s = value;
}// 改变最高分
void change_score()
{int value;ifstream infile("score.txt", ios::in);if(!infile){cerr << "open error!" << endl;exit(1);}infile>>value;infile.close();if(score>value){gave_score();}
}

第七步:实现火柴人的移动和障碍的碰撞检测,如果人和障碍的坐标有重叠,那么就说明撞了,游戏结束:

// 游戏结束
void game_over()
{FlushMouseMsgBuffer();     //清空鼠标缓存区change_score();Sleep(1000);p.i = 0;cleardevice();Login();
}// 碰撞
void pengzhuang()
{// 指向当前障碍的指针zhangai *ps;// 获取当前障碍ps = &s1;if (s2.left < ps->left)   ps = &s2;if (s3.left < ps->left) ps = &s3;// 检测碰撞if (p.impact(ps)){p_v = 0;s_v = 0;game_over();}
}// 移动
void move()
{keydown=' ';                // 清空键盘缓存区setfillstyle(BS_SOLID);       // 设置绘图样式cleardevice(); solidrectangle(0, 360, 640, 400);char s[10];char max[10];char ss[] = "分数:0";char sss[] = "最高分:";max_score();              // 最高分settextcolor(BLUE);sprintf(max, "%d", max_s);   // 数值格式化outtextxy(490, 40, max);        // 输出最高分outtextxy(58, 40, ss);outtextxy(400, 40, sss);p.i  = 0;p.b  = 0;p.b1 = 0;p.j  = p.k = p.top = 240;p.left = 50;zhangai_rnd();chushi();IMAGE img1;loadimage(&img1, _T("rc\\picture\\move8_1.jpg"),70,100);putimage(50,260, &img1);while(true){keydown=getch();while(!kbhit()){sprintf(s,"%d",score);outtextxy(120,40,s);show_zhangai();if(keydown == 'w'){p.i = 0;p.b1 = 0;p.jump();if(p.k > 240){keydown = ' ';p.j = 240;}}else if(keydown == 's'){if(p.b1 == 0)clearrectangle(50, 240, 120, 361);if(p.k >= 240)p.roll();elsekeydown='w';}else{if(p.k >= 240)p.move();elsekeydown = 'w';if(p.b1 == 0)p.move();elsekeydown = 's';}if(p.b1 >= ROLLDISTANCE){p.b1 = 0;keydown = ' ';p.b = 0;}Sleep(20);pengzhuang();delete_zhangai();set_speed();score++;      // 分数xunhuan();     // 障碍物循环移动 }}
}

最后一步:界面部分!主要功能都实现了,作为一个游戏,当然还是需要一个美美的界面咯!

void Login()
{setfillstyle(BS_SOLID);setbkcolor(LIGHTBLUE);char s[]  = "开始游戏";char ss[]   = "退出游戏";char sss[]  = "游戏说明: W 键 = 跳跃   S 键 = 滚动";MOUSEMSG m;solidrectangle(240, 100, 380, 150);solidrectangle(240, 160, 380, 210);settextcolor(BLUE);                 // 设置字体颜色outtextxy(260, 113, s);outtextxy(260, 173, ss);setbkcolor(WHITE);outtextxy(110, 250, sss);setfillcolor(LIGHTBLUE);solidrectangle(0, 360, 640, 400);while(true){m = GetMouseMsg();             // 判断是否按下鼠标if(m.x >= 240 && m.x <= 380 && m.y >= 100 && m.y <= 150){setlinecolor(RED);          // 选中框框线条颜色rectangle(235, 95, 385, 155);if(m.uMsg==WM_LBUTTONDOWN ){clearrectangle(240, 100, 380, 150);clearrectangle(240, 160, 380, 210);setbkcolor(WHITE);cleardevice();game_again();}}else if(m.x >= 240 && m.x <= 380 && m.y >= 160 && m.y <= 210){setlinecolor(RED);         // 选中框框线条颜色rectangle(235, 155, 385, 215);if(m.uMsg==WM_LBUTTONDOWN){exit(1);}}else{setlinecolor(WHITE);rectangle(235, 95,  385, 155);rectangle(235, 155, 385, 215);}}
}/***********************************************************************/
// 界面初始化
void UI()
{initgraph(640, 400);               // 窗口初始化大小setbkcolor(WHITE);                    // 设置背景颜色cleardevice();setlinecolor(BLACK);             // 设置绘图颜色settextcolor(BLACK);               // 设置文字颜色setfillcolor(LIGHTBLUE);           // 设置填充颜色settextstyle(25, 0, _T("宋体"));   // 字体样式大小srand((unsigned int) time(NULL));  // 设置随机种子
}/*******************************主函数**********************************/
void main()
{UI();                  // 界面初始化Login();                // 登录界面getch();             // 按任意键继续closegraph();          // 关闭图形界面
}

好啦,重要的基础代码就这些~需要完整源码对照的同学可以在文章末领取!

火柴人游戏教程就到此结束啦,大家赶紧试试吧!

源码素材获取通道:(而且你可以在群里面交流提问C语言/C++的相关编程问题哦)

C/C++项目开发:《火柴人游戏》,500行源代码开发相关推荐

  1. 用python实现简单的火柴人游戏

    用python实现简单的火柴人游戏 1.最终效果 2.准备工作 先画出游戏中各个部分的图像素材,其中包括背景,移动的火柴人,门,楼梯. 背景:500/500像素 火柴人:27/30像素 门:27/30 ...

  2. c语言奔跑的火柴人游戏源码(附完整源码)

    c语言奔跑的火柴人游戏源码 #include <iostream> #include <fstream> #include <graphics.h> #includ ...

  3. c++奔跑的火柴人游戏

    C++是一种计算机高级程序设计语言,由C语言扩展升级而产生 ,最早于1979年由本贾尼▪斯特劳斯特卢普在 AT&T贝尔工作室研发. C++既可以进行C语言的过程化程序设计,又可以进行以抽象数据 ...

  4. 运用Easyx图形库实现火柴人游戏左右跑动

    所谓游戏动画,就是不断绘制更新绘制更新的一个连续过程,与上次我开发的经典游戏<Flappy Bird>相似,所以我们的主函数为一个循环体.然后游戏代码分为 定义.初始化.更新数据.操作判定 ...

  5. python练习:简单火柴人游戏

    这个游戏是我初学python时写的,个人觉得例子非常好,现在分享给大家. 每一行代码不懂得直接评论吧我都会详细解释~,希望能有助于各位的学习. 游戏如下: 在单词库中给出一系列单词,如果猜错火柴人会一 ...

  6. python火柴人游戏代码_Python小游戏 Hangman

    游戏规则: 玩家一想好一个单词,玩家二猜测这个单词所包含的字母,每次猜测一个,如果玩家二本次没有猜对,玩家一就画出火柴人的一部分,玩家二如果在玩家一画完全部的火柴人之前猜出所有的字母,玩家二获胜. 代 ...

  7. python实现火柴人游戏_火柴人发射爱心.py

    #!/usr/bin/env python # -*- coding:utf-8 -*- # @File: 火柴人发射爱心.py # Author: Chen jun # @Time: 2019/11 ...

  8. python代码示例500行源代码-500行代码使用python写个微信小游戏飞机大战游戏

    这几天在重温微信小游戏的飞机大战,玩着玩着就在思考人生了,这飞机大战怎么就可以做的那么好,操作简单,简单上手. 帮助蹲厕族.YP族.饭圈女孩在无聊之余可以有一样东西让他们振作起来!让他们的左手 / 右 ...

  9. golang游戏服务器项目,基于Golang的游戏服务器框架cellnet开发日记(一)

    启程的故事 使用Golang写服务器是一件非常幸福的事情. 不用长时间的等待编译, 零依赖部署. 开发效率高, 多出的时间陪陪家人, 看书充充电多好. 所以Golang就像是手机界的苹果, 从发布后, ...

最新文章

  1. QQ 5.0侧滑HorizontalScrollView以及自定义ViewGroup
  2. linux查看端口访问用户,如何查找连接到HTTP或HTTPS端口的所有客户端
  3. web安全_暴力破解
  4. java 开源控件_一些好用的开源控件
  5. 一维数组去重处理法二(C语言)
  6. min java_LeetCode算法题-Min Stack(Java实现)
  7. n-1 java_【Java】 剑指offer(53-2) 0到n-1中缺失的数字
  8. 程序设计竞赛中常用的STL汇总
  9. java 双冒号_Java 双冒号::是什么操作符?
  10. JavaScript编程用法——JavaScript运行环境
  11. 期刊论文发表的字数是怎么计算的
  12. 解决Windows远程桌面连接工具连接不上远程操作系统的问题
  13. SQLSERVER的中文排序规则
  14. linux bin sh命令,linux shell中#!bin/sh的理解
  15. 我的世界服务器如何修改天气,我的世界怎么改变天气 我的世界改变天气指令代码大全...
  16. 谷歌浏览器查看当前网页默认字体大小及其他样式
  17. WiFi基本概念(十三)射频(一)(EVM)
  18. C/C++ struct定义
  19. css翘边阴影图片,【CSS】翘边阴影
  20. 简单一步,轻松下载B站视频 | 实用技能get

热门文章

  1. vb 回车换行符 分割 字符串
  2. MySQL数据类型以及基本使用详解
  3. 解决mplfinance绘制箱体图一字涨停k线颜色错误的情况
  4. Cleaning-Data-in-Python
  5. 如何调用EasyCVR平台的登录、播放地址、录像回看接口?
  6. php 通过当前时间计算几天,几周,几个月或者几年以后的时间
  7. 贰零贰壹·陆·伍·|比赛|·|创客|:第二十届自治区青少年机器人竞赛心得总结
  8. 「项目进度管理」如何编制有效的进度计划?
  9. java web: 上午 org.apache.catalina.core log 信息: 将servlet[***]标记为不可用/或者XXX资源不可用
  10. phpyun 电脑调试wap版