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< ...
随机推荐
- android学习——Android Layout标签之-viewStub,requestFocus,merge,include
定义Android Layout(XML)时,有四个比较特别的标签是非常重要的,其中有三个是与资源复用有关,分别是<viewStub/>, <requestFocus />, ...
- linux下oracle查询中文乱码
export NLS_LANG=AMERICAN_AMERICA.UTF8
- 洛谷P2486 [SDOI2011]染色 题解 树链剖分+线段树
题目链接:https://www.luogu.org/problem/P2486 首先这是一道树链剖分+线段树的题. 线段树部分和 codedecision P1112 区间连续段 一模一样,所以我们 ...
- 漏洞: RHSA-2017:3075: wget security update
该网址有解决方案 http://www.stumblingblock.cn/3102.html
- Python--day62--删除出版社
删除成出版社关键代码:
- Sublime Text 安装中文、英文字体
在 Sublimte Text 如何使用默认的字体,英文好看,但是中文不好,所以我就找了一个支持中文英文的字体 YaHei Consolas Hybrid 这个字体看起来效果比较差 下载地址: 如果无 ...
- windows环境下pgsql的安装与使用
- linux ioctl 接口
大部分驱动需要 -- 除了读写设备的能力 -- 通过设备驱动进行各种硬件控制的能力. 大 部分设备可进行超出简单的数据传输之外的操作; 用户空间必须常常能够请求, 例如, 设 备锁上它的门, 弹出它的 ...
- js操作改变原数组的解决方法
最近在开发的时候发现js中的循环操作会改变原数组,var一个变量承接也不行 甚至连map方法都会改变原数组,下面是解决方法 let a = ['a','b','c'] let b = [[2, 0, ...
- 深度解读 - TDD(测试驱动开发)
转自:http://www.jianshu.com/p/62f16cd4fef3 本文结构: 什么是 TDD 为什么要 TDD 怎么 TDD FAQ 学习路径 延伸阅读 什么是 TDD TDD 有广义 ...