80行C代码实现ncurses版贪吃蛇!
时间:2022-07-22
本文章向大家介绍80行C代码实现ncurses版贪吃蛇!,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
事情是这样的,周末我在家打开电脑排查现网问题,安德森先生对这个电脑非常感兴趣,凑过来非要看看,我给他演示了sl小火车。小小和疯子也都在旁边看着。
我说这个sl小火车是一个现成的程序,然后就被小小和疯子鄙视了,她们以为这个小火车是我自己做的…搞了半天是下载的现成的东西…
我觉得我得自己做点可以玩的小东西,哪怕再简单的,只要看起来像回事就行,以挽回面子。
还是贪吃蛇最简单,这个东西以前我写过不止一版了: https://blog.csdn.net/dog250/article/details/5303351 https://blog.csdn.net/dog250/article/details/6787135 https://blog.csdn.net/dog250/article/details/6819996
不过代码都挺长的。这次我想来个简约风格的朴素版本,这次我用ncurses来实现,代码如下:
#include <ncurses.h>
#include <stdlib.h>
#include <string.h>
#define LINES 30
#define COLS 60
int start_x = 10, start_y = 10;
int main(int argc,char* argv[])
{
int i, j, c, head_x, head_y, tail_x, tail_y, fx, fy;
// 四个方向矩阵
char dir[4][2] = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}};
int head_dir_index = 3, tail_dir_index = 3;
char pad[LINES][COLS];
initscr();
noecho();
keypad(stdscr, 1);
nodelay(stdscr, 1);
curs_set(0);
memset(pad, 0, sizeof(pad));
pad[start_y][start_x] = 1;
head_x = tail_x = start_x;
head_y = tail_y = start_y;
srand(time(NULL));
for (i = 0; i < LINES; i ++) {
pad[i][0] = 1;
pad[i][COLS - 1] = 1;
}
for (i = 0; i < COLS; i ++) {
pad[0][i] = 1;
pad[LINES - 1][i] = 1;
}
while (1) { // 外层循环表示一次吞食
fx = rand()%COLS;
fy = rand()%LINES;
if (pad[fy][fx] == 1)
continue;
pad[fy][fx] = 2;
while (c = getch()) { // 内层循环描绘吞食的过程
// 获取蛇头的方向
if (c == KEY_UP)
head_dir_index = 0;
else if (c == KEY_DOWN)
head_dir_index = 1;
else if (c == KEY_LEFT)
head_dir_index = 2;
else if (c == KEY_RIGHT)
head_dir_index = 3;
// 计算蛇头的位置
head_y += dir[head_dir_index][0];
head_x += dir[head_dir_index][1];
if (head_y >= LINES - 1 || head_x >= COLS - 1 || head_x <= 0 || head_y <= 0 ||
pad[head_y][head_x] == 1) {
mvprintw(LINES/2, (COLS - 9)/2, "game over");
refresh();
sleep(2);
endwin();
exit(1);
}
// 吃到了食物
if (pad[head_y][head_x] == 2) {
pad[head_y][head_x] = 1;
break;
}
pad[head_y][head_x] = 1; // 蛇头前进
pad[tail_y][tail_x] = 0; // 蛇尾锁进
// 获取蛇尾的方向
if (tail_y - 1 > 0 && pad[tail_y - 1][tail_x] == 1)
tail_dir_index = 0;
else if (tail_y + 1 < LINES - 1 && pad[tail_y + 1][tail_x] == 1)
tail_dir_index = 1;
else if (tail_x - 1 > 0 && pad[tail_y][tail_x - 1] == 1)
tail_dir_index = 2;
else if (tail_x + 1 < COLS -1 && pad[tail_y][tail_x + 1] == 1)
tail_dir_index = 3;
// 计算蛇尾的位置
tail_y += dir[tail_dir_index][0];
tail_x += dir[tail_dir_index][1];
// 绘制整蛇
for (i = 0; i < LINES; i ++)
for (j = 0; j < COLS; j ++)
mvprintw(i, j, pad[i][j]?"#":" ");
refresh();
usleep(200000);
}
}
return 0;
}
代码在:https://github.com/marywangran/GluttonousSnake
我喜欢这个风格,因为它只需要gcc和libncurses就能编译和执行,完全不依赖任何GUI:
[root@localhost test]# gcc test.c -lncurses
效果如下:
代码思路很简单,就是 把蛇尾拿开拼到蛇头前面 以模拟蛇移动,那么问题就剩下两个:
- 如何知道蛇尾在哪里?
- 如何知道蛇头在哪里?
于是我维护了两个方向:
- 蛇头方向:取决于上一次按下的方向键。
- 蛇尾方向:取决于蛇的连接矩阵。
非常简单的思路,没有链表,没有对象,什么都没有,简约,而且非常经理。
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/dog250/article/details/107620992
- 解决win10 关键错误开始菜单和cortana无法工作 的问题(转-真的成功了)
- “AS3.0高级动画编程”学习:第二章转向行为(下)
- windows系统中eclipse C开发环境的架设
- 5个酷毙的Python工具
- ”盒模型“之如何防止边框和内边距把元素撑开
- excel中的不同类型图表叠加
- 这几天遇到的关于IE6/sql2008/win2003的奇怪bug
- 基于Web的工作流管理系统的设计与实现
- 这是对position讲解最通俗易懂的版本了。
- 你到底该如何看待比特币?
- OpenApplus小程序容器
- 点名了,最具投资价值的50家物联网企业名单发布
- 数据结构C#版笔记--树与二叉树
- Java8新特性第3章
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Unity3D网络通讯(三)-- HttpRestful请求的简单封装
- 详解Elasticsearch 的性能优化
- console.log的那件事
- Codeforces Round #668 (Div. 2)A-D
- nodejs源码解析之udp服务器
- LeetCode | 35.搜索插入位置
- Redis | 源码阅读 —— 字符串
- 一个小白的角度看JavaScript Promise 完整指南
- 教会舍友玩 Git (再也不用担心他的学习)
- Python极简入门:数据类型、条件语句、循环语句、异常处理
- 手把手带你入门Python爬虫Scrapy
- 工作中巧用了这几个设计模式重构代码,女同事直呼666
- SourceMap知多少:介绍与实践
- (实战)Node.js 实现抢票小工具&短信通知提醒
- 目标检测 | Anchor free之CenterNet深度解析