算法参照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. 字符串导出xml文件并弹出下载对话框

    转自:https://blog.csdn.net/zhandingfeng/article/details/53887354 导出单个xml文件:[java] view plain copy      ...

  2. 阿里云服务器远程连接错误:由于一个协议错误(代码:0x112f),远程会话将被中断。

    2019年10月,阿里云服务器远程连接忽然无法登录.当时正在清理c盘空间,C盘只剩下30+M,忽然远程桌面掉线,以为断网了,再次远程桌面连接时,就出现一下错误. 解决方案:万能的重启!!!具体错误原因 ...

  3. P3225 [HNOI2012]矿场搭建[割点]

    题目描述 煤矿工地可以看成是由隧道连接挖煤点组成的无向图.为安全起见,希望在工地发生事故时所有挖煤点的工人都能有一条出路逃到救援出口处.于是矿主决定在某些挖煤点设立救援出口,使得无论哪一个挖煤点坍塌之 ...

  4. Django之路——8 cookie 和sessions

    会话跟踪技术 1 什么是会话跟踪技术 我们需要先了解一下什么是会话!可以把会话理解为客户端与服务器之间的一次会晤,在一次会晤中可能会包含多次请求和响应.例如你给10086打个电话,你就是客户端,而10 ...

  5. LG2662 牛场围栏 和 test20181107 数学题

    P2662 牛场围栏 题目背景 小L通过泥萌的帮助,成功解决了二叉树的修改问题,并因此写了一篇论文, 成功报送了叉院(羡慕不?).勤奋又勤思的他在研究生时期成功转系,考入了北京大学光华管理学院!毕业后 ...

  6. hive函数之数学函数

    hive函数之数学函数   round(double d)--返回double型d的近似值(四舍五入),返回bigint型: round(double d,int n)--返回保留double型d的n ...

  7. 从http简介到网络分层及web架构

    浏览器发起HTTP请求的典型场景 a stateless application-level request/response protocol that uses extensible semant ...

  8. RabbitMQ 关键词

    RabbitMQ是流行的开源消息队列系统,用erlang语言开发.RabbitMQ是AMQP(高级消息队列协议)的标准实现. RabbitMQ中间件分为服务端(RabbitMQ Server)和客户端 ...

  9. CEOI2019 / CodeForces 1192B. Dynamic Diameter

    题目简述:给定一棵$N \leq 10^5$个节点的树,边上带权,维护以下两个操作: 1. 修改一条边的边权: 2. 询问当前树的直径长度. 解1:code 注意到树的直径有以下性质: 定理:令$\t ...

  10. 有关 Java (jackson包问题 ,MappingJacksonHttpMessageConverter 和 MappingJackson2HttpMessageConverter问题)

    今天这一系列问题吃掉我四个小时,所以现在吸收掉. 一. 整理所有错误信息: 1.错误信息:java.lang.NoClassDefFoundError: Could not initialize cl ...