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 年就面世了,我最早接触它还是在家长的诺基亚手机中.
随机推荐
- RPA应用场景-考勤审批
场景概述 考勤审批 所涉系统名称 考勤系统,微信 人工操作(时间/次) 5分钟 所涉人工数量 43 操作频率 不定时 场景流程 1.客户领导长期出差,又不想对考勤系统做深度开发: 2.员工请假后,领导 ...
- sql-DQL-单表查询
单表查询 select [distint]* 字段列表 from 表名列表 where 条件列表 group by 分组字段 having 分组之后的条件 order by 排序 limit 分页限定 ...
- 毕业论文着急了?Python疫情数据分析,并做数据可视化展示
采集流程 一..明确需求 采集/确诊人数/新增人数 二.代码流程 四大步骤 发送请求 获取数据 网页源代码 解析数据 筛选一些我想用的数据 保存数据 保存成表格 做数据可视化分析 开始代码 1. 发送 ...
- 不花钱~Python制作视频解析免费追剧神器
同学们在闲暇之余是否喜欢看电影或者电视剧呢? 今天带领大家使用python制作能免费追剧的桌面软件.还在等什么?发车了! 效果我就不再这里演示了https://jq.qq.com/?_wv=1027& ...
- Codeforces Round #789 (Div. 2) A-C
Codeforces Round #789 (Div. 2) A-C A 题目 https://codeforces.com/problemset/problem/1677/A 题解 思路 知识点:模 ...
- IO流原理及流的分类
IO原理 I/O是Input/Output的缩写, I/O技术是非常实用的技术,用于 处理设备之间的数据传输.如读/写文件,网络通讯等. Java程序中,对于数据的输入/输出操作以"流(st ...
- C++ delete后的指针在不同编译器下的状态差异
今天看到小伙伴分享的一个问题,小伙伴用的MSVC2019编译器,在对delete后的指针进行取值操作时触发了访问冲突. #include<iostream> using namespace ...
- 一题多解,ASP.NET Core应用启动初始化的N种方案[下篇]
[接上篇]"天下大势,分久必合,合久必分",ASP.NET应用通过GenericWebHostService这个承载服务被整合到基于IHostBuilder/IHost的服务承载系 ...
- 从Wannacry到WannaRen:螣龙安科带你深度分析勒索病毒原理
从Wannacry到WannaRen:螣龙安科2020年4月7日,360CERT监测发现网络上出现一款新型勒索病毒wannaRen,该勒索病毒会加密windows系统中几乎所有的文件,并且以.Wann ...
- docker多段构建nessus镜像
1.构建基础镜像,主要做安装和获取注册号: FROM ubuntu:16.04 ADD Nessus-8.11.0-debian6_amd64.deb /tmp/Nessus-8.11.0-debia ...