C++简单项目--贪吃蛇
在800*600的地图上,蛇的初始长度为3节,用数组记录每一节的位置(每个正方形左上角的坐标),每一节为长度为10的正方形,初始方向向右。随机生成30个障碍物的的位置,随机生成食物的位置。吃到食物之后(即蛇头与食物位置相同),蛇的长度增加一节,每次移动时将数组的每一个元素向后移一位,第一位根据方向改变坐标。这样最后一位坐标在没吃到食物时会移到无法表现出来的位置,也可以用于吃到食物时的增长。
移动之后判断是否碰到障碍物或出界或咬到自身,用窗口命令提示游戏结束,并跳出死循环,程序结束。
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<graphics.h>
#include<time.h>
#include<conio.h>
using namespace std;
struct point{
int x,y;
}obstacle[];
struct {
int num;
struct point xy[];
int dir;
}snake;
struct {
struct point xy;
int flag; }food;
void drawsnake() {
int i;
for (i = ; i < snake.num; i++) {
setlinecolor(BLACK);
setfillcolor(RGB((rand() % ), (rand() % ), (rand() % )));
fillrectangle(snake.xy[i].x, snake.xy[i].y, snake.xy[i].x + , snake.xy[i].y + );
}
}
void movesnake() {
int i = snake.num;
for (; i > ; i--) {
snake.xy[i].x = snake.xy[i - ].x;
snake.xy[i].y = snake.xy[i - ].y;
}
switch (snake.dir) {
case :snake.xy[].y -= ;
break;
case :snake.xy[].y += ;
break;
case :snake.xy[].x -= ;
break;
case :snake.xy[].x += ;
break;
}
}
bool check() {
int i;
for (i = ; i < snake.num; i++) {
if (snake.xy[].x == snake.xy[i].x&&snake.xy[].y == snake.xy[i].y) {
return false;
}
}
if (snake.xy[].x < || snake.xy[].y < || snake.xy[].y> || snake.xy[].x>) {
return false;
}
for (i = ; i < ; i++) {
if (snake.xy[].x == obstacle[i].x&&snake.xy[].y == obstacle[i].y) {
return false;
}
}
}
void keyDown() {
char ch = '\0';
ch = _getch();
switch (ch) {
case 'd':
case 'D':
if (snake.dir != ) {
snake.dir = ;
}
break;
case 'w':
case 'W':
if (snake.dir != ) {
snake.dir = ;
}
break;
case 'a':
case 'A':
if (snake.dir != ) {
snake.dir = ;
}
break;
case 's':
case 'S':
if (snake.dir != ) {
snake.dir = ;
}
break;
default:
break;
}
}
void drawob() {
int i;
setlinecolor(BLACK);
setfillcolor(BLACK);
for (i = ; i < ; i++) {
fillrectangle(obstacle[i].x, obstacle[i].y, obstacle[i].x + , obstacle[i].y + );
}
}
int main() {
srand((unsigned int)time());
HWND hwnd=initgraph(, );
setbkcolor(RGB(, , ));
cleardevice();
snake.num = ;
snake.xy[].x = ;
snake.xy[].x = ;
snake.xy[].x = ;
snake.xy[].y = ;
snake.xy[].y = ;
snake.xy[].y = ;
snake.dir = ;
food.flag = ;
int i; for (i = ; i < ; i++) {
obstacle[i].x = rand() % * + ;
obstacle[i].y = rand() % * + ; }
drawsnake();
while () {
if (food.flag == ) {
food.flag = ;
food.xy.x = rand() % * ;
food.xy.y = rand() % * ;
}
movesnake();
if (snake.xy[].x == food.xy.x&& snake.xy[].y == food.xy.y) {
food.flag = ;
snake.num++;
}
if (check() == false) {
MessageBox(hwnd, "Gameover","Game over!",);
break;
}
cleardevice();
setlinecolor(BLACK);
setfillcolor(WHITE);
fillrectangle(food.xy.x, food.xy.y, food.xy.x + , food.xy.y + );
drawsnake();
drawob();
char text[];
settextcolor(BLACK);
outtextxy(, , "WASD控制");
sprintf(text, "num=%d", snake.num);
outtextxy(, , text);
while (_kbhit() ){
keyDown();
}
Sleep();
}
//system("pause");
return ;
}
C++简单项目--贪吃蛇的更多相关文章
- GUI简单实战——贪吃蛇
将前面学到的GUI基础知识完成实战,完成一个简单的贪吃蛇项目 项目功能 用键盘上下左右实现贪吃蛇的自动移动 贪吃蛇吃到食物后,长度加一,分数加一 贪吃蛇吃到自己的身体,则游戏结束 按空格键实现游戏的暂 ...
- C#简单实现贪吃蛇程序(LinQ + Entity)
做梦想起来的C#简单实现贪吃蛇程序(LinQ + Entity) 最近一直在忙着单位核心开发组件的版本更新,前天加了一个通宵,昨天晚上却睡不着,脑子里面突然不知怎的一直在想贪吃蛇的实现方法.以往也有类 ...
- TOJ 3973 Maze Again && TOJ 3128 简单版贪吃蛇
TOJ3973传送门:http://acm.tzc.edu.cn/acmhome/problemdetail.do?&method=showdetail&id=3973 时间限制(普通 ...
- Java一个简单的贪吃蛇
Java一个简单的贪吃蛇 虽然GUI已经要淘汰了,但是手动写写界面还是有助于理解语法的,像构造函数 ,函数调用,内部类,继承,接口.有助于半初学者强化理解. 直接上代码 游戏主体类: package ...
- 做梦想起来的C#简单实现贪吃蛇程序(LinQ + Entity)
最近一直在忙着单位核心开发组件的版本更新,前天加了一个通宵,昨天晚上却睡不着,脑子里面突然不知怎的一直在想贪吃蛇的实现方法.以往也有类似的情况,白天一直想不通的问题,晚上做梦有时会想到更好的版本,于是 ...
- JavaScript实践-简单的贪吃蛇小游戏
实现逻辑: //获取Html中的格子(行,列) //建立数组存储所有格子(x,y) //建立数组用于存储蛇身(x,y) //生成随机坐标(x,y)的函数 //随机创建蛇身并存储到蛇身数组 //创建食物 ...
- d3.js 制作简单的贪吃蛇
d3.js是一个不错的可视化框架,同时对于操作dom也是十分方便的.今天我们使用d3.js配合es6的类来制作一个童年小游戏–贪吃蛇.话不多说先上图片. 1. js snaker类 class Sna ...
- js编写简单的贪吃蛇游戏
css代码 *{ margin:; padding:; } td{ width: 4px; height: 4px; background: #ccc; border: 2px solid #ccc; ...
- 用OpenGL简单编写的一个最简单贪吃蛇游戏
刚学OpenGL的时候,写的一个最简单的贪吃蛇游戏代码 如下: //贪吃蛇游戏 #include<stdio.h> #include<stdlib.h> #include< ...
随机推荐
- laravel拓展validator验证
https://blog.csdn.net/zl20117/article/details/53536520 首先,扩展的收个问题是,我的扩展类应该放在哪儿才好呢? 直接在app目录下,建立一个目录: ...
- iptables 负裁平衡(Load balancing)
「负戴平衡」的作用是将连線平均分散给一组伺服器,以充分利用资源.最简单的作法是利用「通讯端口转接」技术,使其以循环顺序选择目的地位址. 设定iptables的组态 各家Linux系统的iptables ...
- Project Euler Problem 5-Smallest multiple
对每个数字分解素因子,最后对每个素因子去其最大的指数,然后把不同素因子的最大指数次幂相乘,得到的就是最小公倍数 python不熟练,代码比较挫 mp = {} def process(n): i = ...
- logback 打印mybatis sql mybatis 日志打印sql语句和返回结果
logback 打印sql语句: 在logback日志文件中开启debug模式 <logger name="com.ibatis" level="DEBUG&quo ...
- 2019-5-27-C#-很少人知道的科技
title author date CreateTime categories C# 很少人知道的科技 lindexi 2019-05-27 19:33:36 +0800 2018-03-16 08: ...
- mac上的mysql管理工具sequel pro
https://blog.csdn.net/wan_zaiyunduan/article/details/54909389 以前用过Plsql.Navicat.Workbench,现在换到mac上,用 ...
- MVC插件式开发平台
---恢复内容开始--- 经过DyOS.BraveOS1.0再到BraveOS2.0,系统现在已经开发了下载. 我们的目标是,网页版操作系统,可以在线安装更新软件,并提供二次开发平台,提供基础的逻辑和 ...
- [转]ECMAScript 2016,2017 和 2018 中所有新功能的示例
很难追踪 JavaScript(ECMAScript)中的新功能. 想找到有用的代码示例更加困难. 因此,在本文中,我将介绍 TC39 已完成 ES2016,ES2017 和 ES2018(最终草案) ...
- CSS滤镜 :灰色 ,方便站点哀悼
html { -webkit-filter: grayscale(100%); -moz-filter: grayscale(100%); -ms-filter: grayscale(100%); ...
- 浅谈集合框架四——集合扩展:集合循环输出方式及list输出方式的效率对比
最近刚学完集合框架,想把自己的一些学习笔记与想法整理一下,所以本篇博客或许会有一些内容写的不严谨或者不正确,还请大神指出.初学者对于本篇博客只建议作为参考,欢迎留言共同学习. 之前有介绍集合框架的体系 ...