C/C++游戏编程实例-飞翔的小鸟

news2024/11/26 0:38:19
飞翔的小鸟游戏设计

首先需要包含以下库:

#include<stdio.h>
#include<windows.h>
#include<stdlib.h>	//包含system
#include<conio.h>

设置窗口大小:

#define WIDTH 50
#define HEIGHT 16

设置鸟的结构:

struct bird
{
	bool live;
	int x,y;
	int speed;
	int score;
	int step;
}bird;

设置洞/墙的结构:

struct hole
{
	int size;
	int yBegin;
}hole;

定义全局变量:

char map[HEIGHT - 1][WIDTH];
int scoreMax = 0;

游戏初始化设置:

void GameInit()
{
	srand(GetTickCount());
	//窗口
	char cmd[128];
	sprintf(cmd, "mode con cols=%d lines=%d", WIDTH, HEIGHT);
	system(cmd);	//将cmd窗口设定为指定大小,其中cols指定为列数,lines指定为行数。
	system("title flappy bird");	//标题
	//地图清零
	for (int i = 0; i < HEIGHT - 1; i++)
	{
		for (int j = 0; j < WIDTH; j++)
		{
			map[i][j] = ' ';
		}
	}
	//鸟初始化
	bird.live = true;
	bird.score = 0;
	bird.step = 0;
	bird.x = 7, bird.y = 7;
	bird.speed = 1;
	map[bird.y][bird.x] = '*';
	//洞
	hole.size = 7;
	//开始画面
	for (int i = 0; i < HEIGHT - 1; i++)
	{
		for (int j = 0; j < WIDTH; j++)
		{
			putchar(map[i][j]);
		}
		putchar(10);//换行
	}
	printf("\t你的分数:%d\t最高分:%d  按N键起飞", bird.score, scoreMax);
	while (!GetAsyncKeyState('N'));
}

创建墙的机制:

void CreateWall()
{	
	if (bird.step % 20 == 0)//过一段距离创建墙
	{
		hole.yBegin = rand() % 8 + 3;
		for (int i = 0; i < HEIGHT - 1; i++)
		{
			if (i < hole.yBegin || i >= hole.yBegin + hole.size)map[i][49] = '#';
			else map[i][49] = ' ';
		}
	}
}

墙向左移动的机制:

void WallMove()
{
	for (int j = 0; j < WIDTH; j++)
	{
		if (map[0][j] == '#')//有墙
		{
			if (j == 0)//墙到头
				for (int k = 0; k < HEIGHT - 1; k++)
					map[k][j] = ' ';
			else//墙没到头
			{
				for (int k = 0; k < HEIGHT - 1; k++)
				{
					if (map[k][j] == '#')
					{
						map[k][j - 1] = '#';
						map[k][j] = ' ';
					}
				}
				//鸟穿过墙
				if (j == bird.x)bird.score++;
			}
		}
	}
	//更新最高分数
	scoreMax = bird.score > scoreMax ? bird.score : scoreMax;
	//增大难度
	if (bird.step % 100 == 0)
	{
		hole.size--;
		if (hole.size == 0)hole.size = 1;
	}
	bird.step++;//墙左移,鸟级数+1
}

鸟上下移动的机制:

void BirdMove()
{
	if (GetAsyncKeyState(VK_SPACE))//上升
	{
		bird.y -= bird.speed;
		if (map[bird.y][bird.x] == '#'){bird.live = false; return;}//撞墙判断
		map[bird.y][bird.x] = '*';
		map[bird.y+ bird.speed][bird.x] = ' ';
	}
	else//下降
	{
		bird.y += bird.speed;
		if (map[bird.y][bird.x] == '#'){bird.live = false; return;}//撞墙判断
		map[bird.y][bird.x] = '*';
		map[bird.y - bird.speed][bird.x] = ' ';
	}
	//越界判断
	if(bird.y>=HEIGHT|| bird.y <= 0)bird.live = false;
}

窗口需要实时更新,实现画面的连续性:

void DrawGame()
{
	system("cls");//画面是一块一块输出的
	//输出字符
	for (int i = 0; i < HEIGHT - 1; i++)
	{
		for (int j = 0; j < WIDTH; j++)
		{
			putchar(map[i][j]);
		}
		putchar(10);//换行
	}
	printf("\t你的分数:%d\t最高分:%d  芜湖~~~", bird.score, scoreMax);
}

执行主函数:

int main()
{
	while (1)
	{
		GameInit();
		while (bird.live)
		{
			DrawGame();
			BirdMove();
			CreateWall();
			WallMove();
			Sleep(100);
		}
		system("cls");
		printf("\n\n\t你鸟没了!\n\n\t你的分数:%d\t最高分:%d\n\n", bird.score, scoreMax);
		printf("\t\t按B键重新开始");
		while (!GetAsyncKeyState('B'));
	}
	system("pause");
	return 0;
}

结果:

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

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

相关文章

在线版的超级马里奥 Super Mario HTML5

原本是在csdn资源找个代码学习的&#xff0c;无奈下载了几份都是垃圾代码(下载了几份都是) 废话不多说&#xff0c;直接上干活。代码、音效、图片、样式都包含 <!doctype html> <html> <head> <meta charsetutf-8 /> <title>Super Mario HTML5 …

C语言变量存储属性

在C语言中&#xff0c;变量不仅仅是用来存储数据的容器&#xff0c;还拥有一些额外的存储属性&#xff0c;这些属性决定了变量的生命周期、作用域和存储位置等。本文将介绍C语言中常见的变量存储属性&#xff0c;包括自动存储、静态存储、寄存器存储和外部链接存储&#xff0c;…

吾空笔记本X15降温

低成本搞了个悟空笔记本&#xff0c;其实就是蓝天磨具&#xff0c;跟木叶村&#xff0c;机革一样&#xff0c;只是说机革边角改得多点&#xff0c;这两个基本没改。通病是轻薄本压不住AMD这个U&#xff0c;如果在超频模式&#xff0c;且带高刷屏&#xff0c;GPU加CPU的功耗&…

【Linux】认识线程池 AND 手撕线程池(正常版)

文章目录 0.回顾进程池1.计算机层面的池化技术2.线程池预备知识2.1介绍线程池2.2设计线程池的意义是什么&#xff1f;2.3其他知识 3.回顾C类与对象3.1cpp什么情况下成员函数必须是静态的&#xff1f;3.1可变参数列表3.2格式化输出函数3.3预定义符号 4.图解线程池运作原理4.0完整…

并查集----格子游戏

并查集中最重要的是要搞懂&#xff1a; 不明白的可以拿纸自己先演示一番&#xff0c;find函数不仅能找到他们的祖先数&#xff0c;而且同时也能更新路径的子结点都等于祖先&#xff0c;然后以后寻找时会更加的方便&#xff01;

P3817 小A的糖果(贪心)

思路&#xff1a;真绝了&#xff0c;开了longlong从80分到了100分。因为一个特判st值影响我AC&#xff0c;那个单独的特判竟然有问题。我想的是如果有a[i] a[i1]则将状态值st标为true。最后在输出结果之前先看st的值&#xff0c;如果他为false&#xff0c;则说明没有两盒子的和…

网络编程套接字 (一)

本专栏内容为&#xff1a;Linux学习专栏&#xff0c;分为系统和网络两部分。 通过本专栏的深入学习&#xff0c;你可以了解并掌握Linux。 &#x1f493;博主csdn个人主页&#xff1a;小小unicorn ⏩专栏分类&#xff1a;网络 &#x1f69a;代码仓库&#xff1a;小小unicorn的代…

InnoDB支持哪几种行格式?

一、问题解析 数据库表的行格式决定了一行数据是如何进行物理存储的&#xff0c;进而影响查询和DML操作的性能。 在InnoDB中&#xff0c;常见的行格式有4种&#xff1a; 1COMPACT &#xff1a;是MySQL 5.0之前的默认格式&#xff0c;除了保存字段值外&#xff0c;还会利用空值…

沃通国密SSL根证书入根赢达信国密浏览器

近日&#xff0c;沃通CA国密SSL根证书正式入根赢达信国密安全浏览器&#xff0c;携手推动国产密码技术应用、完善国密应用生态体系&#xff0c;也标志着沃通国密SSL证书兼容性再次得到提升&#xff0c;进一步夯实国密应用根基。 密码算法的安全性是信息安全保障的核心&#xff…

时序预测 | Matlab实现OOA-BP鱼鹰算法优化BP神经网络时间序列预测

时序预测 | Matlab实现OOA-BP鱼鹰算法优化BP神经网络时间序列预测 目录 时序预测 | Matlab实现OOA-BP鱼鹰算法优化BP神经网络时间序列预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.Matlab实现OOA-BP鱼鹰算法优化BP神经网络时间序列预测&#xff08;完整源码和数据…

PyLMKit(8):ChatDB与你的数据库聊天,数据库问答

功能介绍 与你的结构化数据聊天&#xff1a;支持主流数据库、表格型excel等数据&#xff01; ChatDB&#xff1a;支持数据库问答ChatTable&#xff1a;支持txt,excel,csv等pandas dataframe表格的问答 1.下载安装 pip install pylmkit -U pip install pymysql sqlalchemy s…

基于el-table实现行内增删改

实现效果&#xff1a; 核心代码&#xff1a; <el-table :data"items"style"width: 100%;margin-top: 16px"border:key"randomKey"><el-table-column label"计划名称"property"name"><template slot-scope&q…

40.HarmonyOS鸿蒙系统 App(ArkUI)实现页面跳转与返回

1.新建项目&#xff0c;默认创建inext.ets界面。 2.右键page添加第二个页面&#xff0c;设置page2,点击finish 设置按钮触发事件&#xff1a; page2.ets按钮触发事件 index.ets import FaultLogger from ohos.faultLogger import promt2 from ohos.prompt import promt_action…

Linux重点思考(中)--端口/静态内存/负载/日志

这里写目录标题 知道的linux常用命令&#xff1a;查看指定端口进程netstat -pantunetstat -pantu|grep 22 静态运行内存free硬盘物理内存df和du当前负载uptime查看日志awk统计文件每一行单词sed 替换文件单词 知道的linux常用命令&#xff1a;查看指定端口进程 netstat -pantu…

C#简单——多选框控件相关的神奇问题

他们真的很简单&#xff0c;但我怎么总是忘记啊QAQ 还是记下来吧&#xff0c;下次直接copy 点开后出现 有列名 列名有数据&#xff0c;有表 表里有数据但不显示的情况 解决&#xff1a;点击小三角-点击Design View-Columns-需要在这里对下拉列表里的内容进行对应配置。 多选框…

ngAlain下使用nz-select与文件上传框出现灵异bug

bug描述 初始化页面&#xff0c;文件上传框无法出现&#xff1a; 但点击一次选择框以后&#xff0c;就会出现&#xff1a; 真的很神奇。。。 下面逐步排查看看是什么原因。 设想一&#xff1a; 选择框与文件框不可同时存在&#xff0c;删掉选择框看看&#xff1a; 还…

pytest--python的一种测试框架--pycharm创建项目并进行接口请求

前言 学习request的使用&#xff0c;在用之前&#xff0c;用官方文档提供的接口&#xff1a;https://api.github.com/events&#xff1b; ctrl鼠标左键可以进入被调用函数源码&#xff0c;可以看到第一个参数URL是必须参数&#xff0c;params是选填&#xff0c;**kwargs是关键…

基于单片机的自动浇灌系统的设计

本文设计了一款由单片机控制的自动浇灌系统。本设计的硬件电路采用AT89C51单片机作为主控芯片,采用YL-69土壤湿度传感器检测植物的湿度。通过单片机将采集湿度值与设定值分析处理后,控制报警电路和水泵浇灌电路的开启,从而实现植物的自动浇灌。 1 设计目的 随着生活水平的…

哥本哈根Major后steam搬砖该何去何从?

都在问我哥本哈根major比赛过后市场会不会崩盘呢&#xff1f;说实话&#xff0c;我是不喜欢预测市场的&#xff0c;其实是没那个本事而已。若真有这个预测市场走势的本事&#xff0c;我还用坐在这里每天苦哈哈的搬砖吗&#xff1f;我直接干囤卡囤号的倒卖生意岂不早发财了&…

Docker 哲学 - push 本机镜像 到 dockerhub

注意事项&#xff1a; 1、 登录 docker 账号 docker login 2、docker images 查看本地镜像 3、注意的是 push镜像时 镜像的tag 需要与 dockerhub的用户名保持一致 eg&#xff1a;本地镜像 express:1 直接 docker push express:1 无法成功 原因docker不能识别 push到哪里 …