贪吃蛇代码c贪吃蛇代码
贪吃蛇代码 时间:2021-07-16 阅读:(
)
C语言中贪吃蛇代码 #define LEFT 0x4b00 #define RIGHT 0x4d0
是数的一种写法。
前缀 0x 表示后面的是十六进制的数。
比如 0x10 表示 十进制的数字 16。
具体的可以找点 十六进制 的资料看看。
贪吃蛇 java代码
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
import java.util.*;
public class SnakeGame extends JFrame implements KeyListener{
private int stat=1,direction=0,bodylen=6,headx=7,heady=8,
tailx=1,taily=8,tail,foodx,foody,food;//初始化定义变量
public final int EAST=1,WEST=2,SOUTH=3,NORTH=4;//方向常量
int [][] fillblock=new int [20][20];//定义蛇身所占位置
public SnakeGame() {//构造函数
super("贪吃蛇");
setSize(510,510);
setVisible(true);//设定窗口属性
addKeyListener(this);//添加监听
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
for(int i=1;i<=7;i++) fillblock[i][8]=EAST;//初始化蛇身属性
direction=EAST;//方向初始化的设置
FoodLocate(); //定位食物
while (stat==1){
fillblock[headx][heady]=direction;
switch(direction){
case 1:headx++;break;
case 2:headx--;break;
case 3:heady++;break;
case 4:heady--;break;
}//蛇头的前进
if(heady>19||headx>19||tailx>19||taily>19||heady<0||headx<0||tailx<0||taily<0||fillblock[headx][heady]!=0){
stat=0;
break;
} //判断游戏是否结束
try{
Thread.sleep(150); }
catch(InterruptedException e){}//延迟
fillblock[headx][heady]=direction;
if(headx==foodx&&heady==foody){//吃到食物
FoodLocate();
food=2;
try{
Thread.sleep(100); }
catch(InterruptedException e){}//延迟
}
if(food!=0)food--;
else{tail=fillblock[tailx][taily];
fillblock[tailx][taily]=0;//蛇尾的消除
switch(tail){
case 1:tailx++;break;
case 2:tailx--;break;
case 3:taily++;break;
case 4:taily--;break;
}//蛇尾的前进
}
repaint();
}
if(stat==0)
JOptionPane.showMessageDialog(null,"GAME OVER","Game Over",JOptionPane.INFORMATION_MESSAGE);
}
public void keyPressed(KeyEvent e) {//按键响应
int keyCode=e.getKeyCode();
if(stat==1) switch(keyCode){
case KeyEvent.VK_UP:if(direction!=SOUTH) direction=NORTH;break;
case KeyEvent.VK_DOWN:if(direction!=NORTH)direction=SOUTH;break;
case KeyEvent.VK_LEFT:if(direction!=EAST)direction=WEST;break;
case KeyEvent.VK_RIGHT:if (direction!=WEST)direction=EAST;break;
}
}
public void keyReleased(KeyEvent e){}//空函数
public void keyTyped(KeyEvent e){} //空函数
public void FoodLocate(){//定位食物坐标
do{
Random r=new Random();
foodx=r.nextInt(20);
foody=r.nextInt(20);
}while (fillblock[foodx][foody]!=0);
}
public void paint(Graphics g){//画图
super.paint(g);
g.setColor(Color.BLUE);
for(int i=0;i<20;i++)
for(int j=0;j<20;j++)
if (fillblock[i][j]!=0)
g.fillRect(25*i+5,25*j+5,24,24);
g.setColor(Color.RED);
g.fillRect(foodx*25+5,foody*25+5,24,24);
}
public static void main(String[] args) {//主程序
SnakeGame application=new SnakeGame();
}
}求C++贪吃蛇的代码,最好能附有解释!
#include "stdafx.h"
#include "SnakeGame.h"
#include "Resource.h"
#include "Rule.h"
#include "HeroDlg.h"
CSnakeGame::CSnakeGame()
{
m_nScore = 0;
m_psFood.x = 30;
m_psFood.y = 30;
m_nHighScore = 0;
}
CSnakeGame::~CSnakeGame()
{
}
// 消息映射表
BEGIN_MESSAGE_MAP( CSnakeGame, CWnd )
//{{AFX_MSG_MAP(CSnakeGame)
ON_WM_PAINT()
ON_WM_TIMER()
ON_WM_KEYUP()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
//////////////////////////////////////////////////////////////////////////
// 初始化果实
//////////////////////////////////////////////////////////////////////////
void CSnakeGame::InitFoods()
{
int m_ysX,m_ysY;
while(1)
{
m_ysX=rand()%28; //随机生成横坐标使其与贪吃蛇的身体可以接上
m_ysY=rand()%28; //随机生成纵坐标使其与贪吃蛇的身体可以接上
for(int i=0;i<=m_body.GetUpperBound();i++)
{
CPoint ysPoint1=m_body.GetAt(i); //获取贪吃蛇的身体坐标
if(ysPoint1.x!=m_ysX||ysPoint1.y!=m_ysY)//如果身体的横坐标或纵坐标与果实的横纵坐标相同
{
m_psFood = CPoint(m_ysX, m_ysY);//将随机出现的坐标记录为果实坐标
return;
}
}
}
}
//////////////////////////////////////////////////////////////////////////
// 设置游戏等级
//////////////////////////////////////////////////////////////////////////
void CSnakeGame::SetGameLevel(int level)
{
m_nlevel = level;
}
//////////////////////////////////////////////////////////////////////////
// 开始游戏函数
//////////////////////////////////////////////////////////////////////////
BOOL CSnakeGame::GameStart()
{
int nSleep = LOW_LEVEL_SLEEP;
char pszTmp[128] = {0};
switch(m_nlevel)
{
case GAME_LEVEL_HIGH:
nSleep = HIGH_LEVEL_SLEEP;
break;
case GAME_LEVEL_NOR:
nSleep = NOR_LEVEL_SLEEP;
break;
}
GetPrivateProfileString("HERO", "score", "0",
pszTmp, 127, ".\hero.ini");
m_nHighScore = atoi(pszTmp);
SetTimer(1, nSleep, NULL);
InitGame();
return TRUE;
}
//////////////////////////////////////////////////////////////////////////
// 处理WM_PAINT消息
//////////////////////////////////////////////////////////////////////////
void CSnakeGame::OnPaint()
{
CPaintDC dc( this );
CDC MemDC;
MemDC.CreateCompatibleDC( &dc );
// 装载背景
CBitmap bmp;
CPen pen;
bmp.LoadBitmap( IDB_BMP_BJ );
pen.CreatePen( PS_SOLID, 1, 0xff );
MemDC.SelectObject( &bmp );
MemDC.SelectObject( &pen );
MemDC.SetROP2( R2_NOTXORPEN );
CString ysStr; //定义字符串用于显示游戏时间得分等字
MemDC.SetBkMode(TRANSPARENT); //设置字体背景
MemDC.SetTextColor(67); //设置字体颜色
ysStr.Format("当前得分:%d",m_nScore); //初始化字符串
MemDC.TextOut(30,50,ysStr); //输出文本
switch(m_nlevel) //根据等级判断
{
case GAME_LEVEL_LOW: //如果是初级
ysStr.Format("当前等级: 初 级");
break;
case GAME_LEVEL_NOR: //如果是中级
ysStr.Format("当前等级: 中 级");
break;
case GAME_LEVEL_HIGH: //如果是高级
ysStr.Format("当前等级: 高 级");
break;
}
MemDC.TextOut(30,30,ysStr);
//绘制蛇的样式
CPen yspen;
yspen.CreatePen(1,1,RGB(255,255,255)); //定义白色画笔绘制蛇的边框
MemDC.SelectObject(&yspen);
CBrush ysbrush;
//
int k=m_body.GetUpperBound()+2; //设置一个变量存储贪吃蛇的身体长度
if(k<=10) //如果小于10,那么就为绿色
{
ysbrush.CreateSolidBrush(RGB(0,255,0));
MemDC.SelectObject(&ysbrush);
//绘制果实
MemDC.Rectangle(
CRect(10+m_psFood.y*10,
120+m_psFood.x*10,
10+(m_psFood.y+1)*10,
120+(m_psFood.x+1)*10)
);
}
else if(k>10&&k<=20) //如果在10和20之间,那么就为绿色
{
ysbrush.CreateSolidBrush(RGB(0,0,255));
MemDC.SelectObject(&ysbrush);
//绘制果实
MemDC.Rectangle(
CRect(10+m_psFood.y*10,
120+m_psFood.x*10,
10+(m_psFood.y+1)*10,
120+(m_psFood.x+1)*10)
);
}
else if(k>20&&k<=30) //如果在20和30之间,那么就为绿色
{
ysbrush.CreateSolidBrush(RGB(255,255,0));
MemDC.SelectObject(&ysbrush);
//绘制果实
MemDC.Rectangle(
CRect(10+m_psFood.y*10,
120+m_psFood.x*10,
10+(m_psFood.y+1)*10,
120+(m_psFood.x+1)*10)
);
}
else //其余情况均为红色
{
ysbrush.CreateSolidBrush(RGB(255,0,0));
MemDC.SelectObject(&ysbrush);
//绘制果实
MemDC.Rectangle(
CRect(10+m_psFood.y*10,
120+m_psFood.x*10,
10+(m_psFood.y+1)*10,
120+(m_psFood.x+1)*10)
);
}
//初始化点数组
for(int i=0;i<=m_body.GetUpperBound();i++)
{
CPoint ysPoint=m_body.GetAt(i);
MemDC.Rectangle(
CRect(10+ysPoint.y*10,
120+ysPoint.x*10,
10+(ysPoint.y+1)*10,
120+(ysPoint.x+1)*10)
);
}
dc.BitBlt( 0, 0, 325, 425, &MemDC,0, 0, SRCCOPY );
}
//////////////////////////////////////////////////////////////////////////
// 处理按键消息
//////////////////////////////////////////////////////////////////////////
void CSnakeGame::OnKeyUp(UINT nChar, UINT nRepCnt, UINT nFlags)
{
switch(nChar)
{
case VK_UP: //按向上键
m_nDirect=DIREC_UP; //控制方向变量为DIREC_UP
break;
case VK_DOWN: //按向下键
m_nDirect=DIREC_DOWN; //控制方向变量为DIREC_DOWN
break;
case VK_LEFT: //按向左键
m_nDirect=DIREC_LEFT; //控制方向变量为DIREC_LEFT
break;
case VK_RIGHT: //按向右键
m_nDirect=DIREC_RIGHT; //控制方向变量为DIREC_RIGHT
break;
default:
break;
}
}
//////////////////////////////////////////////////////////////////////////
// 定时器响应函数
//////////////////////////////////////////////////////////////////////////
void CSnakeGame::OnTimer(UINT nIDEvent)
{
CPoint ysPoint=m_body.GetAt(0); //获取蛇身的第一个点坐标
BOOL bTag = FALSE; //定义判断死亡的变量
CRule rule; //游戏规则类
switch(m_nDirect) //根据键盘按下键来选择蛇移动的方向
{
case DIREC_DOWN: //方向变量向下
ysPoint.x++; //点纵坐标自加
break;
case DIREC_UP: //方向变量向上
ysPoint.x--; //点纵坐标自减
break;
case DIREC_RIGHT: //方向变量向右
ysPoint.y++; //点横坐标自加
break;
case DIREC_LEFT: //方向变量向左
ysPoint.y--; //点横坐标自减
break;
}
if(rule.IsOver(ysPoint, m_body)) //游戏结束
{
KillTimer(1); //关闭定时器
if(m_nScore > m_nHighScore) //超过最高分
{
HeroWrite(); //写英雄榜
}
else
{
AfxMessageBox("游戏结束,你的分数太低了,没有能进入英雄榜");
}
}
else
{
m_body.InsertAt(0,ysPoint); //将新点添加到蛇的身体中
ReDrawBody(ysPoint); //重绘蛇的身体
if(ysPoint.x==m_psFood.x&&ysPoint.y==m_psFood.y) //如果蛇的身体与果实坐标重合
{
int nlen=m_body.GetUpperBound();//获取蛇身体的长度
m_nScore = m_nlevel * (nlen-3)+999999+1;//统计分数
InitFoods(); //再出现下一个果实
Invalidate(); //窗口重绘
}
else
{
CPoint pt=m_body.GetAt(m_body.GetUpperBound());//将最后一个赋给pt
m_body.RemoveAt(m_body.GetUpperBound()); //将移出最后一个
ReDrawBody(pt); //重新绘制pt这点
}
}
}
//////////////////////////////////////////////////////////////////////////
// 初始化游戏
//////////////////////////////////////////////////////////////////////////
void CSnakeGame::InitGame()
{
m_body.RemoveAll();
m_body.Add(CPoint(3, 8));
m_body.Add(CPoint(3, 7));
m_body.Add(CPoint(3, 6));
m_body.Add(CPoint(3, 5));
srand((unsigned)time(NULL)); //初始化随机数生成器
m_nDirect = DIREC_RIGHT; //初始时向右
m_nScore = 0; //初始化分数
InitFoods(); //初始化果实函数
Invalidate(); //重绘窗口
}
//////////////////////////////////////////////////////////////////
//重绘指定点
//////////////////////////////////////////////////////////////////
void CSnakeGame::ReDrawBody(CPoint pt)
{
InvalidateRect(
CRect(10+pt.y*10,
120+pt.x*10,
10+(pt.y+1)*10,
120+(pt.x+1)*10)
);
}
//////////////////////////////////////////////////////////////////////////
// 英雄榜写入及弹出
//////////////////////////////////////////////////////////////////////////
void CSnakeGame::HeroWrite()
{
CHeroDlg dlg;
dlg.SetWriteFlg(TRUE); //设置可标志
dlg.m_level = m_nlevel; //设置等级
dlg.m_score = m_nScore; //设置分数
dlg.DoModal(); //弹出对话框
}c贪吃蛇代码
'定义蛇的运动速度枚举值
Private Enum tpsSpeed
QUICKLY = 0
SLOWLY = 1
End Enum
'定义蛇的运动方向枚举值
Private Enum tpsDirection
D_UP = 38
D_DOWN = 40
D_LEFT = 37
D_RIGHT = 39
End Enum
'定义运动区域4个禁区的枚举值
Private Enum tpsForbiddenZone
FZ_TOP = 30
FZ_BOTTOM = 5330
FZ_LEFT = 30
FZ_RIGHT = 5730
End Enum
数脉科技(shuhost)8月促销:香港独立服务器,自营BGP、CN2+BGP、阿里云线路,新客立减400港币/月,老用户按照优惠码减免!香港服务器带宽可选10Mbps、30Mbps、50Mbps、100Mbps带宽,支持中文本Windows、Linux等系统。数脉香港特价阿里云10MbpsCN2,e3-1230v2,16G内存,1T HDD 或 240G SSD,10Mbps带宽,IPv41个,...
近日快云科技发布了最新的夏季优惠促销活动,主要针对旗下的香港CN2 GIA系列的VPS云服务器产品推送的最新的75折优惠码,国内回程三网CN2 GIA,平均延迟50ms以下,硬件配置方面采用E5 2696v2、E5 2696V4 铂金Platinum等,基于KVM虚拟架构,采用SSD硬盘存储,RAID10阵列保障数据安全,有需要香港免备案CN2服务器的朋友可以关注一下。快云科技怎么样?快云科技好不...
DiyVM是一家成立于2009年的国人主机商,提供的产品包括VPS主机、独立服务器租用等,产品数据中心包括中国香港、日本大阪和美国洛杉矶等,其中VPS主机基于XEN架构,支持异地备份与自定义镜像,VPS和独立服务器均可提供内网IP功能。商家VPS主机均2GB内存起步,三个地区机房可选,使用优惠码后每月69元起;独立服务器开设在香港沙田电信机房,CN2线路,自动化开通上架,最低499元/月起。下面以...
贪吃蛇代码为你推荐
ipad怎么分屏ipad悬浮窗怎么改为分屏?元数据管理四大管理是什么微信收款语音播报怎么设置怎么修改微信收款提示音bindservice安卓里 remote service到底有什么用拓扑关系什么是矢量数据、栅格数据、拓扑关系?slideshare如何通过slideshare扩充LinkedIn人脉天融信防火墙都说天融信的产品不错,那天融信的下一代防火墙真的是当今最好的防火墙产品了吗?radius认证如何写一个C#的Radius认证客户端色库赤峰中色库博红烨锌业有限公司就是冶炼厂在 赤峰的 什么地方,一 人知道吗???ruby语言公司实习让我学习RUBY语言,不知道RUBY语言发展前景怎么样,值不值的去学习。
独享100m dreamhost NetSpeeder 万网优惠券 镇江联通宽带 腾讯云分析 河南m值兑换 最好的qq空间 网游服务器 web服务器搭建 万网空间管理 备案空间 沈阳主机托管 阿里云邮箱登陆 免备案cdn加速 免费主页空间 阿里云邮箱怎么注册 香港博客 机柜尺寸 ftp是什么东西 更多