C字符贪吃蛇
算法参照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字符贪吃蛇的更多相关文章
- Perl字符贪吃蛇
一时兴起,想试试能不能用perl实现字符贪吃蛇,算法如下: 定义2个数组@bg.@snake,@bg用来显示整个界面,@snake从蛇头开始保存蛇的坐标点. 蛇每移动一次,新的坐标点放到@snake头 ...
- Perl看完这个,再不敢说自己会玩贪吃蛇
某天闲逛时看见一副动图: 真的是非常贪吃,各种拐弯各种吃,感觉十分有趣. 用Perl来实现自动吃满,蓄谋已久,之前的字符贪吃蛇.深度优先算法.A*算法,都是为此篇做铺垫. 那么,怎样让蛇不吃到自己呢? ...
- 字符界面的贪吃蛇--链表--C++
前天看了下链表,由于平时对链表的使用不多,所以对链表的应用也没什么了解,所以想来想去,就想用链表实现一下贪吃蛇. 下面言归正传,先看效果图,再看代码,其他没有了! 图1: 图2: 代码: #inclu ...
- 基于AT89C51单片机的贪吃蛇电子游戏(仿真)
有关贪吃蛇的历史发展可以看一下这个网址,贪吃蛇最初的设计和现在并不相同..http://www.techweb.com.cn/internet/2013-02-21/1278055.shtml 该项目 ...
- C语言之贪吃蛇
利用链表的贪吃蛇,感觉自己写的时候还是有很多东西不熟悉, 1.预编译 2.很多关于系统的头文件也不是很熟悉 3.关于内存 第一个是.h头文件 #ifndef _SNAKE_H_H_H #define ...
- 【BZOJ-4213】贪吃蛇 有上下界的费用流
4213: 贪吃蛇 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 58 Solved: 24[Submit][Status][Discuss] Desc ...
- 小项目特供 贪吃蛇游戏(基于C语言)
C语言写贪吃蛇本来是打算去年暑假写的,结果因为ACM集训给耽搁了,因此借寒假的两天功夫写了这个贪吃蛇小项目,顺带把C语言重温了一次. 是发表博客的前一天开始写的,一共写了三个版本,第一天写了第一版,第 ...
- 多线程的Python 教程--“贪吃蛇”
本指南的里代码可以在这里下载: threadworms.py ,或者从 GitHub.代码需要 Python 3 或 Python 2 ,同时也需要安装 Pygame . 点击查看大版本图片 ...
- [010]转+修正---C++的贪吃蛇程序(未用面向对象封装)
在网上看到一段贪吃蛇程序,自己心痒下了下来又稍微做了一点修改. 没有用面向对象的方式来进行封装,下次准备试试. 需要在windows环境下进行编译 #include<iostream> # ...
随机推荐
- 逆向常见加密算法值BlowFish算法
伪c代码简单记录 伪c代码实现BlowFish加密 sub_4012F0(&v22, &v5, &v6); ^ | do { v7 = *v6 ^ v3; v3 = v4 ^ ...
- 【新手可看懂】ubuntu配置appium环境
1.node安装: 在node官网:https://nodejs.org/en/download/ 下载对应的安装包(这里建议下载最新的版本)下载好后放在liunx指定路径下 我这里放到opt这个文件 ...
- 微信支付接口--超详细带注释代码--Demo
如果本文对你有用,请爱心点个赞,提高排名,帮助更多的人.谢谢大家!❤ 如果解决不了,可以在文末进群交流. 如果对你有帮助的话麻烦点个[推荐]~最好还可以follow一下我的GitHub~感谢观看! 微 ...
- MySQL Hardware--RAID级别查看
MegaCli查看RAID级别: ## 查raid卡信息(生产商.电池信息及所支持的raid级别) /usr/local/sbin/MegaCli -AdpAllInfo -aALL |grep -E ...
- Android自动化测试探索(一)adb详细介绍
adb详细介绍 #1. 基本简介 adb,即Android Debug Bridge,它是Android开发/测试人员不可替代的强大工具 #2. Mac上安装adb 安装brew /usr/bin/r ...
- 网络时间同步服务和chrony
时间同步和chrony 时间同步:多主机协作工作时,各个主机时间同步很重要,时间不一致会造成很多重要应用的故障,如:加密协议,日志,集群等, 利用NTP(Network Time Protocol) ...
- Windows 下的常规命令(收藏)
1. gpedit.msc-----组策略 2. sndrec32-------录音机 3. Nslookup-------IP地址侦测器 4. explorer-------打开资源管理器 5. l ...
- Redis基于主从复制的RCE 4.x/5.x 复现
0x00 前言 最近期末考试,博客好久没有更新了,这段时间爆了三四个洞,趁着还没去实习,抓紧复现一下,这次复现的是Redis的RCE,复现过程中也遇到很多问题,记录下来和大家分享一下 0x01 拉取镜 ...
- gensim中word2vec和其他一些向量的使用
直接上代码吧,word2vec # test from gensim.models.word2vec import Word2Vec txt_file = open('data.txt') sente ...
- 《BUG创造队》作业9:【Beta】冲刺 Scrum meeting 1
项目 内容 这个作业属于哪个课程 2016级软件工程 这个作业的要求在哪里 实验十三 团队作业9:Beta冲刺与团队项目验收 团队名称 BUG创造队 作业学习目标 (1)掌握软件黑盒测试技术:(2)学 ...