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 年就面世了,我最早接触它还是在家长的诺基亚手机中.
随机推荐
- WAVE音频格式及及转换代码
音频信号的读写.播放及录音 python已经支持WAV格式的书写,而实时的声音输入输出需要安装pyAudio(http://people.csail.mit.edu/hubert/pyaudio).最 ...
- robotframework之环境安装
一.安装python2.7环境,python --version查询python安装的版本 二.setuptools安装
- SAP APO-需求计划
需求计划可以对市场中的产品进行预测. 需求计划过程的输出就是需求计划,它考虑了影响需求的所有因素. 需求计划流程定义了需求计划周期中的活动. 由于需求计划过程以循环的形式进行,因此可以重复某些活动. ...
- Prometheus安装教程
Prometheus安装教程 欢迎关注H寻梦人公众号 参考目录 docker安装Prometheus 基于docker 搭建Prometheus+Grafana prometheus官方文档 dock ...
- Tomcat 安装及配置,创建动态的web工程
Tomcat可以认为是对Servlet标准的实现,是一个具体的Servlet容器. 1) 将Tomcat的安装包解压到磁盘的任意位(非中文无空格) 2) Tomcat服务的 ...
- 初次使用 eolink 感受
最近总有前端小伙伴来找我抱怨,"后端接口出来太晚,影响我的任务进度"."后端接口改了也不通知我一下,到冒烟测试的时候报一堆的错".我拉后端小伙伴了解情况,结果问 ...
- 解决Windows10、Windows11文件名无法大写的问题
问题描述: 同一目录下的不同文件有些可以用大写字母做文件名,有些输入大写字母完成后自动变成小写. 甚至同一文件的文件名中的相同字母也会有这种情况,例如:文件名为"bu人BU"的文件 ...
- jdbc 09: preparedStatement实现增删改查
jdbc连接mysql,利用preparedStatement实现增删改查 package com.examples.jdbc.o9_preparedStatement实现增删改; import ja ...
- 「一本通 1.4 例 2」[USACO3.2]魔板 Magic Squares
[USACO3.2]魔板 Magic Squares 题目背景 在成功地发明了魔方之后,鲁比克先生发明了它的二维版本,称作魔板.这是一张有8个大小相同的格子的魔板: 1 2 3 4 8 7 6 5 题 ...
- 分享一款免费OPC UA服务器
OPC UA基于OPC基金会提供的新一代技术,提供安全,可靠和独立于厂商的,实现原始数据和预处理的信息从制造层级到生产计划或ERP层级的传输.通过OPC UA,所有需要的信息在任何时间,任何地点对每个 ...