C语言小游戏:贪吃蛇
#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语言小游戏:贪吃蛇的更多相关文章
- JavaScript面向对象编程小游戏---贪吃蛇
1 面向对象编程思想在程序项目中有着非常明显的优势: 1- 1 代码可读性高.由于继承的存在,即使改变需求,那么维护也只是在局部模块 1- 2 维护非常方便并且成本较低. 2 这个demo是采用了 ...
- 第一个windows 小游戏 贪吃蛇
最近用dx尝试做了一个小的贪吃蛇游戏,代码放到github上面:https://github.com/nightwolf-chen/MyFreakout 说一下自己实现的过程: 首先,我把蛇这个抽象成 ...
- 用Canvas制作小游戏——贪吃蛇
今天呢,主要和小伙伴们分享一下一个贪吃蛇游戏从构思到实现的过程~因为我不是很喜欢直接PO代码,所以只copy代码的童鞋们请出门左转不谢. 按理说canvas与其应用是老生常谈了,可我在准备阶段却搜索不 ...
- 使用JavaScript实现简单的小游戏-贪吃蛇
最近初学JavaScript,在这里分享贪吃蛇小游戏的实现过程, 希望能看到的前辈们能指出这个程序的不足之处. 大致思路 首先要解决的问题 随着蛇头的前进,尾巴也要前进. 用键盘控制蛇的运动方向. 初 ...
- python【控制台】小游戏--贪吃蛇
传统贪吃蛇相信大家都玩过,也是一款很老很经典的游戏,今天我们用python控制台实现 项目有很多bug没有解决,因为本人一时兴起写的一个小游戏,所以只是实现可玩部分功能,并没有花较多的时间和精力去维护 ...
- 手把手教学h5小游戏 - 贪吃蛇
简单的小游戏制作,代码量只有两三百行.游戏可自行扩展延申. 源码已发布至github,喜欢的点个小星星,源码入口:game-snake 游戏已发布,游戏入口:http://snake.game.yan ...
- Win32小游戏--贪吃蛇
近日里学习了关于win32编程的相关知识,利用这些知识制作了一款贪吃蛇小游戏,具体细节还是分模块来叙述 前期准备:在网上找到一些贪吃蛇的游戏素材图片,以及具体的逻辑框图 在正式写功能之前,先把一系列环 ...
- Java_GUI小游戏--贪吃蛇
贪吃蛇游戏:是一条蛇在封闭围墙里,围墙里随机出现一个食物,通过按键盘四个光标键控制蛇向上下左右四个方向移动,蛇头撞倒食物,则食物被吃掉,蛇身体长一节,接着又出现食物,等待蛇来吃,如果蛇在移动中撞到墙或 ...
- Java经典小游戏——贪吃蛇简单实现(附源码)
一.使用知识 Jframe GUI 双向链表 线程 二.使用工具 IntelliJ IDEA jdk 1.8 三.开发过程 3.1素材准备 首先在开发之前应该准备一些素材,已备用,我主要找了一个图片以 ...
- 用Python实现童年小游戏贪吃蛇
贪吃蛇作为一款经典小游戏,早在 1976 年就面世了,我最早接触它还是在家长的诺基亚手机中.
随机推荐
- 2.2.1 用户态、内核态的形成 -《zobolの操作系统学习札记》
内核态的出现,让计算机系统的权力向操作系统高度集中了. 操作系统分出内核态和用户态,就是为了进行不同等级的权限管理, 从而更好的适应多用户多任务并发的工作环境. 用户态和内核态的来源 在早期的单进程单 ...
- NC224938 加减
NC224938 加减 题目 题目描述 小红拿到了一个长度为 \(n\) 的数组.她每次操作可以让某个数加 \(1\) 或者某个数减 \(1\) . 小红最多能进行 \(k\) 次操作.她希望操作结束 ...
- pytest多进程/多线程执行测试用例
前言: 实际项目中的用例数量会非常多,几百上千:如果采用单进程串行执行的话会非常耗费时间.假设每条用例耗时2s,1000条就需要2000s $\approx$ 33min:还要加上用例加载.测试前/后 ...
- C# / VB.NET 将Html转为Word
本文分享以C#程序代码为例,实现将Html文件转换Word文档的方法(附VB.NET代码).在实际转换场景中可参考本文的方法,转换前,请按照如下方法引用Word API的dll文件到Visual St ...
- Pytorch从0开始实现YOLO V3指南 part4——置信度阈值和非极大值抑制
本节翻译自:https://blog.paperspace.com/how-to-implement-a-yolo-v3-object-detector-from-scratch-in-pytorch ...
- RocketMQ之消费者启动与消费流程
vivo 互联网服务器团队 - Li Kui 一.简介 1.1 RocketMQ 简介 RocketMQ是由阿里巴巴开源的分布式消息中间件,支持顺序消息.定时消息.自定义过滤器.负载均衡.pull/p ...
- 常用类-Instant、DateTimeFormatter类的使用
一.Instant 我们所处的时间点是在东八区,Java中Instant所计算出来的时间是按本初子午线的时间来算的,与我们的时间相差8个小时,也就是说当我的北京时间是上午九点时,本初子午线的时间是凌晨 ...
- 提名 Apache ShardingSphere Committer,说说方法
文章首发在公众号(龙台的技术笔记),之后同步到博客园和个人网站:xiaomage.info 就在前几天,收到了 Apache ShardingSphere Vote 我成为 Committer 的邮件 ...
- 零基础学Java(8)数组
数组 数组存储相同类型值的序列. 声明数组 数组是一种数据结构,用来存储同一类型值的集合.通过一个整型下标(index,或称索引)可以访问数组中的每一个值.例如,如果a是一个整型数组,a[i]就是数组 ...
- 09 MySQL_SQL日期函数和聚合函数
日期相关的函数 seclect 'helloworld'; 1. 获取当前时间 now(); select now(); 2.获取当前的日期 curdate(); select curdate(); ...