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

贪吃蛇游戏的C语言编程

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

我来回答

1个回答

热心网友 时间:2022-04-18 23:26

#include <windows.h>
#include <ctime>
#include <iostream>
#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

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");
}

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

这个代码可以运行的,记得给分啦
用c语言写贪吃蛇

/*玩游戏具体过程*/ void GamePlay(void){setcolor(5);setlinestyle(SOLID_LINE,0,THICK_WIDTH);/*设置线型*/randomize();/*随机数发生器*/food.yes=1;/*1表示需要出现新食物,0表示已经存在食物*/snake.life=0;/*活着*/snake.direction=1;/*方向往右*/snake.x[0]=320;snake.y[0]=240;/...

求c语言控制面板贪吃蛇源代码

for(j = 0; j &lt; L; j++)printf("%c", GameMap[i][j]);printf("\n");} printf("\n小小C语言贪吃蛇\n");printf("按任意方向键开始游戏\n");getch(); //先接受一个按键,使蛇开始往该方向走 Button(); //取出按键,并判断方向 } void Create_Food() //在地图上随机产生...

求贪吃蛇C语言代码,有一定功能要求

以下是代码 /* 贪吃蛇程序 by champking */#define N 200#include &lt;graphics.h&gt;#include &lt;stdlib.h&gt;#include &lt;dos.h&gt;#define LEFT 0x4b00#define RIGHT 0x4d00#define DOWN 0x5000#define UP 0x4800#define ESC 0x011bint i,key;int score = 0;/*得分*/int gamespeed = 100000;/*游戏...

c语言贪吃蛇代码

include &lt;windows.h&gt; define BEG_X2 define BEG_Y1 define WID20 define HEI20 HANDLE hout;typedef enum {UP, DOWN, LEFT, RIGHT} DIR;typedef struct Snake_body { COORD pos;//蛇身的位置 struct Snake_body *next;//下一个蛇身 struct Snake_body *prev;//前一个蛇身 }SNAKE, *PSNAKE;...

c语言 贪吃蛇 求大食物代码。ps:每吃四个食物随机出现一个加大分值的...

typedef struct snake { int a;int b;struct snake *u;struct snake *n;}snake,*snake1;typedef struct food { int a;int b;}food;int main(){ char c,c0 = 'd';int i,j,k,n=1,t,at;snake p,q;snake *dd,*dd0,*dd1,*dd2;food f;srand(time(NULL));p.u = NULL;p....

c语言贪吃蛇的速度控制程序怎么编

可以Sleep函数设置延时来控制贪吃蛇的速度。 函数名: Sleep功能: 执行挂起一段时间用法: void Sleep(DWORD dwMilliseconds);在VC中使用带上头文件#include &lt;windows.h&gt;( Sleep函数存放头文件:WinBase.h)在gcc编译器中,使用的头文件因gcc版本的不同而不同#include &lt;unistd.h&gt;Sleep()单位为毫秒,sleep()单位为秒(...

C语言贪吃蛇游戏代码

实现贪吃蛇游戏,用户通过键盘操控蛇体,遵循规则移动。游戏画面直观,蛇体碰触自身或窗口边缘判定失败,吃到食物则增长。游戏框架设计利用全局变量与函数,地图构建与蛇体动作实现依靠二维数组。时间控制通过静态变量优化。游戏结束与食物获取,实现蛇体增长功能。代码涉及二维数组、if-else、scanf、局部变量与...

贪吃蛇c语言代码中我看到了这个函数,能不能把这个函数所涉及的知识点...

2: srand(time(NULL)); 初始化随机种子, 你就记住用rand函数之前必须要用这个 3: rand( )随机函数, 食物的x坐标为 1到界面最右边少一个位置中的任意一个值 4: 食物的y坐标为 1到界面最下边少一个位置中的任意一个值 5: 设置光标到食物的坐标位置, 以便打印出食物 ...

贪食蛇游戏,c语言怎么实现多线程, 高悬赏

while(应该通过某个信号来退出这个循环,从而表示游戏结束){ pthread_mutex_lock(&amp;mutex);direction =getchar();pthread_mutex_unlock(&amp;mutex);} } 另外一个控制贪吃蛇移动的时候也要加锁 while(...){ char c;pthread_mutex_lock(&amp;mutex);c = direction;pthread_mutex_unlock(&amp;mutex);switch(c){...

用C语言怎么做贪吃蛇游戏?

贪吃蛇游戏编程c语言 c语言编写贪吃蛇小游戏代码 c语言实现贪吃蛇游戏 贪吃蛇小游戏c语言代码 贪吃蛇小游戏编程 c语言编写贪吃蛇 C语言贪吃蛇实现暂停功能 python贪吃蛇游戏代码详解 java贪吃蛇游戏设计
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
超价观念与固执的区别 阅读摘录24—超价观念 超价观念是不是就是错误观念? 超价观念是一种什么观念? ...把成语补写完整再和右边相应的水果连一连什么小口 227亿的嗓子怎么来的 哪些卡通人物受到孩子们的喜爱? 别再叫我"讴歌王"了!长安UNI-T打响冲击高端首战 现在又没有九寨沟旅游的专列啊 北京丰台车站附近景点_北京清河站附近有什么景点吗 一般是什么引起上嘴唇有好多白色颗粒状白点,怎样进行 嘴唇上长了很多小颗粒 c#编程贪吃蛇 我的上嘴唇长了好多小颗粒(就上唇有),不痛不痒.谁能告诉是怎么回事啊!?怎样才能让它们消失呢? 贪吃蛇plc编程思路 上嘴唇有些黄色小颗粒 怎么办? 贪吃蛇编程 嘴唇上好多小颗粒,淡白色,密密麻麻是怎么回事,谁能告诉我要任何解决,急 求贪吃蛇的程序代码(c语言) 嘴巴上唇长很多白色小颗粒,像鱼籽一样的,请问是什么原因,应该怎么去除? 我嘴唇上长了一些小颗粒,有好几年了,不疼不痒可是好像越来越多了,嘴角处最多,这是什么病?要怎么治啊 我嘴角里面出现很多小颗粒,怎么回事 嘴唇上面长了一些白色的小颗粒要怎么消除 嘴巴周围下巴长很多小颗粒,该怎么办 嘴边有哪种摸起来的小颗粒怎么去掉? 一个女头像背景是蓝色头顶拿着花情侣头像 卡通情侣头像女的胸前拿花 求情侣头像,女的头上戴花,且有花遮住左眼,求另一半的图片。在线等,急求! 情侣头像,带花,只要带花的都给我一下 求情侣头像有花遮脸的 上火了,嘴角上长了几颗粒粒,怎么办? 用C语言编写贪吃蛇游戏的程序 嘴唇、下巴上长了好多的小颗粒,怎么办 我的上嘴唇长了这样的东西,密密麻麻的小颗粒在表皮内,不仔细看就是一片一片的白,不疼不痒的,就类似图 嘴角密密麻麻小颗粒 不痛不痒的。怎么办啊 好久了下不去 求贪吃蛇的C++程序代码 嘴唇上有小颗粒很多是怎么了 如何自己编写一个贪吃蛇的游戏软件? 鼻子和嘴附近有小颗粒像鸡皮疙瘩一样里面有脂肪粒怎么解决 在dos环境下c语言编程编一个贪吃蛇游戏 嘴巴周围长白包颗粒是脂肪粒吗,怎么去除 关於贪吃蛇编程 嘴唇上长了好多小颗粒,不痛不痒,密密麻麻 怎样用c++编一个简单的贪吃蛇游戏 急求 设计贪吃蛇实验报告 win7 word自动保存文件被删除了如何恢复? 如何恢复上次保存的word文档?【200分】 word自动恢复的文档不小心被我删掉了,怎么办? word文档编辑完没有保存,还可以恢复吗 word意外关闭后,自动保存的文件误删掉了,后又从回收站还原,但还是找不到,怎么办?