关于贪食蛇 C++2
发布网友
发布时间:2023-09-21 04:24
我来回答
共4个回答
热心网友
时间:2024-10-20 18:39
纯{MFC}贪吃蛇(豆子和蛇都会,变色,边速度)
182行代码
#include<afxwin.h>
#include<time.h>
#include<stdlib.h>
class CMainWnd:public CFrameWnd{
public:
CMainWnd():uAddX(0),uAddY(0),lpptSNK(NULL),uSNKLong(0),ptBEA(5,5),
Eat(false),SNKPace(500),BEAPace(4000){
Create(NULL,"show",WS_OVERLAPPED|WS_SYSMENU|WS_CAPTION,
CRect(0,0,408,465),NULL,NULL,WS_EX_OVERLAPPEDWINDOW);
}
void OnPaint();
void OnChar(UINT,UINT,UINT);
void OnTimer(UINT);
int OnCreate(LPCREATESTRUCT);
void OnClose();
protected:
void SNKMove();
void CreateBEA();
bool Wrap(CPoint);
void Start();
int uAddX;
int uAddY;
bool Eat;
UINT SNKPace;
UINT BEAPace;
CPoint ptBEA;
CBrush **lpMapBrush;
UINT uSNKLong;
CPoint *lpptSNK;
DECLARE_MESSAGE_MAP();
};
BEGIN_MESSAGE_MAP(CMainWnd,CFrameWnd)
ON_WM_CREATE()
ON_WM_CLOSE()
ON_WM_PAINT()
ON_WM_CHAR()
ON_WM_TIMER()
END_MESSAGE_MAP()
class CWinMain:public CWinApp{
public:
virtual BOOL InitInstance(){
m_pMainWnd=new CMainWnd;
m_pMainWnd->ShowWindow(SW_SHOW);
m_pMainWnd->UpdateWindow();
m_pMainWnd->SetTimer(1,500,NULL);
m_pMainWnd->SetTimer(2,8000,NULL);
return TRUE;
}
}theMain;
void CMainWnd::OnPaint(){
CDC *pDC=this->GetDC();
pDC->Rectangle(0,0,400,430);
pDC->Rectangle(0,0,400,400);
char cBuffer[100];
sprintf(cBuffer,"蛇的长度是:%d,蛇的速度是:%d,豆的出现速度是:%d ",
uSNKLong,500-SNKPace,8000-BEAPace);
pDC->TextOut(20,400,cBuffer);
for(UINT i=0;i<uSNKLong;i++){
pDC->SelectObject(*(lpMapBrush+(lpptSNK+i)->x)+(lpptSNK+i)->y);
pDC->Rectangle((lpptSNK+i)->x*20,(lpptSNK+i)->y*20,
(lpptSNK+i)->x*20+20,(lpptSNK+i)->y*20+20);
}
if(!Eat){
pDC->SelectObject(*(lpMapBrush+ptBEA.x)+ptBEA.y);
pDC->Ellipse(ptBEA.x*20,ptBEA.y*20,
ptBEA.x*20+20,ptBEA.y*20+20);
}
pDC->ReleaseAttribDC();
ValidateRect(NULL);
}
void CMainWnd::OnTimer(UINT uID){
if(uID==1)
SNKMove();
else if(uID==2)
CreateBEA();
}
void CMainWnd::OnChar(UINT nChar,UINT,UINT){
if(nChar=='w'){
uAddX=0;
if(!uAddY)uAddY=-1;
}
else if(nChar=='s'){
uAddX=0;
if(!uAddY)uAddY=1;
}
else if(nChar=='a'){
if(!uAddX)uAddX=-1;
uAddY=0;
}
else if(nChar=='d'){
if(!uAddX)uAddX=1;
uAddY=0;
}
}
int CMainWnd::OnCreate(LPCREATESTRUCT){
lpMapBrush=new CBrush*[20];
for(int i=0;i<20;i++){
*(lpMapBrush+i)=new CBrush[20];
for(int j=0;j<20;j++)
(*(lpMapBrush+i)+j)->
CreateSolidBrush(RGB(50+i*10-j*8,50+i*10,255-j*10));
}
Start();
return 1;
}
void CMainWnd::OnClose(){
if(lpptSNK)
delete[]lpptSNK;
for(int i=0;i<20;i++)
delete[]*(lpMapBrush+i);
delete[]lpMapBrush;
DestroyWindow();
}
void CMainWnd::Start(){
if(lpptSNK)
delete[]lpptSNK;
lpptSNK=new CPoint[6];
uAddX=0;
uAddY=0;
SNKPace=500;
BEAPace=8000;
SetTimer(1,SNKPace,NULL);
SetTimer(2,BEAPace,NULL);
uSNKLong=6;
for(int i=1;i<=6;i++)
*(lpptSNK+i-1)=CPoint(6-i,0);
InvalidateRect(NULL);
}
bool CMainWnd::Wrap(CPoint pt){
for(UINT i=0;i<uSNKLong;i++)
if(pt==*(lpptSNK+i))
return true;
return false;
}
void CMainWnd::SNKMove(){
if(!uAddX&&!uAddY)return;
if(uAddX+lpptSNK->x<0||uAddX+lpptSNK->x>=20||
uAddX+lpptSNK->y<0||uAddX+lpptSNK->y>=20||
Wrap(CPoint(lpptSNK->x+uAddX,lpptSNK->y+uAddY))){
if(IDOK==MessageBox("GameOver"))Start();
}
else if(uAddX||uAddY){
CPoint ptBuffer=*(lpptSNK),ptBuffer2;
*(lpptSNK)+=CPoint(uAddX,uAddY);
for(UINT i=1;i<uSNKLong;i++){
ptBuffer2=*(lpptSNK+i);
*(lpptSNK+i)=ptBuffer;
ptBuffer=ptBuffer2;
}
if(!Eat)
if(*(lpptSNK)==ptBEA){
Eat=true;
uSNKLong+=1;
CPoint *lpptOldSNK=lpptSNK;
lpptSNK=new CPoint[uSNKLong];
*(lpptSNK+uSNKLong-1)=ptBuffer;
for(UINT j=0;j<uSNKLong-1;j++)
*(lpptSNK+j)=*(lpptOldSNK+j);
SNKPace-=10;
BEAPace-=50;
if(uSNKLong>=20)
if(MessageBox("完成游戏!")==IDOK)Start();
SetTimer(1,SNKPace,NULL);
SetTimer(2,BEAPace,NULL);
}
}
InvalidateRect(NULL);
}
void CMainWnd::CreateBEA(){
srand((unsigned)time(0));
CPoint ptBuffer;
for(int i=0;i<10;i++){
ptBuffer.x=rand()%20;
ptBuffer.y=rand()%20;
if(!Wrap(ptBuffer)){
ptBEA=ptBuffer;
Eat=false;
break;
}
}
InvalidateRect(NULL);
}
参考资料:http://tieba.baidu.com/f?kz=436243253
热心网友
时间:2024-10-20 18:39
你先想一下你的贪吃蛇是如何移动的,比如一出生时他是一块方块,然后走着走着碰到了第二块方块,于是就变成两块方块一起移动,依次这样下去蛇越来越长了。因为吃下去的方块是连在一起的,也就是说当前第一个方块所在的位置将成为第二个方块在下一个时刻所在的位置,依次类推,这样蛇看上去就是连在一起的在移动了。接下来你只要用代码把上面的思路表示出来就行了,我以前就是靠这个思路用D3D写了一个贪吃蛇,希望这段思路能对你有帮助。
热心网友
时间:2024-10-20 18:40
从基础做起...循序渐进才能学好MFC,,到时贪食蛇不是不在话下?
热心网友
时间:2024-10-20 18:41
我有C 语言的代友和思路,不知有用否?
可以的话加我.
c语言 贪吃蛇 程序
include <conio.h> 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;//前一个蛇...
求用c语言编写的贪吃蛇程序
C语言实现的简单贪吃蛇程序 以下是一个基本的贪吃蛇程序的C语言代码示例。请注意,这是一个非常简单的实现,主要用于展示贪吃蛇游戏的核心逻辑,界面和更多功能可能需要进一步开发和完善。c include include include // 用于延时和获取键盘状态 include // 用于设置颜色和清屏 // 定义蛇的部分结构 typedef...
求c语言的贪吃蛇的代码 能运行的
void gotoxy(int x, int y)
用c语言写贪吃蛇
/*蛇的第二节位置*/snake.node=3;/*节数*/PrScore();/*输出得分*/while(1)/*可以重复玩游戏,压ESC键结束*/{while(!kbhit())/*在没有按键的情况下,蛇自己移动身体*/{if(food.yes==1)/*需要出现新食物*/{food.x=rand()%360+70;food.y=rand()%250+60;while(food.x%10!=0)/*...
C语言课程设计,贪吃蛇应该怎么做?
for(i=snake.node-1;i>0;i--)/*蛇的每个环节往前移动,也就是贪吃蛇的关键算法*/ { snake.x[i]=snake.x[i-1]; snake.y[i]=snake.y[i-1]; } /*1,2,3,4表示右,左,上,下四个方向,通过这个判断来移动蛇头*/ switch(snake.direction) { case 1:snake.x[0]+=10;break; case 2: snake....
c语言贪吃蛇的速度控制程序怎么编
for(i=snake.node-1;i>0;i--) /*蛇的每个环节往前移动,也就是贪吃蛇的关键算法*/ { snake.x[i] = snake.x[i-1]; snake.y[i] = snake.y[i-1]; } /*1,2,3,4表示右,左,上,下四个方向,通过这个判断来移动蛇头*/ switch(snake.direction) { case 1: snake.x[0] += 10; break; case...
贪吃蛇,c语言,数据结构?
按照题目要求编写的程序如下(见图,图中有重复的地方只需写一次,中间有一行重复)
C语言贪吃蛇游戏代码
实现贪吃蛇游戏,用户通过键盘操控蛇体,遵循规则移动。游戏画面直观,蛇体碰触自身或窗口边缘判定失败,吃到食物则增长。游戏框架设计利用全局变量与函数,地图构建与蛇体动作实现依靠二维数组。时间控制通过静态变量优化。游戏结束与食物获取,实现蛇体增长功能。代码涉及二维数组、if-else、scanf、局部变量与...
关于贪吃蛇两条蛇的运动
第一旋转:第一,食物,二,蛇不停地移动,第三步是检查蛇打自己或墙壁,加紧从第四场比赛有两个分支(A,B): >:第四步,蛇并没有触摸自己或墙壁,蛇去提前和画蛇的运动;第五步,以确定是否蛇到吃的食物,如果蛇到吃的食物,身体变得很长,在原始食物消失;第六步骤中,播放器输入的控制命令,使蛇第七步骤中,第二...
求贪吃蛇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;/*游戏...