【原创】只学到二维数组和结构体,不用链表也能写一个C贪食蛇?(一)

先扯几句闲话

往往非科班出身的编程爱好者,以C作为入门语言时,往往会问:“我学了这个XX,能做些什么?”

其实,配合Google,基本上啥都能做了。

你甚至连链表都不需要,就可以写一个贪食蛇小游戏 :)

本系列将分4个部分,让任何一个仅仅会二维数组合结构体的初学者写出自己的贪食蛇

进入正题。我们先分析一下问题,确定下四个部分。

0、分析游戏的本质以及在控制台中的表现形式

1、分析贪食蛇游戏的基本结构

2、确定实现方案

3、全部源代码

一、游戏,或者视频游戏的本质是什么?

0、游戏的本质是程序

对于游戏而言,需要获取用户输入,并针对输入做出处理,然后反馈输出

简单的说,类似如下转换:

获取用户输入 ---> 根据用户输入处理各种数据 ---> 根据新数据绘出新的图像(输出)

虽然这一条有点像废话,但这对我们接下来分析贪食蛇的基本结构很有好处。

1、游戏的本质是帧和帧之间变化规则的集合

所谓帧,可以简单理解为(时刻,图片)的二元组,特定的帧有着相对于程序启动时而言确定的时刻以及图片。程序位于某个帧时,将根据当前帧所处时刻接受的用户的输入,来决定下一个单位时刻中,帧的图片内容。

举个例子,我们控制一个不动的人物前进了一格,这期间就发生了两个帧的转化:(时刻1,人物位于当前格的图像) --- > (时刻2,人物位于后一格的图像),而前述关系就可以理解为帧之间的变化规则。接受相应的操作、或者基于特定的条件,就会激活某个帧之间的变化规则,表现出来就是人物的移动、攻击以及得分等等。

2、游戏需要暂停来让用户感受到环境的变化

程序是很快的。

假设在一个游戏中,游戏人物走1步需要1次帧的转化,那么走10步,就需要10次帧的转化。但是,由于程序运行的速度很快,1次帧的转化和10次帧的转化,这之间的时间间隔普通人很难感受出来,跟人的感觉都是“嗖”的一声就过去了

因此,为了让用户能够感受出不同帧数之间的变化,我们需要【暂停】程序的运行。什么意思呢?也就是说,我们每完成一次帧的转换,我们就停止运行程序一段时间,等过了这段时间,再进行下一个帧转换。用伪代码表示一下:

while (1)

{

  game.getUserInput();

  game.drawPic();

  game.sleep(1000); // 单位是ms

}

(待续)

时间: 2024-10-11 10:44:42

【原创】只学到二维数组和结构体,不用链表也能写一个C贪食蛇?(一)的相关文章

C语言语法笔记 – 高级用法 指针数组 指针的指针 二维数组指针 结构体指针 链表 | IT宅.com

原文:C语言语法笔记 – 高级用法 指针数组 指针的指针 二维数组指针 结构体指针 链表 | IT宅.com C语言语法笔记 – 高级用法 指针数组 指针的指针 二维数组指针 结构体指针 链表 | IT宅.com C语言语法笔记 – 高级用法 指针数组 指针的指针 二维数组指针 结构体指针 链表 本文由 arthinking 发表于315 天前 ⁄ itzhai.com原创文章 ⁄ C语言 ⁄ 评论数 3 ⁄ 被围观 1,775 views+ 指针数组: 在一个数组中,如果它的元素全部都是指针类

C语言一维数组、二维数组、结构体的初始化

C语言数组的初始化表示方法 一.C语言一维数组初始化: (1)在定义数组时对数组元素赋以初值.如: static int a[10]={0,1,2,3,4,5,6,7,8,9}; 经过上面的定义和初始化后,a[0]=0,a[1]=1,… ,a[9]=9. (2)初始化时可以只对一部分元素赋初值.例如: static int a[10]={0,1,2,3,4}; 定义的数组有10个元素,但只对其中前5个元素赋了初值,后5个元素初值为0. (3)将数组的元素值全部为0,可以用下面的方法:(方法一)

c语言:将一个二维数组行和列的元素互换,存到另一个二维数组中。

将一个二维数组行和列的元素互换,存到另一个二维数组中. 解:程序: #include<stdio.h> int main() { int i, j, a[2][3] = { {1,2,3},{4,5,6} },b[3][2]; printf("array a:\n"); for (i = 0; i <=1; i++)//处理a数组中的一行中各元素 { for (j = 0; j <= 2; j++)//处理a数组中的某一列元素 { printf("%5

晓莲说-何不原创:java 实现二维数组冒泡排序

新手从业路-为自己回顾知识的同时,也希望和大家分享经验: 话不多说,上代码 public class 冒泡排序 { /**     * @param admin     * @2017.12.4     */    public static void main(String[] args) {       int[][] array=new int[10][3];    //新建一个二维数组              //对数组进行赋值(以日期为例)       array[0][0]=201

C提高4 多维数组,结构体与二级指针

昨天的试题:原题见昨天作业题 [email protected]:~/high/day03$ cat main.c  /* 二级指针,绝佳训练题1 */ #include <stdio.h> #include <stdlib.h> #include <string.h> int spitspring(char *buf1,char *c,char **myp,int *total) { char *p_head =  buf1; char *p_tail =  buf1

Js中,刚学完二维数组和函数,输出杨辉三角

var a= Array(5);for ( var i= 0;i<a.length;i++){ a[i]=Array(i+1); a[i][0]=1; for(var j=0;j<a[i].length;j++) { if(i==j) { a[i][j]=1 } else{ if((i-1)>=0&&(j-1)>=0) { a[i][j]=a[i-1][j-1]+a[i-1][j];} } } }; for(var i in a){ for(var j in a[i

C语言学习笔记:18_数组-二维数组

/* * 18_数组-二维数组.c * * Created on: 2015年7月6日 * Author: zhong */ #include <stdio.h> #include <stdlib.h> /** * 二维数组: * 为什么要用二维数组呢; * 例如: 网络班有2个班,每班有5人. * 要想存储一班的学生的年龄 定义一个一维数组搞定 int ages[5]={18,19,20,18,19}; * 然后将两个班中的所有年龄分开存入一个数组中 int classes[2]

vector动态二维数组(容器的容器)占用内存分析

之前在这里写过一篇"C++中的动态二维数组".在C++中没有动态二维(多维)数组.但是根据原理我们可以自己创建. 在看过STL的vector源代码后"<STL源码剖析>---stl_vector.h阅读笔记"后,想到可以用容器的容器来做二维数组. 创建一个2x4的二维数组.想到的办法是:先创建一个容器的容器,外层大小的2(2行),然后里面容器小大为4(4列). int row=2,col=4; vector<vector<int> &g

【Java学习笔记之八】java二维数组及其多维数组的内存应用拓展延伸

多维数组声明 数据类型[][] 数组名称; 数据类型[] 数组名称[]; 数据类型数组名称[][]; 以上三种语法在声明二维数组时的功能是等价的.同理,声明三维数组时需要三对中括号,中括号的位置可以在数据类型的后面,也可以在数组名称的后面,其它的依次类推. 例如: int[][] map; char c[][]; 和一维数组一样,数组声明以后在内存中没有分配具体的存储空间,也没有设定数组的长度.  -------------------------------------------------