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 年就面世了,我最早接触它还是在家长的诺基亚手机中.
随机推荐
- Error: $injector:modulerr Module Error
Failed to instantiate module app due to://实例化失败 Error: [$injector:modulerr] http://errors.angularjs. ...
- python超级有用的实战项目,拿走不谢~
写在前面的一点P话: Python是目前最好的编程语言之一.由于其可读性和对初学者的友好性,已被广泛使用. 那么要想学会并掌握Python,可以实战的练习项目是必不可少的. 直接上第一个项目~ 猜字游 ...
- 索尼笔记本Linux系统唤醒后,键盘无法使用
1.编辑grub文件 sudo gedit /etc/default/grub 2.修改成以下参数 GRUB_CMDLINE_LINUX_DEFAULT="quiet splash i804 ...
- Java实现动态代理
1.实现InvocationHandler接口 这种方式只能针对接口实现类的实例对象. interface Hello{ public void sayHello(); } class HelloIm ...
- IDEA快捷键之晨讲篇
IDEA之html快捷键 快捷键 释义 ! 生成HTML的初始格式 ---- ---- 标签名*n 生成n个相同的标签 ---- ---- 标签>标签 生成父子级标签(包含) ---- ---- ...
- tokitsukaze and Soldier 来源:牛客网
题目 链接:https://ac.nowcoder.com/acm/contest/28886/1004 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 524288K, ...
- 如何记录分析你的炼丹流程—可视化神器Wandb使用笔记【1】
本节主要记录使用wandb记录训练曲线以及上传一些格式的数据将其展示在wandb中以便分析的方法,略过注册安装部分(可使用pip intall wandb安装,注册相关issue可上网搜索),文章着重 ...
- Spring的简单使用(1)
一:IOC(控制反转):它是由spring容器进行对象的创建和依赖注入,程序员使用时直接取出即可 正转:例如: Student stu=new Student(): stu.setname(" ...
- Charles自动保存响应数据
本文所有教程及源码.软件仅为技术研究.不涉及计算机信息系统功能的删除.修改.增加.干扰,更不会影响计算机信息系统的正常运行.不得将代码用于非法用途,如侵立删! 操作环境 win10 nexus5x c ...
- Java面试题(四)--RabbitMQ
1.MQ有哪些使用场景?(高频) 异步处理:用户注册后,发送注册邮件和注册短信.用户注册完成后,提交任务到 MQ,发送模块并行获取 MQ 中的任务. 系统解耦:比如用注册完成,再加一个发送微信通知.只 ...