贪吃蛇游戏的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 < 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 <graphics.h>#include <stdlib.h>#include <dos.h>#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 <windows.h> 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 <windows.h>( Sleep函数存放头文件:WinBase.h)在gcc编译器中,使用的头文件因gcc版本的不同而不同#include <unistd.h>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(&mutex);direction =getchar();pthread_mutex_unlock(&mutex);} } 另外一个控制贪吃蛇移动的时候也要加锁 while(...){ char c;pthread_mutex_lock(&mutex);c = direction;pthread_mutex_unlock(&mutex);switch(c){...
用C语言怎么做贪吃蛇游戏?