问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

关於贪吃蛇编程

发布网友 发布时间:2022-04-23 13:57

我来回答

2个回答

热心网友 时间:2023-05-03 00:31

snake.h

#include <vector>
#include <queue>
using namespace std;
#ifndef SNAKE_H
#define SNAKE_H
class Cmp
{
friend class Csnake;
int rSign; //横坐标
int lSign; //竖坐标
public:
// friend bool isDead(const Cmp& cmp);
Cmp(int r,int l){setPoint(r,l);}
Cmp(){}
void setPoint(int r,int l){rSign=r;lSign=l;}
Cmp operator-(const Cmp &m)const
{
return Cmp(rSign-m.rSign,lSign-m.lSign);
}
Cmp operator+(const Cmp &m)const
{
return Cmp(rSign+m.rSign,lSign+m.lSign);
}
};

const int maxSize = 5; //初始蛇身长度
class Csnake
{
Cmp firstSign; //蛇头坐标
Cmp secondSign;//蛇颈坐标
Cmp lastSign; //蛇尾坐标
Cmp nextSign; //预备蛇头
int row; //列数
int line; //行数
int count; //蛇身长度
vector<vector<char> > snakeMap;//整个游戏界面
queue<Cmp> snakeBody; //蛇身
public:
int GetDirections()const;
char getSymbol(const Cmp& c)const
//获取指定坐标点上的字符
{
return snakeMap[c.lSign][c.rSign];
}
Csnake(int n)
//初始化游戏界面大小
{
if(n<20)line=20+2;
else if(n>30)line=30+2;
else line=n+2;
row=line*3+2;
}
bool isDead(const Cmp& cmp)
{
return ( getSymbol(cmp)=='@' || cmp.rSign == row-1
|| cmp.rSign== 0 || cmp.lSign == line-1 ||
cmp.lSign == 0 );
}
void InitInstance(); //初始化游戏界面
bool UpdataGame(); //更新游戏界面
void ShowGame(); //显示游戏界面
};
#endif // SNAKE_H

snake.cpp
#include <windows.h>
#include <ctime>
#include <iostream>
#include "snake.h"
using namespace std;
//测试成功
void Csnake::InitInstance()
{
snakeMap.resize(line); // snakeMap[竖坐标][横坐标]
for(int i=0;i<line;i++)
{
snakeMap[i].resize(row);
for(int j=0;j<row;j++)
{
snakeMap[i][j]=' ';
}
}
for(int m=1;m<maxSize+1;m++)
{
//初始蛇身
snakeMap[line/2][m]='@';
//将蛇身坐标压入队列
snakeBody.push(Cmp(m,(line/2)));
//snakeBody[横坐标][竖坐标]
}
//链表头尾
firstSign=snakeBody.back();
secondSign.setPoint(maxSize-1,line/2);
}

//测试成功
int Csnake::GetDirections()const
{
if(GetKeyState(VK_UP)<0) return 1; //1表示按下上键
if(GetKeyState(VK_DOWN)<0) return 2; //2表示按下下键
if(GetKeyState(VK_LEFT)<0) return 3; //3表示按下左键
if(GetKeyState(VK_RIGHT)<0)return 4; //4表示按下右键
return 0;
}

bool Csnake::UpdataGame()
{
//-----------------------------------------------
//初始化得分0
static int score=0;
//获取用户按键信息
int choice;
choice=GetDirections();
cout<<"Total score: "<<score<<endl;
//随机产生食物所在坐标
int r,l;
//开始初始已经吃食,产生一个食物
static bool eatFood=true;
//如果吃了一个,才再出现第2个食物
if(eatFood)
{
do
{
//坐标范围*在(1,1)到(line-2,row-2)对点矩型之间
srand(time(0));
r=(rand()%(row-2))+1; //横坐标
l=(rand()%(line-2))+1;//竖坐标
//如果随机产生的坐标不是蛇身,则可行
//否则重新产生坐标
if(snakeMap[l][r]!='@')
{snakeMap[l][r]='*';}
}while (snakeMap[l][r]=='@');
}
switch (choice)
{
case 1://向上
//如果蛇头和社颈的横坐标不相同,执行下面操作
if(firstSign.rSign!=secondSign.rSign)nextSign.setPoint(firstSign.rSign,firstSign.lSign-1);
//否则,如下在原本方向上继续移动
else nextSign=firstSign+(firstSign-secondSign);
break;
case 2://向下
if(firstSign.rSign!=secondSign.rSign)nextSign.setPoint(firstSign.rSign,firstSign.lSign+1);
else nextSign=firstSign+(firstSign-secondSign);
break;
case 3://向左
if(firstSign.lSign!=secondSign.lSign)nextSign.setPoint(firstSign.rSign-1,firstSign.lSign);
else nextSign=firstSign+(firstSign-secondSign);
break;
case 4://向右
if(firstSign.lSign!=secondSign.lSign)nextSign.setPoint(firstSign.rSign+1,firstSign.lSign);
else nextSign=firstSign+(firstSign-secondSign);
break;
default:
nextSign=firstSign+(firstSign-secondSign);
}
//----------------------------------------------------------
if(getSymbol(nextSign)!='*' && !isDead(nextSign))
//如果没有碰到食物(且没有死亡的情况下),删除蛇尾,压入新的蛇头
{
//删除蛇尾
lastSign=snakeBody.front();
snakeMap[lastSign.lSign][lastSign.rSign]=' ';
snakeBody.pop();
//更新蛇头
secondSign=firstSign;
//压入蛇头
snakeBody.push(nextSign);
firstSign=snakeBody.back();
snakeMap[firstSign.lSign][firstSign.rSign]='@';
//没有吃食
eatFood=false;
return true;
}
//-----吃食-----
else if(getSymbol(nextSign)=='*' && !isDead(nextSign))
{
secondSign=firstSign;
snakeMap[nextSign.lSign][nextSign.rSign]='@';
//只压入蛇头
snakeBody.push(nextSign);
firstSign=snakeBody.back();
eatFood=true;
//加分
score+=20;
return true;
}
//-----死亡-----
else {cout<<"Dead"<<endl;cout<<"Your last total score is "<<score<<endl; return false;}
}

void Csnake::ShowGame()
{
for(int i=0;i<line;i++)
{
for(int j=0;j<row;j++)
cout<<snakeMap[i][j];
cout<<endl;
}
Sleep(1);
system("cls");
}

main.cpp

#include <iostream>
#include "snake.h"
#include <windows.h>
using namespace std;

int main()
{
Csnake s(20);
s.InitInstance();
//s.ShowGame();
int noDead;
do
{
s.ShowGame();
noDead=s.UpdataGame();
}while (noDead);
system("pause");
return 0;
}

热心网友 时间:2023-05-03 00:32

#include <graphics.h>
#include <stdlib.h>
#include <dos.h>
#define DOWN 0x5000
#define UP 0x4800
#define LEFT 0x4b00
#define RIGHT 0x4d00
#define ESC 0x011b
#define N 200
#define M 13
int i,key,j;
int score=0;
struct Food
{
int x;
int y;
int exist; /*µ±Îª0ʱʳÎïÒÑ»­³öÀ´£¬Îª1ʱʳÎïÒѽ¨ºÃ*/
}food;
struct Snake
{
int x[N];
int y[N];
int length;
int direction;
int live; /*µ±Îª1ʱΪ»î×Å£¬Îª0ʱÉßÒÔËÀ*/
}snake;
struct bar()
{
int x[M];
int y[M];
}bar;
void Init();
void Close();
void move();
void drawsnake();
void begin();
void DrawWall();
void touchself();
void touchwall();
void newfood();
void drawfood();
void GameOver();
void GamePlay();
void choosespeed();
void speed();
void expandSnake();
void printscore();
void drawbar();
void touchbar();
void main()
{
Init();
choosespeed();
DrawWall();
drawbar();
begin();
newbar();
GamePlay();
Close();
}
void Init()
{
int gdriver=DETECT,gmode;
initgraph(&gdriver,&gmode,"");
setfillstyle(1,10);
bar(160,170,473,253);
setfillstyle(1,9);
bar(163,173,470,250);
setcolor(13);
outtextxy(200,200,"Welcome to play Snake Game");
setcolor(14);
outtextxy(250,220,"Have a good time!");
outtextxy(210,390,"Press any key to contunue...");
getch();
cleardevice();
}
void DrawWall()
{
cleardevice();
setcolor(11);
setlinestyle(0,0,3);
for(i=50;i<=600;i+=10)
{
rectangle(i,40,i+10,49);
rectangle(i,451,i+10,460); /*½¨Ò»´Ó(50,40)µ½(610,460)µÄǽ*/
}
for(i=40;i<=450;i+=10)
{
rectangle(50,i,59,i+10);
rectangle(601,i,610,i+10);
}
}
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
真三国无双8手柄怎么设置 手柄设置技巧 沈阳机场轻轨的运行间隔是多少 沈抚轻轨概述 沈阳机场轻轨的票价是多少 沈阳轻轨5号线全线站点及时间 沈阳最早和最晚的一班轻轨是几点 内存条是单插一根好,还是双通道好! 碧玉和玛瑙区别 碧玉和玛瑙的区别 碧玉与玛瑙的区别 嘴巴周围长白包颗粒是脂肪粒吗,怎么去除 在dos环境下c语言编程编一个贪吃蛇游戏 鼻子和嘴附近有小颗粒像鸡皮疙瘩一样里面有脂肪粒怎么解决 如何自己编写一个贪吃蛇的游戏软件? 嘴唇上有小颗粒很多是怎么了 求贪吃蛇的C++程序代码 嘴角密密麻麻小颗粒 不痛不痒的。怎么办啊 好久了下不去 我的上嘴唇长了这样的东西,密密麻麻的小颗粒在表皮内,不仔细看就是一片一片的白,不疼不痒的,就类似图 嘴唇、下巴上长了好多的小颗粒,怎么办 用C语言编写贪吃蛇游戏的程序 上火了,嘴角上长了几颗粒粒,怎么办? 贪吃蛇游戏的C语言编程 一般是什么引起上嘴唇有好多白色颗粒状白点,怎样进行 嘴唇上长了很多小颗粒 c#编程贪吃蛇 我的上嘴唇长了好多小颗粒(就上唇有),不痛不痒.谁能告诉是怎么回事啊!?怎样才能让它们消失呢? 贪吃蛇plc编程思路 上嘴唇有些黄色小颗粒 怎么办? 贪吃蛇编程 嘴唇上好多小颗粒,淡白色,密密麻麻是怎么回事,谁能告诉我要任何解决,急 嘴唇上长了好多小颗粒,不痛不痒,密密麻麻 怎样用c++编一个简单的贪吃蛇游戏 急求 设计贪吃蛇实验报告 win7 word自动保存文件被删除了如何恢复? 如何恢复上次保存的word文档?【200分】 word自动恢复的文档不小心被我删掉了,怎么办? word文档编辑完没有保存,还可以恢复吗 word意外关闭后,自动保存的文件误删掉了,后又从回收站还原,但还是找不到,怎么办? 有哪些新能源产品? 国产新能源车有哪些品牌? 新能源汽车有哪些主流品牌? 新能源产品有哪些 新能源汽车前十名品牌是什么? 计算机软考 考了电子商务设计师 有用吗? 还有,有专门挂靠这个证的地方吗? 新能源包括哪些板块? 200分求,软考的体系是什么? 电子商务设计师这个证书到底管不管用? 什么是电子商务设计师,能从事什么工作。工作时限是多长。 请问电子商务设计师是什么,难不难? 新能源车什么牌子比较好?