C语言学习推荐---小游戏

news/2024/5/16 0:24:43/文章来源:https://blog.csdn.net/qq_40571533/article/details/108183754

文章目录

  • 控制台文字游戏
    • srand、rand、time
    • 猜拳游戏
  • 控制台动作游戏
    • 运动的小球
    • 贪吃蛇
  • 音乐
  • 图形界面
    • easyx介绍
  • 后续

学习c语言的时候,想写例子,但是课后习题又太枯燥怎么办?
写小游戏可以锻炼我们的编程抽象能力和思维,而且比较有趣,最重要的是还能自己玩玩。

控制台文字游戏

c语言学了一点基础就可以写了,因为基本上只用到了输入输出和逻辑判断。

文字游戏可以做很长的剧情,我们用来学习就做个简单的,并且熟悉一下游戏中非常重要的一部分:随机

srand、rand、time

srand函数原型(<stdlib.h>):void srand( unsigned int seed );
功能:设置伪随机数生成器的起始种子值
参数:

  • seed — 伪随机数生成的种子

srand函数原型(<stdlib.h>):int rand( void );
功能:得到一个伪随机数
返回值:返回一个伪随机数范围为0~RAND_MAX(32767)

注:

  1. 第一次调用rand()之前没有调用srand(),那么系统会为你自动调用srand(),自动调用传参值为1。
  2. 使用相同种子(srand函数传参值相同),调用 rand()生成的是相同随机数序列。

看完上面的函数我们发现使用上有困难:srand函数传参固定会导致生成的随机数是相同随机数序列。那就不传固定的数,无时无刻不在改变当然可以是时间戳

time函数原型(<time.h>):time_t time( time_t *destTime );
功能:获取系统时间
功能:

  • destTime:指向时间的存储位置的指针。可以为NULL,在这种情况下,不存储返回值。

返回值:返回自1970年1月1日午夜以来经过的秒数,如果发生错误,则返回-1。


组合使用:
比如我们想要获取1~10的随机数,rand()为[0, 32767],rand() % 10为[0, 9],1 + rand() % 10为[1, 10].

#include <stdio.h>
#include <stdlib.h>
#include <time.h>int main(void)
{srand((unsigned int)time(NULL));for (int i = 0; i < 10; ++i) {printf("%d ", 1 + rand() % 10);}system("pause");return 0;
}

当然也可以自己试着实现一下,效果也还行:

#include <stdio.h>
#include <time.h>/* 种子 */
unsigned long int next = 1;/*** 设置随机数种子** @param seed 随机数种子*/
void srand(unsigned int seed)
{next = seed;
}/* 获取随机数 */
int rand(void)
{next = next * 1103515245 + 12345;return (unsigned int)(next / 65536) % 32768;
}int main(void)
{srand((unsigned int)time(NULL));for (int i = 0; i < 10; i++) {printf("%d ", 1 + rand() % 10);}system("pause");return 0;
}

猜拳游戏

我们有了伪随机函数就能模拟电脑猜拳了,可以生成0~2的随机数(可以当做索引),0代表剪刀,1代表石头,2代表布。

#include <stdio.h>
#include <stdlib.h>
#include <time.h>// 结果
const char* result[3][3] =
{{"平手", "赢了", "输了"},{"输了", "平手", "赢了"},{"赢了", "输了", "平手"}
};// 石头 剪刀 布
const char* menu[3] = { "剪刀", "石头", "布" };int main(void)
{int player = 0; 	// 玩家int computer = 0;	// 电脑srand((unsigned)time(NULL));while (1){// 提示printf("这是一个猜拳的小游戏,请输入下列选项:\n0:剪刀\n1:石头\n2:布\n");// 获取输入scanf("%d", &player);scanf("%*[^\n]%*c");if (player < 0 || player > 2){printf("你的选择有错\n");}else{computer = rand() % 3;printf("电脑出了%s\t你出了%s\n", menu[computer], menu[player]);printf("%s\n", result[computer][player]);}system("pause");system("cls");}return 0;
}

system可以用来执行系统命令,pause为按任意键继续,cls为清屏。

控制台动作游戏

一开始可能对这种动起来的游戏没什么思路,我们可以类比一下动画播放,画面一直在改变我们就觉得它在动了。

运动的小球

我们先做一个没有交互的小例子体验一下。
我们把控制台想象成一个坐标系:
在这里插入图片描述
小球就有一个具体的坐标,我们只要不断改变小球的坐标并且重新绘制小球就能让它动起来。
绘制的思路(先来个无脑的):

  1. 先清屏
  2. 然后按照y坐标多少输出换行
  3. 按照x坐标输出空格
  4. 最后输出小球(就是一个特殊字符)

我们还需要一个新的函数Sleep用来延时,因为计算机处理的很快,所以不延时就移动的太快了。(其实这个涉及到了一个概念–帧率

Sleep函数原型(<windows.h>):void Sleep(DWORD dwMilliseconds);
功能:将进程挂起一段时间
参数:

  • dwMilliseconds — 停止时间,单位为毫秒
#include <stdio.h>
#include <windows.h>void MyPrint(int x, int y)
{system("cls");for (int i = 0; i < y; ++i){printf("\n");}for (int i = 0; i < x; ++i){printf(" ");}printf("●");
}int main(void)
{int x = 4,		// 小球的x坐标 y = 5,		// 小球的y坐标speedX = 2,	// 小球x轴方向的速度speedY = 1;	// 小球y轴方向的速度while (1){// 小球移动 x += speedX;if (40 == x || 0 == x){speedX = -speedX;}y += speedY;if (19 == y || 0 == y){speedY = -speedY;}// 打印小球 MyPrint(x, y);Sleep(100);}
}

贪吃蛇

以前学习时候看的视频:C语言贪吃蛇(原来哔哩哔哩上有免费的,现在好像没了)
这视频看完还不会建议多看两遍,代码多写两遍。
视频学完之后就有个问题,虽然蛇闪烁减少了,但是时不时还在闪,贪吃蛇解决闪烁的方法。

音乐

游戏肯定是要背景音乐的,windows自带的:c/c++播放音乐(PlaySound、mciSendString、mciSendCommand)。

图形界面

easyx介绍

安装教程和基本介绍官网都有。

官网上的教学信息很多,推荐几个看一下:
精确延时的实现
通过直接操作显示缓冲区实现高速绘图和特殊效果(如逐渐变亮)
同时检测多个按键和平滑按键处理
学习保存应用程序的配置信息
正确处理鼠标和按键消息(解决反应迟钝或消息丢失的问题)
一步步拓展程序,实现文字在背景上的移动
为什么屏幕分辨率是 640x480?
详解透明贴图和三元光栅操作
对慢羊羊的半透明贴图函数进行改良
在程序中正确使用 Unicode 和 MBCS 字符集

游戏也推荐几个,这些都是比较简单的,不是说没推荐的就不好,
涂格子游戏(也叫点灯游戏)(by 豆腐果)
贪吃蛇游戏的双人对战版
推箱子游戏(by 自然向日葵)
别踩白块儿(双人版) VC 源代码
超级蘑菇2(模拟 FC 游戏:超级玛丽)(by 木子念念)

后续

如果你上面的内容搞完了,说明c语言肯定入门了,这边也不再说后续干嘛了,找个学习路线继续学吧。

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

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于nodejs电影交流网站设计与实现-计算机毕业设计源码+LW文档

摘 要 网络的广泛应用给生活带来了十分的便利。所以把电影交流管理与现在网络相结合&#xff0c;利用nodejs技术建设电影交流网站&#xff0c;实现电影交流的信息化。则对于进一步提高电影交流管理发展&#xff0c;丰富电影交流管理经验能起到不少的促进作用。 电影交流网站能…

论文研读1——对抗样本(Adversarial Example)综述

论文地址&#xff1a;Threat of Adversarial Attacks on Deep Learning in Computer Vision: A Survey 部分内容参考科研篇二&#xff1a;对抗样本&#xff08;Adversarial Example&#xff09;综述 一、主要内容 肯定了深度学习在计算机视觉等领域的贡献&#xff0c;但深度…

后端开发总结(2):go语言的知识点

go语言知识点1 append 列表2 如何打印指针结构体的值3 * 和 & 的用法1 append 列表 append() 切片需要增加 ... var a []inta append(a, 1) // 追加1个元素 a append(a, 1, 2, 3) // 追加多个元素 a append(a, []int{1,2,3}...) // 追加切片,2 如何打印指针结构体的值…

如何将程序打包成exe

我们经常需要将我们写的程序打包发给用户使用&#xff0c;很多时候为了方便会直接将文件夹或者压缩包发出去。这种方式对于一些不太懂电脑的用户来说的话&#xff0c;假如程序中有多个可执行文件&#xff0c;就会完全不知道怎么使用。众所周知&#xff0c;客户体验也是评判软件…

SpringBoot笔记:Hello World

SpringBoot简化了Spring应用的初始框架搭建和开发过程,利用SpringBoot框架可以快速的进行Spring应用的开发,SpringBoot具有以下特性:能够快速创建基于Spring的应用程序。 提供了约定好的初始POM来简化Maven配置,让Maven配置变得更简单。 多数情况可以直接使用注解开发来替代…

标准库类型string和vector

一、命名空间 std::cinstd就是命名空间&#xff0c; 这个的含义是 &#xff1a;编译器应该从操作符左侧的名字所示的作用域std中去寻找cin。 另一种方式就是在开头显式进行说明&#xff1a; using std::cin;这样一来后续就不用再去在每条语句中显式说明了。 需要注意的是&…

Java垃圾回收器

Java垃圾回收器1 GC分类与性能指标1.1 垃圾回收器概述1.2 垃圾回收器分类1.2.1 按照线程分1.2.2 按照工作模式分1.2.3 碎片处理方式分1.2.4 工作的内存区间分1.3 评估GC的性能指标1.4 吞吐量与暂停时间的对比说明1.4.1 吞吐量1.4.2 暂停时间1.4.3 高吞吐量 VS 暂停时间2 垃圾回…

非常实用的Visual Studio Code快捷键(2) 欢迎各位大侠补充

折叠或展开代码 代码须易于理解并且要记录在案。可以使用以下快捷键轻松折叠代码中次重要的部分&#xff1a; 按_Ctrl Shift [_ 进行折叠。按_Ctrl Shift ]_ 展开 导航到特定行 如果要转到包含数千行的文件中的所需行。只需执行以下操作&#xff1a; 按_Ctrl G_&#x…

wireshark测试tcp三次握手与四次挥手

wireshark 选择Loopback来监听本地网络。 监听的内容是分三大模块的&#xff1a; 封包列表的面板中显示&#xff0c;编号&#xff0c;时间戳&#xff0c;源地址&#xff0c;目标地址&#xff0c;协议&#xff0c;长度&#xff0c;以及封包信息。 你可以看到不同的协议用了…

网课搜题接口-掘光者题库系统

网课搜题接口-掘光者题库系统 本平台优点&#xff1a; 多题库查题、独立后台、响应速度快、全网平台可查、功能最全&#xff01; 1.想要给自己的公众号获得查题接口&#xff0c;只需要两步&#xff01; 2.题库&#xff1a; 题库&#xff1a;题库后台&#xff08;点击跳转&am…

Hive与SparkSQL语法差异

一、相同函数差异 1、Spark运行时用到的hash函数&#xff0c;与Hive的哈希算法不同&#xff0c;如果使用hash()&#xff0c;结果和Hive的hash()会有差异 2、Hive和SparkSQL使用grouping sets生成的GROUPING_ID不一致 3、regexp_extract未匹配上的话&#xff0c;在HIVE里返回…

Hive事务表 (Transactional Tables)

文章目录1. 为什么要使用事务表&#xff1f;2. 创建使用事务表1. 为什么要使用事务表&#xff1f; Hive 原本是不支持事务的&#xff0c;也就是不支持 增删改(insert、delete、update)、回滚等 操作的。因为&#xff1a; Hive的核心目标是&#xff1a;将已经存在的结构化数据文…

大学生影视主题网页制作 HTML+CSS+JS仿360影视网站 dreamweaver电影HTML网站制作

HTML实例网页代码, 本实例适合于初学HTML的同学。该实例里面有设置了css的样式设置&#xff0c;有div的样式格局&#xff0c;这个实例比较全面&#xff0c;有助于同学的学习,本文将介绍如何通过从头开始设计个人网站并将其转换为代码的过程来实践设计。 文章目录一、网页介绍一…

加密后的数据如何进行模糊查询

文章目录如何对加密后的数据进行模糊查询?方法1&#xff1a;先解密在查询方法2&#xff1a;在数据库实现加密算法函数第一种思路&#xff1a;在数据库实现加密算法函数第二种思路&#xff1a;对密文数据进行分词组合手机号模糊查询姓名模糊查询姓名精确查询&#xff08;地址也…

Mysql 事务原理分析

文章目录1、事务1.1、概念1.2、事务控制语句1.3、ACID 特性1.3.1、原子性 A1.3.2、一致性 C1.3.3、隔离性 I1.3.4、持久性 D1.4、undo log1.5、redo log2、隔离级别2.1、隔离级别的分类2.1.1、读未提交 RU2.1.2、读已提交 RC2.1.3、可重复读 RR2.1.4、可串行化 SC2.2、并发读异…

【Linux】UDP、TCP协议

目录 前言 1.UDP协议 1.1. UDP协议段格式 1.2. UDP的特点 1.3. UDP的缓冲区 2. TCP协议 2.1. TCP报文格式 2.2. TCP的确认应答机制 2.3. 流量控制 2.4. 标志位 2.4.1. ACK、SYN 2.4.2. RST(reset) 2.4.3. PSH(push) 2.4.4. URG 2.4.5. FIN 2.5. TCP三次握手 2.…

买阿里云服务器,实操搭建nginx+php+mysql+thinkphp5全过程(2)

书接上回(买阿里云服务器,实操搭建nginx+php+thinkphp5全过程(1)),我的阿里云服务器快要到期了,为了让它发光发热,实现最后的价值,我目标初始化服务器,重新实操搭建nginx+php+thinkphp5全过程。 反正也快过期了,知道IP也没关系了(但是我的淘宝名还是遮一下吧),上…

香港发布有关虚拟资产发展的政策宣言

本宣言由财经事务及库务局(“财库局” )发出&#xff0c;就在香港发展蓬勃的虚拟资产行业和生态圈&#xff0c;阐明政府的政策立场和方针。 愿景和方针 2. 香港是国际金融中心&#xff0c;对全球从事虚拟资产业务的创新人员抱持开放和兼融的态度。我们十分欣赏这些创新人员开展…

学原油期货买什么书(怎么样买原油期货)

想做好期货要看哪些书籍 炒期货要学习的入门知识太多&#xff0c;比如期货法规、期货基础、期货品种、交易规则等等。期货合约的商品品种、交易单位、合约月份、保证金、数量、质量、等级、交货时间、交货地点等条款都是既定的&#xff0c;是标准化的&#xff0c;唯一的变量是…

计算机毕设(附源码)JAVA-SSM计算机组成原理教学系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…