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< ...
随机推荐
- mysql数据库之mysql下载与设置
下载和安装mysql数据库 mysql为我们提供了开源的安装在各个操作系统上的安装包,包括ios,liunx,windows. mysql的安装,启动和基础配置-------linux版本 mysql ...
- hdu 2225 The nearest fraction (数学题)
Problem - 2225 一道简单数学题,要求求出一个分母不超过m的最接近sqrt(n)的分数. 做法就是暴力枚举,注意中间过程不能用浮点数比较,误差要求比较高. 代码如下: #include & ...
- git之本地仓库关联远程仓库
首先新建一个github respository 然后在自己本地新建一个maven项目,里面写点东西 如下图,将自己的项目所在地设置为本地git仓库 将本地仓库与远程关联,首先获取远程仓库的地址,点击 ...
- jieba分词工具的使用方法
作为我这样的萌新,python代码的第一步是:#coding=utf-8 环境:python3.5+jieba0.39 一.jieba包安装方法: 方法1:使用conda安装 conda instal ...
- 2013-10-7 设置combboxItem高度的方法
//首先设置一个较大的 ItemHeight 值,比如 20: //然后设置 ComboBox 的 DrawMode 为 OwnerDrawVariable: //再设置DrawItem事件如下 if ...
- Python--day62--编辑出版社功能
1,Django项目主要用到的文件
- java操作数组的工具类-Arrays
static int binarySearch(type[] a, type key) 使用二分搜索法来搜索key元素在数组中的索引:若a数组不包括key,返回负数.(该方法必须已按升序排列后调用). ...
- CF1166E The LCMs Must be Large
CF1166E The LCMs Must be Large 构造趣题 正着推其实很不好推 不妨大力猜结论 如果两两集合都有交,那么一定可以 证明: 1.显然如果两个集合没有交,一定不可以 2.否则给 ...
- Python--day46--上节内容回顾及补充
1,union(把两张表连起来,以上下的方式):具有自动去重的功能,有相同的就去掉. 结果: 2,union all就没有去重的功能 3,临时表,指定映射,条件,三元运算
- python基础七之集合
集合:可变的数据类型,他里面的元素必须是不可变的数据类型,无序,不重复. 增加 set1 = {'zxc', 'zxf'} set1.add('zxv') # 无序添加 set1.update('zx ...