简单的c语言程序代码大全(零基础学编程相关知识)

序言 很多学习了C语言的小伙伴,虽然说学完了C语言入门,但是实际能力还是停留在一个很低的水平,基本上就是套几个for循环,暴力解一下排列组合问题的水平,很多人基本上不能够独立写一个小程序,今天就给大家我很久以前做的一个简单的贪吃蛇案例。 这次的编写控制台贪吃蛇程序对学完C语言没做过项目的小伙伴来说可能是一个不小的挑战。 本文的贪吃蛇案例用的东西也并不是很多,游戏的实现主要是对一个二维数组按一定逻辑…

序言

很多学习了C语言的小伙伴,虽然说学完了C语言入门,但是实际能力还是停留在一个很低的水平,基本上就是套几个for循环,暴力解一下排列组合问题的水平,很多人基本上不能够独立写一个小程序,今天就给大家我很久以前做的一个简单的贪吃蛇案例。

这次的编写控制台贪吃蛇程序对学完C语言没做过项目的小伙伴来说可能是一个不小的挑战。

C/C++编程入门基础项目:C语言控制台版本,贪吃蛇源代码示例

本文的贪吃蛇案例用的东西也并不是很多,游戏的实现主要是对一个二维数组按一定逻辑进行修改、变换(实际操作时,为了减少闪烁,我用的是字符串)。这里不对编写过程进行赘述,主要说一下最基本功能的逻辑、和一些之前较少用的函数等。

一、 基本功能逻辑

1、游戏的背景、打印

定义一个二维字符串,用“”和空格表示边界、蛇身、空白等。打印是用for循环遍历整个字符串,并以一定频率刷新,就可以达到游戏效果。

2、建立蛇数组

考虑到没用链表做过东西,不太熟练,我采用了数组来做蛇。数组主要有容量有限,最长长度需要先定义(只要我定的足够长hhhh),以及很多地方需要取地址(N次打掉了”&“)等缺点。数组存储蛇的节数、XY坐标、移动方向等参数。主要需要注意“”占两个字节,在写坐标时很多地方要乘二。

3、生成蛇的随机坐标

首先种随机种子,采用系统时间做种子。定义x、y两个变量作为坐标值,用rand()函数搭配取余来获得想要的坐标值范围。然后初始生成两三节就可以了。

4、把蛇画到地图上

建立for循环遍历整条蛇,利用strncpy()函数将空白部分复制为“”就行了。

5、蛇的运动

这里卡了比较久,期间去玩了玩贪吃蛇,发现蛇的运动方式不是很复杂,可以说就是蛇尾去一个,蛇头加一个。我采用了整个蛇身向前移,蛇头单独处理的方法,这样也便于以后控制方向。

6、擦除运动轨迹

写到上一步运行会发现蛇越来越长。。。。就像死机了以后的鼠标光标一样。。。。是因为虽然前一节点的属性赋给了后一个节点,但是这个节点并没有变。所以在每次运动前把之前的蛇擦掉,方法同第四步,只是把“”换成两个空格。

7、蛇改变方向

由于蛇运动方式的特殊性,只需要对蛇头处理。用GetAsyncKeyState()函数读取键盘输入,并需要注意通过附加条件防止蛇掉头。

8、生成食物

随机坐标、复制、打印。

9、蛇吃食物长长

蛇运动到食物的地方会把食物覆盖掉,所以吃掉食物的效果不用写。只用判断蛇头坐标和食物坐标重合,然后判断运动方向来确定在哪里加一节就行了。然后用一个布尔值判断场上是否还有食物,来生成新的食物。计分也可以在此处写。C/C++编程入门基础项目:C语言控制台版本,贪吃蛇源代码示例

网络效果图

代码如下:

#define _CRT_SECURE_NO_WARNINGS 1#include <stdio.h>#include <stdlib.h>#include <math.h>#include <conio.h>#include <time.h>#include <windows.h>#define MAXWIDTH 30#define MAXHEIGHT 30#define INITLEN 3 //贪吃蛇的初始长度 struct{

char *ch; int color; char type;

}

charBorder = { “”, 4, 1 }, //边框charBg = { “”, 2, 2 }, //背景charSnake = { “”, 0xe, 3 }, //贪吃蛇节点charFood = { “”, 0xc, 4 }; //食物//用一个结构体数组保存地图中的各个点struct{

char type; int index;

}globalMap[MAXWIDTH][MAXHEIGHT];struct{

int x; int y;

} snakeMap[(MAXWIDTH – 2)*(MAXHEIGHT – 2)], scoresPostion;int scores = 0; //得分int snakeMapLen = (MAXWIDTH – 2)*(MAXHEIGHT – 2);int headerIndex, tailIndex;

HANDLE hStdin;

// 设置光标位置,x为行,y为列void setPosition(int x, int y){

COORD coord;

coord.X = 2 * y;

coord.Y = x;

SetConsoleCursorPosition(hStdin, coord);

}// 设置颜色void setColor(int color){

SetConsoleTextAttribute(hStdin, color);

}//创建食物void createFood(){ int index, rang, x, y;

srand((unsigned)time(NULL)); if (tailIndex<headerIndex){

rang = headerIndex – tailIndex – 1;

index = rand() % rang + tailIndex + 1;

} else{

rang = snakeMapLen – (tailIndex – headerIndex + 1);

index = rand() % rang; if (index >= headerIndex){

index += (tailIndex – headerIndex + 1);

}

}

x = snakeMap[index].x;

y = snakeMap[index].y;

setPosition(x, y);

setColor(charFood.color); printf(“%s”, charFood.ch);

globalMap[x][y].type = charFood.type;

}//死了void die(){ int xCenter = MAXHEIGHT % 2 == 0 ? MAXHEIGHT / 2 : MAXHEIGHT / 2 + 1; int yCenter = MAXWIDTH % 2 == 0 ? MAXWIDTH / 2 : MAXWIDTH / 2 + 1;

setPosition(xCenter, yCenter – 5);

setColor(0xC); exit(1);

_getch(); exit(0);

}// 蛇移动void move(char direction){ int newHeaderX, newHeaderY; //新蛇头的坐标

int newHeaderPreIndex; //新蛇头坐标以前对应的索引

int newHeaderPreX, newHeaderPreY; //新蛇头的索引以前对应的坐标

int newHeaderPreType; //新蛇头以前的类型

int oldTailX, oldTailY; //老蛇尾坐标

switch (direction){ case ‘w’:

newHeaderX = snakeMap[headerIndex].x – 1;

newHeaderY = snakeMap[headerIndex].y; break; case ‘s’:

newHeaderX = snakeMap[headerIndex].x + 1;

newHeaderY = snakeMap[headerIndex].y; break; case ‘a’:

newHeaderX = snakeMap[headerIndex].x;

newHeaderY = snakeMap[headerIndex].y – 1; break; case ‘d’:

newHeaderX = snakeMap[headerIndex].x;

newHeaderY = snakeMap[headerIndex].y + 1; break;

}

headerIndex = headerIndex == 0 ? snakeMapLen – 1 : headerIndex – 1;

newHeaderPreIndex = globalMap[newHeaderX][newHeaderY].index;

newHeaderPreX = snakeMap[headerIndex].x;

newHeaderPreY = snakeMap[headerIndex].y;

snakeMap[headerIndex].x = newHeaderX;

snakeMap[headerIndex].y = newHeaderY;

globalMap[newHeaderX][newHeaderY].index = headerIndex;

snakeMap[newHeaderPreIndex].x = newHeaderPreX;

snakeMap[newHeaderPreIndex].y = newHeaderPreY;

globalMap[newHeaderPreX][newHeaderPreY].index = newHeaderPreIndex; //新蛇头以前的类型

newHeaderPreType = globalMap[newHeaderX][newHeaderY].type; //设置新蛇头类型

globalMap[newHeaderX][newHeaderY].type = charSnake.type; // 判断是否出界或撞到自己

if (newHeaderPreType == charBorder.type || newHeaderPreType == charSnake.type){

die();

} //输出新蛇头

setPosition(newHeaderX, newHeaderY);

setColor(charSnake.color); printf(“%s”, charSnake.ch); //判断是否吃到食物

if (newHeaderPreType == charFood.type){ //吃到食物

createFood(); //更改分数

setPosition(scoresPostion.x, scoresPostion.y); printf(“%d”, ++scores);

} else{ //老蛇尾坐标

oldTailX = snakeMap[tailIndex].x;

oldTailY = snakeMap[tailIndex].y; //删除蛇尾

setPosition(oldTailX, oldTailY);

setColor(charBg.color); printf(“%s”, charBg.ch);

globalMap[oldTailX][oldTailY].type = charBg.type;

tailIndex = (tailIndex == 0) ? snakeMapLen – 1 : tailIndex – 1;

}

}//下次移动的方向char nextDirection(char ch, char directionOld){ int sum = ch + directionOld;

ch = tolower(ch); if ((ch == ‘w’ || ch == ‘a’ || ch == ‘s’ || ch == ‘d’) && sum != 197 && sum != 234){ return ch;

} else{ return directionOld;

}

}//暂停char pause(){ return _getch();

}// 初始化void init(){ // 设置相关变量

int x, y, index; int xCenter = MAXHEIGHT % 2 == 0 ? MAXHEIGHT / 2 : MAXHEIGHT / 2 + 1; int yCenter = MAXWIDTH % 2 == 0 ? MAXWIDTH / 2 : MAXWIDTH / 2 + 1;

CONSOLE_CURSOR_INFO cci; //控制台光标信息

//判断相关设置是否合理

if (MAXWIDTH<16){ printf(“‘MAXWIDTH’ is too small!”);

_getch(); exit(0);

} //设置窗口大小

system(“mode con: cols=96 lines=32”); //隐藏光标

hStdin = GetStdHandle(STD_OUTPUT_HANDLE);

GetConsoleCursorInfo(hStdin, &cci);

cci.bVisible = 0;

SetConsoleCursorInfo(hStdin, &cci); //打印背景

for (x = 0; x<MAXHEIGHT; x++){ for (y = 0; y<MAXWIDTH; y++){ if (y == 0 || y == MAXWIDTH – 1 || x == 0 || x == MAXHEIGHT – 1){

globalMap[x][y].type = charBorder.type;

setColor(charBorder.color); printf(“%s”, charBorder.ch);

} else{

index = (x – 1)*(MAXWIDTH – 2) + (y – 1);

snakeMap[index].x = x;

snakeMap[index].y = y;

globalMap[x][y].type = charBg.type;

globalMap[x][y].index = index;

setColor(charBg.color); printf(“%s”, charBg.ch);

}

} printf(“n”);

} //初始化贪吃蛇

globalMap[xCenter][yCenter – 1].type = globalMap[xCenter][yCenter].type = globalMap[xCenter][yCenter + 1].type = charSnake.type;

headerIndex = (xCenter – 1)*(MAXWIDTH – 2) + (yCenter – 1) – 1;

tailIndex = headerIndex + 2;

setPosition(xCenter, yCenter – 1);

setColor(charSnake.color); for (y = yCenter – 1; y <= yCenter + 1; y++){ printf(“%s”, charSnake.ch);

} //生成食物

createFood(); //设置程序信息

setPosition(xCenter – 1, MAXWIDTH + 2); printf(” 得分 : 0″);

setPosition(xCenter, MAXWIDTH + 2); printf(” 姓名班级 :33班杨超”);

scoresPostion.x = xCenter – 1;

scoresPostion.y = MAXWIDTH + 8;

}int main(){ char charInput, direction = ‘a’;

init();

charInput = tolower(_getch());

direction = nextDirection(charInput, direction); while (1){ if (_kbhit()){

charInput = tolower(_getch()); if (charInput == ‘ ‘){

charInput = pause();

}

direction = nextDirection(charInput, direction);

}

move(direction);

Sleep(500);

}

_getch(); return 0;

}

希望对大家有帮助~

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

(0)
上一篇 2022年5月11日 下午1:54
下一篇 2022年5月11日 下午1:54

相关推荐

  • 冰棍品牌有哪些(中国冰棍品牌排行榜)

    夏天这个如同恶魔般刁蛮的季节,在这个盛夏的季节你是不是经常感觉热的让人烦闷,在这个闷热的季节即使有空调你是不是也感到乏软无力,整个人被炎热的天气拷打的没有什么生活激情。在这样的生活状态下,需要来点什么来调节生活呢?如果你有相同的感觉现在来一根冰棍是不是觉得心情很好呢,这里小编为大家整理了一份夏日大礼包哟,赶紧来查收吧! 1、吖咪吖咪手工冰棍 吖咪手工冰棍拥有两大优势,其中之一就是它的工艺非常的精湛…

    2022年10月19日
    480
  • 内账表格范本,最全内账表格范本分析干货

    关于企业内部账务处理流程、会计可以不做、但不能不会,今天给大家分享8套财务管理表格、教你合法合规处理内部账务! 话不多说、我们直接上干货! 先来看比较常规的1套——企业内部账务管理系统 主要包括企业日常运营情况、挂靠情况、成本费用以及往来账款明细核算 公司运营情况表: 所有栏次行里有公式的在本月数和本年累计数中都有计算公式会自动计算,不可轻易删除或清除! 挂靠情况表: 关于销售额对应的税费均附带公…

    2022年9月6日
    400
  • fgo入门攻略,fgo新手前期要怎么玩

    从者选择搭配 有了一个比较好的初始号除了那些比较强的金卡,还有那些从者值得去提高练度呢? 一般来说,我们推荐除了尺子复仇的每一种阶职都练一个单体和一个光炮。那么我们就一个阶职一个阶职来说。 剑阶:光炮的话我推荐去练金卡,即使是sw送的lily,没有的话可以选择练一个小刚。 单体有总司自然必须练,没有的话可以选择凯撒也可以不练等后面出的剑兰。 枪阶:光炮,有黑枪呆肯定练。黑枪呆是枪阶光炮天花板,比白…

    2022年8月14日
    770
  • 移动广告推广形式,史上最全面的移动广告形式分类

    移动广告从用户被动接受信息的PUSH时代发展到用户主动订阅咨询的PULL时代,再到如今运用大数据定向推送、个性化推荐的双向交互时代,移动广告形式一路变化之多,今天小编为大家整理了目前常见的移动广告形式。 移动广告按照不同维度可以分成不同类别,目前中国市场移动广告较常见的也就5大类:普通静态展示广告(Banner/ Highimpact /视频广告、视频贴片),原生/信息流广告,激励/深度激励广告,…

    2022年9月11日
    690
  • seo网站推广的主要目的是什么,关键词整站快速排名技巧分享

    互联网的市场上许多企业开始通过各个平台进行推广宣传自己的产品,但是能够做好推广宣传的任务,seo优化也是很重要的基础,优化是能够将网站不断提升上去的方式,也是为了能够让客户直接看到相关资讯,因此企业网站优化是一件很重要的事情。 关键词布局 关键词布局对网站优化起着很重要的作用,一个网站希望能够通过排名获得流量就需要优化作为铺垫,同时也影响这排名和权重,但是布局也很讲究方式,先通过查询指数,指数较高…

    2022年8月2日
    590
  • tv浏览器哪个好,电视上最好用的浏览器排行推荐

    智能电视除了能连网看直播点播玩游戏外,还能浏览网页,有些在视频软件中看不了的资源,可以进入网页搜索来收看。目前在当贝市场中人气较高的TV浏览器有电视家浏览器与UC浏览器,那么这两款软件究竟哪款最好用,体验最好呢?当贝市场小编整理了两款软件全面对比解析,供大家参考哦。 两款软件均可在当贝市场中搜索下载,例输入DSJLLQ,就可以找到电视家浏览器应用。另外当贝市场还有提供电视端直播点播游戏学习工具等软…

    2022年7月6日
    3.7K0
  • 股权变更办理流程介绍,公司股权变更要去哪里办理

    股权,是有限责任公司或者股份有限公司的股东对公司享有的人身和财产权益的一种综合性权利。即股权是股东基于其股东资格享有的,从公司获得经济利益,并参与公司经营管理的权利。 股权转让,是公司股东依法讲自己的股东权益有偿转让给其他人,使他人取得股权的民事法律行为。 有的公司在成立之初由几位志同道合的朋友一起创立,然而在运营发展的过程中,可能会因为理念不一致,有的股东退出公司经营。也有的公司起初是个人独资的…

    2022年7月24日
    580
  • 什么是反链,外链和反链区别介绍

    一、什么是反链、外链、友链?反链,即指反向链接。在SEO优化过程中,它是相对于两个网页来讲的,打个比方,对于网页D来讲,如果某个网页C给网页D做了链接,无论是同一个站还是不同的站,网页C上的这个链接,对于网页D来讲,它都是反链。   外链,SEO优化推广中,经常谈及外链的概念,外链即指外部链接到我们网站的链接。对于一个网站来讲,尤其是新建的网站,外链接入得越多,也就有了越多的入口,蜘蛛越容易爬进我…

    2022年7月3日
    520
  • 低成本创业项目有哪些,低成本高利润的8个项目推荐

    一:早餐店 一日之计在于晨,所以一顿美味安康有营养的早餐至关重要,早餐店是创业理想项目之一,由于早餐店与休闲饮品店具有本低利丰、回收快的优势,均匀投资本钱在2万-10万元,均匀净利25%-35%,平均5-8个月回本,因而是当代人创业的首选。 二:鲜花店 鲜花店具有以下几种特点: 一:投资小,在市场上租一个店铺,维持正常的进出货,初期投入三四万元即可; 二:周转快,鲜花周转期短,勤进快出,非常灵敏;…

    2022年7月15日
    650
  • 电脑投屏电视软件哪个好(投屏软件下载推荐)

    ▍前言 由于工作的需要,很多时候都需要使用到电脑和手机之间的投屏软件,市面上这样的软件也非常多,好用的也不少,不过大多数软件都是需要电脑和手机上同时安装软件才可以进行连接,并且每次操作的时候都需要双端打开软件进行扫码或者有线连接,总感觉还是比较麻烦。 今天阿雷发现一款只需在电脑端安装,并且同时支持无线和有线连接的投屏软件,亲测无延迟,非常好用。 ▍软件简介 软件名称:AnLink安联 支持设备:W…

    2022年5月6日
    1030

发表回复

登录后才能评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信