算法参照Perl字符贪吃蛇,源码:

#include <stdio.h>
#include <windows.h>
#define WIDTH 12 // 宽
#define HEIGHT 8 // 高
#define DEBUG 0
const char FENCE ='*'; // 栅栏
const char HEAD ='@'; // 蛇头
const char BODY ='#'; // 蛇身
const char FOOD ='O'; // 食物
const char BLANK =' '; // 空白
char arr[HEIGHT][WIDTH];
struct Snake{
int y,x;
}snake[WIDTH*HEIGHT]; // 结构体,保存坐标点
int len=,food=,key=,score=,alive=,direct=,speed=,full=(WIDTH-)*(HEIGHT-); // 长度、食物、按键、总分、存活、方向、速度
int uldr[][]={{},{-,},{,-},{,},{,}}; // 上、左、下、右 void init(){ // 初始化游戏地图
int y=,x=,start_pos=HEIGHT/;
for(y=;y<HEIGHT;y++)
for(x=;x<WIDTH;x++)
if( y == || y == HEIGHT- || x == || x == WIDTH- ){
arr[y][x] = FENCE;
}
else{
arr[y][x] = BLANK;
}
snake[].y=start_pos;
snake[].x=;
len++;
snake[].y=start_pos;
snake[].x=;
len++;
arr[ snake[].y ][ snake[].x ] = HEAD ;
arr[ snake[].y ][ snake[].x ] = BODY ;
} void show(){
int y,x;
if(!DEBUG)system("cls");
printf("your score:%d\n",score);
printf("current speed:%d\n",speed);
for(y= ; y<HEIGHT ; y++ ){
for(x= ; x<WIDTH ; x++ )
printf("%c",arr[y][x]);
printf("\n");
}
} void make_food(){
int rx,ry;
while(!food){
rx = rand()%WIDTH;
ry = rand()%HEIGHT;
if( arr[ry][rx] == BLANK ){
arr[ry][rx]=FOOD;
food=;
break;
}
}
} void move(){
int cnt=;
if( kbhit()!= ){
while( kbhit() != )key=getch();
switch(key){
case 'w' : direct=(direct == )?:;break;
case 'a' : direct=(direct == )?:;break;
case 's' : direct=(direct == )?:;break;
case 'd' : direct=(direct == )?:;break;
default : direct;
} // 禁止反向移动
}
len++; // 准备将当前位置放在snake数组首部
if(DEBUG)printf("len:%d\n",len);
for(cnt=len-;cnt>;cnt--){
snake[cnt].x=snake[cnt-].x;
snake[cnt].y=snake[cnt-].y; // 1234 变为 51234
}
snake[].y+=uldr[direct][];
snake[].x+=uldr[direct][]; // 移动蛇头
} void check_head(){
int y=snake[].y;
int x=snake[].x;
int i=;
int cnt=;
if(y < || y > HEIGHT- || x < || x > WIDTH-){ // 是否越界
alive=;
}
if( arr[y][x] == BODY ){ // 是否吃到自己
alive=;
}
if( arr[y][x] == BLANK){
arr[y][x] = HEAD;
}
if( arr[y][x] == FOOD ){ // 吃到食物
arr[y][x] = HEAD;
score++;
len++;
food=;
snake[len-].y=snake[len-].y; // 蛇尾增加一节蛇身
snake[len-].x=snake[len-].x;
make_food();
}
if(DEBUG)printf("len:%d\n",len);
if(DEBUG){
for(;i<len;i++){
printf("y,x:(%d,%d)\n",snake[i].y,snake[i].x);
}
}
arr[ snake[len-].y ][ snake[len-].x ]=BLANK; // 先清除蛇尾显示
len--;
for(cnt=;cnt<=len-;cnt++){
arr[ snake[cnt].y ][ snake[cnt].x ]=BODY; // 蛇身显示
}
} void main(){
init();
make_food();
while(alive && len<full){
move();
check_head();
speed=(speed > )?:(score/+);
if(alive){
show();
Sleep(-speed*); // 多久刷新一次
}
}
if( len == full){
printf("congratulations!\n");
}
else{
printf("you lose\n");
}
}

C字符贪吃蛇的更多相关文章

  1. Perl字符贪吃蛇

    一时兴起,想试试能不能用perl实现字符贪吃蛇,算法如下: 定义2个数组@bg.@snake,@bg用来显示整个界面,@snake从蛇头开始保存蛇的坐标点. 蛇每移动一次,新的坐标点放到@snake头 ...

  2. Perl看完这个,再不敢说自己会玩贪吃蛇

    某天闲逛时看见一副动图: 真的是非常贪吃,各种拐弯各种吃,感觉十分有趣. 用Perl来实现自动吃满,蓄谋已久,之前的字符贪吃蛇.深度优先算法.A*算法,都是为此篇做铺垫. 那么,怎样让蛇不吃到自己呢? ...

  3. 字符界面的贪吃蛇--链表--C++

    前天看了下链表,由于平时对链表的使用不多,所以对链表的应用也没什么了解,所以想来想去,就想用链表实现一下贪吃蛇. 下面言归正传,先看效果图,再看代码,其他没有了! 图1: 图2: 代码: #inclu ...

  4. 基于AT89C51单片机的贪吃蛇电子游戏(仿真)

    有关贪吃蛇的历史发展可以看一下这个网址,贪吃蛇最初的设计和现在并不相同..http://www.techweb.com.cn/internet/2013-02-21/1278055.shtml 该项目 ...

  5. C语言之贪吃蛇

    利用链表的贪吃蛇,感觉自己写的时候还是有很多东西不熟悉, 1.预编译 2.很多关于系统的头文件也不是很熟悉 3.关于内存 第一个是.h头文件 #ifndef _SNAKE_H_H_H #define ...

  6. 【BZOJ-4213】贪吃蛇 有上下界的费用流

    4213: 贪吃蛇 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 58  Solved: 24[Submit][Status][Discuss] Desc ...

  7. 小项目特供 贪吃蛇游戏(基于C语言)

    C语言写贪吃蛇本来是打算去年暑假写的,结果因为ACM集训给耽搁了,因此借寒假的两天功夫写了这个贪吃蛇小项目,顺带把C语言重温了一次. 是发表博客的前一天开始写的,一共写了三个版本,第一天写了第一版,第 ...

  8. 多线程的Python 教程--“贪吃蛇”

    本指南的里代码可以在这里下载:  threadworms.py ,或者从  GitHub.代码需要  Python 3 或 Python 2 ,同时也需要安装  Pygame . 点击查看大版本图片 ...

  9. [010]转+修正---C++的贪吃蛇程序(未用面向对象封装)

    在网上看到一段贪吃蛇程序,自己心痒下了下来又稍微做了一点修改. 没有用面向对象的方式来进行封装,下次准备试试. 需要在windows环境下进行编译 #include<iostream> # ...

随机推荐

  1. SuperTab

    Tab快捷键提示功能 下载 http://www.vim.org/scripts/script.php?script_id=1643 安装 # vi supertab.vmb : UseVimball ...

  2. [LeetCode] 25. K 个一组翻转链表 ☆☆☆☆☆(链表)

    https://leetcode-cn.com/problems/reverse-nodes-in-k-group/solution/javadi-gui-fang-fa-100-by-chadriy ...

  3. js sort() 排序用法(转载)

    原文:https://blog.csdn.net/m0_37885651/article/details/80016718 sort() 方法用于对数组的元素进行排序,并返回数组.默认排序顺序是根据字 ...

  4. fetch() without execute() [for Statement "SHOW VARIABLES LIKE 'wsrep_on'

    增加栏位: pt-online-schema-change --user=root --password=a099e0  --alter "ADD COLUMN  IS_MOBILE INT ...

  5. Python基础Day1—上

    一.计算机基础 CPU:中央处理器,相当于人的大脑:运算中心与控制中心的结合. 内存:临时存储数据,与CPU交互. 硬盘:永久存储数据. 内存的优点:读取速度快 内存的缺点:容量小,造价高,断电数据会 ...

  6. ajax使用案例

    1.初步了解 这里可以修改网络快和慢.限网,流量式的,做模拟的. network->all代表加载的所有事件 后面的那个显示有/,这个是首路由.后面有很多svg和js等文件 想要这个服务器的地址 ...

  7. Django解析器

    1.什么是解析器? 对请求的数据进行解析-请求体进行解析.解析器在你不拿请求体数据时,不会被调用. 安装与使用:(官方文档) https://www.django-rest-framework.org ...

  8. 《奋斗吧!菜鸟》 第九次作业:Beta冲刺 Scrum meeting 2

    项目 内容 这个作业属于哪个课程 任课教师链接 作业要求 https://www.cnblogs.com/nwnu-daizh/p/11056511.html 团队名称 奋斗吧!菜鸟 作业学习目标 掌 ...

  9. Net线程间通信的异步机制

    线程间通信 我们看下面的图 我们来看线程间通信的原理:线程(Thread B)和线程(Thread A)通信, 首先线程A 必须实现同步上下文对象(Synchronization Context), ...

  10. c#基础用法

    1.注释符 1)注销 2)解释 2.3种方式 1)单行注释 // 2)多行注释 /*要注释的内容*/ 3)文档注释 /// 多用来解释类或方法 3.数据类型 1)值类型 2)引用类型 1.对象 obj ...