#include <graphics.h>
#include <conio.h>
#include <stdio.h>
#define WIDTH 40 //设置宽
#define HEIGHT 30 //设置高
#define BLOCK_SIZE 20 //设置每个正方形格子边长 int Blocks[HEIGHT][WIDTH] = { 0 }; //我为什么要这个二维数组?是用来描述蛇身跟食物的!
int food_i, food_j;
char moveDirection; //用字符记录小蛇的移动方向
int isFailure = 0; void test()
{
//cleardevice();不能用清屏函数
//如何绘画出一个背景板?
initgraph(WIDTH * BLOCK_SIZE, HEIGHT * BLOCK_SIZE);
//如何布格子?
//尝试一下画线来布置格子
setlinecolor(RGB(255,235,205));//并没有用处
//是否还缺什么函数?
BeginBatchDraw();
FlushBatchDraw();
//以上两个绘图函数并没有绘出格子效果!
} //尝试一下童晶的start代码
//void startup() // 初始化函数
//{
// int i;
// Blocks[HEIGHT / 2][WIDTH / 2] = 1; // 画面中间画蛇头,数字为1
// for (i = 1; i <= 4; i++) // 向左依次4个蛇身,数值依次为2,3,4,5
// Blocks[HEIGHT / 2][WIDTH / 2 - i] = i + 1;
// //moveDirection = 'd'; // 初始向右移动
// food_i = rand() % (HEIGHT - 5) + 2; // 初始化随机食物位置
// food_j = rand() % (WIDTH - 5) + 2; //
// initgraph(WIDTH * BLOCK_SIZE, HEIGHT * BLOCK_SIZE); // 新开画面
// setlinecolor(RGB(200, 200, 200)); // 设置线条颜色
// BeginBatchDraw(); // 开始批量绘制
// //以下是我写的
//
//}
//到底哪里出问题??????? //自己写一个定义蛇蛇移动方向的函数
//自己写一个定义蛇蛇移动方向的函数
void My_move() //有大问题!蛇自己消失,不会往前移动的
{
int i, j;
for (i = 0; i < HEIGHT; i++)
{
for (j = 0; j < WIDTH; j++)
{
if (Blocks[i][j] > 0)
{
Blocks[i][j]++; //让旧小蛇中的数组元素加1
}
}
}
int oldHead_i, oldHead_j, oldTail_i, oldTail_j;
int max = 0; //利用max来找到蛇尾
for (i = 0; i < HEIGHT; i++)
{
for (j = 0; j < WIDTH; j++)
{
if (Blocks[i][j] > max) //利用max来找到蛇尾
{
max = Blocks[i][j]; //更新max的大小
oldTail_i = i;
oldTail_j = j;
}
if (Blocks[i][j] == 2) //记录蛇尾的位置
{
oldHead_i = i;
oldHead_j = j;
}
}
} int newHead_i = oldHead_i;
int newHead_j = oldHead_j; //if (moveDirection == 'd')
//{
// newHead_j = oldHead_j + 1;
//}
if (moveDirection == 'w') //向上移动
newHead_i = oldHead_i - 1;
else if (moveDirection == 's') //向下移动
newHead_i = oldHead_i + 1;
else if (moveDirection == 'a') //向左移动
newHead_j = oldHead_j - 1;
else if (moveDirection == 'd') //向右移动
newHead_j = oldHead_j + 1;
//这里原来自己手写的代码没有加上边界判断,现在自己手动加上
if (newHead_i >= HEIGHT || newHead_i < 0 || newHead_j >= WIDTH || newHead_j < 0
|| Blocks[newHead_i][newHead_j] > 0) //这里是判断头位置是否大于0,如果头元素大于0就
{
isFailure = 1; //判断失败
return; //函数返回
} //Blocks[newHead_i][newHead_j] = 1; // 新蛇头位置数值为1
//判断没有游戏失败后
//开始判断是否吃到食物
Blocks[newHead_i][newHead_j] = 1; //新蛇头的元素置为1
if (newHead_i == food_i && newHead_j == food_j) //判断新蛇头是否碰到食物
{
food_i = rand() % (HEIGHT - 3) + 2;
food_j = rand() & (WIDTH - 3) + 2;
//不用对旧蛇处理了,相当于蛇的长度+1
}
else
{
Blocks[oldTail_i][oldTail_j] = 0; //旧蛇尾位置变空白,不吃食物时保持蛇的长度
} } void My_startup()
{
Blocks[HEIGHT / 2][WIDTH / 2] = 1; //将整个方块的中间格子设置为蛇头,为1
for (int i = 1; i <= 4; i++)
{
Blocks[HEIGHT / 2][WIDTH / 2 - i] = i + 1; //从左向右以此画四个蛇身
}
moveDirection = 'd'; // 初始向右移动,忘记加默认方向了!!
//开始画方向
food_i = rand() % (HEIGHT - 3) + 2; //应该会出现在角落的位置
food_j = rand() % (WIDTH - 3) + 2; //应该会出现在角落的位置
initgraph(WIDTH * BLOCK_SIZE, HEIGHT * BLOCK_SIZE);// 新开画面
setlinecolor(RGB(200, 150, 100));// 设置线条颜色
BeginBatchDraw();// 开始批量绘制
} //自己写一个展示背景格子的函数
void My_Show()
{
cleardevice();
int i, j;
for (int i = 0; i < HEIGHT; i++)
{
for (int j = 0; j < WIDTH; j++)
{
//现在添加回显示蛇身的代码
if (Blocks[i][j] > 0) // 元素大于0表示是蛇,这里让蛇的身体颜色色调渐变
{
setfillcolor(HSVtoRGB(Blocks[i][j] * 9, 0.9, 1));
}
else
setfillcolor(RGB(255,193,193)); // 元素为0表示为空,颜色为灰色
fillrectangle(BLOCK_SIZE *j, BLOCK_SIZE * i, BLOCK_SIZE * (j+1), BLOCK_SIZE * (i+1));// 在对应位置处,以对应颜色绘制小方格
}
}
setfillcolor(RGB(0, 255, 0)); // 食物为绿色
// 绘制食物小方块
fillrectangle(food_j * BLOCK_SIZE, food_i * BLOCK_SIZE,
(food_j + 1) * BLOCK_SIZE, (food_i + 1) * BLOCK_SIZE); if (isFailure) // 如果游戏失败
{
setbkmode(TRANSPARENT); // 文字字体透明
settextcolor(RGB(255, 0, 0));// 设定文字颜色
settextstyle(80, 0, _T("宋体")); // 设定文字大小、样式
outtextxy(240, 220, _T("游戏失败")); // 输出文字内容
}
FlushBatchDraw();
} //自己定义一个在不按键的情况下蛇蛇自己移动的函数
void My_movewithNothing()
{
if (isFailure) // 如果游戏失败,函数返回
return;
//尝试定义一个静态变量来用while 1 循环去驱动
static int move = 1;
move++;
if (move == 10)
{
My_move();
//moveSnake();
move = 1;
}
} //添加了按键后蛇会根据方向进行移动的函数
void My_movewithTouch()
{
if (kbhit() && isFailure == 0) //如果有按键输入并且没有出错的话
{
char input = getch();
if (input == 'w' || input == 's' || input == 'a' || input == 'd')
{
moveDirection = input;
My_move();
}
}
} int main() // 主函数
{
//test();
//startup();//直接用这个初始化函数后,界面完全是黑色的,没有格子出现
My_startup(); //可以尝试一下用while 1 不断show出画面
while (1)
{
//show();
My_Show();//调用了这个函数后就出现背景格子了
My_movewithNothing();
My_movewithTouch();
}
return 0;
}

C语言小游戏:贪吃蛇的更多相关文章

  1. JavaScript面向对象编程小游戏---贪吃蛇

    1 面向对象编程思想在程序项目中有着非常明显的优势: 1- 1 代码可读性高.由于继承的存在,即使改变需求,那么维护也只是在局部模块 1- 2 维护非常方便并且成本较低. ​ 2 这个demo是采用了 ...

  2. 第一个windows 小游戏 贪吃蛇

    最近用dx尝试做了一个小的贪吃蛇游戏,代码放到github上面:https://github.com/nightwolf-chen/MyFreakout 说一下自己实现的过程: 首先,我把蛇这个抽象成 ...

  3. 用Canvas制作小游戏——贪吃蛇

    今天呢,主要和小伙伴们分享一下一个贪吃蛇游戏从构思到实现的过程~因为我不是很喜欢直接PO代码,所以只copy代码的童鞋们请出门左转不谢. 按理说canvas与其应用是老生常谈了,可我在准备阶段却搜索不 ...

  4. 使用JavaScript实现简单的小游戏-贪吃蛇

    最近初学JavaScript,在这里分享贪吃蛇小游戏的实现过程, 希望能看到的前辈们能指出这个程序的不足之处. 大致思路 首先要解决的问题 随着蛇头的前进,尾巴也要前进. 用键盘控制蛇的运动方向. 初 ...

  5. python【控制台】小游戏--贪吃蛇

    传统贪吃蛇相信大家都玩过,也是一款很老很经典的游戏,今天我们用python控制台实现 项目有很多bug没有解决,因为本人一时兴起写的一个小游戏,所以只是实现可玩部分功能,并没有花较多的时间和精力去维护 ...

  6. 手把手教学h5小游戏 - 贪吃蛇

    简单的小游戏制作,代码量只有两三百行.游戏可自行扩展延申. 源码已发布至github,喜欢的点个小星星,源码入口:game-snake 游戏已发布,游戏入口:http://snake.game.yan ...

  7. Win32小游戏--贪吃蛇

    近日里学习了关于win32编程的相关知识,利用这些知识制作了一款贪吃蛇小游戏,具体细节还是分模块来叙述 前期准备:在网上找到一些贪吃蛇的游戏素材图片,以及具体的逻辑框图 在正式写功能之前,先把一系列环 ...

  8. Java_GUI小游戏--贪吃蛇

    贪吃蛇游戏:是一条蛇在封闭围墙里,围墙里随机出现一个食物,通过按键盘四个光标键控制蛇向上下左右四个方向移动,蛇头撞倒食物,则食物被吃掉,蛇身体长一节,接着又出现食物,等待蛇来吃,如果蛇在移动中撞到墙或 ...

  9. Java经典小游戏——贪吃蛇简单实现(附源码)

    一.使用知识 Jframe GUI 双向链表 线程 二.使用工具 IntelliJ IDEA jdk 1.8 三.开发过程 3.1素材准备 首先在开发之前应该准备一些素材,已备用,我主要找了一个图片以 ...

  10. 用Python实现童年小游戏贪吃蛇

    贪吃蛇作为一款经典小游戏,早在 1976 年就面世了,我最早接触它还是在家长的诺基亚手机中.

随机推荐

  1. Redis 切片集群的数据倾斜分析

    Redis 中如何应对数据倾斜 什么是数据倾斜 数据量倾斜 bigkey导致倾斜 Slot分配不均衡导致倾斜 Hash Tag导致倾斜 数据访问倾斜 如何发现 Hot Key Hot Key 如何解决 ...

  2. Canal搭建

    目录 搭建环境 MySQL环境 Canal环境 客户端 总结 需求:解决私有环境数据库的基础数据同步问题,每当中心库基础数据发生改变时,其他私有库都会增量同步 Canal主要用途是基于 MySQL 数 ...

  3. windows下telnet的用法

    前言 这里利用Windows7下如何使用Telnet命令给大家总结如下: 第一步:在控制面板里,点击"程序"选项 第二步:在程序选项下,点击"打开或关闭Windows功能 ...

  4. Gitlab分支策略建议指南

    本文分支策略为总结各中小型企业常见做法(仅代表个人观点),在下才疏学浅,文章如有缺漏或不当之处,望各位帮忙指正.写此文也十分希望能起抛砖引玉之效. 据我所知,目前大部分无论是按瀑布/敏捷开发模型,就算 ...

  5. 深入解析Kubernetes admission webhooks

    BACKGROUND admission controllers的特点: 可定制性:准入功能可针对不同的场景进行调整. 可预防性:审计则是为了检测问题,而准入控制器可以预防问题发生 可扩展性:在kub ...

  6. Spring-03

    1. AOP相关概念 1.1 AOP概念&作用 AOP(Aspect Oriented Programming)是一种思想,面向切面编程 作用:在不修改源码的前提下,在程序运行过程中对方法进行 ...

  7. 搞懂前端二进制系列(二):🍈File、FileReader与Base64

    参考资料: JavaScript高级程序设计第四版:File API https://juejin.cn/post/7046313942938812424[前端二进制一次搞清楚] 一.File 类型 ...

  8. 解气!哈工大被禁用MATLAB后,国产工业软件霸气回击

    提起哈尔滨工业大学,相信很多人都不会陌生. 它是中国顶级的C9院校之一,从1920年建校的百余年来,哈工大一直享誉"工科强校"的美称,因其在航天领域的不凡成就,更是被人们誉为&qu ...

  9. python:GUI图形化数据库巡检工具

    问题描述:时间过得真快,一眨眼又一个月过去,2022又过去大半,7月的尾巴,终于稍微做出来点 东西,本人也不是开发,也是在不断学习的一枚小白.这次使用tkinter制作了一个mysql的巡检工具,使用 ...

  10. Java中break、continue和return三者之间的区别

    控制流程语句 java关键字break.continue.return主要按三个纬度去区分. 作用不同 结束不同 紧跟不同  一.作用不同 1.break:执行break操作,跳出所在的当前整个循环, ...