贪吃蛇代码效果图(贪吃蛇的简单代码)
admin 发布:2022-12-19 15:27 110
今天给各位分享贪吃蛇代码效果图的知识,其中也会对贪吃蛇的简单代码进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!
本文目录一览:
- 1、求C++贪吃蛇的代码,最好能附有解释!
- 2、求一份java 贪吃蛇的代码
- 3、VB 做一个非常简单的贪吃蛇程序
- 4、求c++贪吃蛇的代码
- 5、VB贪吃蛇代码
- 6、求,贪吃蛇 C语言代码 及其每一步的讲解
求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(k10k=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(k20k=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.xysPoint.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(); //弹出对话框
}
求一份java 贪吃蛇的代码
package games;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.util.*;
import static java.lang.Math.*;//静态导入
/*
* 此类是贪吃蛇的简单实现方法
* 自己可以加入在开始时的设置,比如
* 选关,初始的蛇的长度等等
*/
public class Snake extends JPanel {
private static final long serialVersionUID = 1L;
private Direction dir;// 要走的方向
private int blockWidth = 10;// 块大小
private int blockSpace = 2;// 块之间的间隔
private long sleepTime;// 重画的进间间隔
private MySnake my;
private int total;// 代表蛇的长度
private Rectangle food;// 代表蛇的食物
private volatile boolean go;
private int round;// 表示第几关
public Snake(JFrame jf) {
initOther();
// 为顶级窗口类JFrame添加事件处理函数
jf.addKeyListener(new KeyAdapter() {
public void keyReleased(KeyEvent ke) {
int code = ke.getKeyCode();
if (code == KeyEvent.VK_RIGHT) {
if (dir != Direction.WEST)
dir = Direction.EAST;
}
else if (code == KeyEvent.VK_LEFT) {
if (dir != Direction.EAST)
dir = Direction.WEST;
}
else if (code == KeyEvent.VK_UP) {
if (dir != Direction.SOUTH)
dir = Direction.NORTH;
}
else if (code == KeyEvent.VK_DOWN) {
if (dir != Direction.NORTH)
dir = Direction.SOUTH;
} else if (code == KeyEvent.VK_ENTER) {
if (!go)
initOther();
}
}
});
this.setBounds(300, 300, 400, 400);
this.setVisible(true);
}
// 随机生成一个食物的位置
private void makeFood() {
int x = 40 + (int) (random() * 30) * 12;
int y = 10 + (int) (random() * 30) * 12;
food = new Rectangle(x, y, 10, 10);
}
// 做一些初始化的工作
private void initOther() {
dir = Direction.EAST;
sleepTime = 500;
my = new MySnake();
makeFood();
total = 3;
round = 1;
new Thread(new Runnable() {
public void run() {
go = true;
while (go) {
try {
Thread.sleep(sleepTime);
repaint();
} catch (Exception exe) {
exe.printStackTrace();
}
}
}
}).start();
}
// 处理多少关的函数
private void handleRound() {
if (total == 6) {
round = 2;
sleepTime = 300;
} else if (total == 10) {
round = 3;
sleepTime = 200;
} else if (total == 15) {
round = 4;
sleepTime = 100;
} else if (total == 18) {
round = 5;
sleepTime = 50;
} else if (total == 20) {
round = 6;
sleepTime = 20;
} else if (total 21) {
round = 7;
sleepTime = 15;
}
}
// 把自己的组件全部画出来
public void paintComponent(Graphics g) {
g.setColor(Color.PINK);
g.fillRect(0, 0, this.getWidth(), this.getHeight());
g.setColor(Color.BLACK);
g.drawRect(40, 10, 358, 360);
if (go) {
my.move();
my.draw(g);
g.setFont(new Font("黑体", Font.BOLD, 20));
g.drawString("您的得分:" + (total * 10) + " 第" + round + "关", 40,
400);
} else {
g.setFont(new Font("黑体", Font.BOLD, 20));
g.drawString("游戏结束,按回车(ENTER)键重玩!", 40, 440);
}
g.setColor(Color.RED);
g.fillRect(food.x, food.y, food.width, food.height);
}
private class MySnake {
private ArrayListRectangle list;
public MySnake() {
list = new ArrayListRectangle();
list.add(new Rectangle(160 + 24, 130, 10, 10));
list.add(new Rectangle(160 + 12, 130, 10, 10));
list.add(new Rectangle(160, 130, 10, 10));
}
// 蛇移动的方法
public void move() {
if (isDead()) {
go = false;
return;
}
if (dir == Direction.EAST) {
Rectangle rec = list.get(0);
Rectangle rec1 = new Rectangle(rec.x
+ (blockWidth + blockSpace), rec.y, rec.width,
rec.height);
list.add(0, rec1);
} else if (dir == Direction.WEST) {
Rectangle rec = list.get(0);
Rectangle rec1 = new Rectangle(rec.x
- (blockWidth + blockSpace), rec.y, rec.width,
rec.height);
list.add(0, rec1);
} else if (dir == Direction.NORTH) {
Rectangle rec = list.get(0);
Rectangle rec1 = new Rectangle(rec.x, rec.y
- (blockWidth + blockSpace), rec.width, rec.height);
list.add(0, rec1);
} else if (dir == Direction.SOUTH) {
Rectangle rec = list.get(0);
Rectangle rec1 = new Rectangle(rec.x, rec.y
+ (blockWidth + blockSpace), rec.width, rec.height);
list.add(0, rec1);
}
if (isEat()) {
handleRound();
makeFood();
} else {
list.remove(list.size() - 1);
}
}
// 判断是否吃到了食物
private boolean isEat() {
if (list.get(0).contains(food)) {
total++;
return true;
} else
return false;
}
// 判断是否死了,如果碰壁或者自己吃到自己都算死了
private boolean isDead() {
Rectangle temp = list.get(0);
if (dir == Direction.EAST) {
if (temp.x == 388)
return true;
else {
Rectangle comp = new Rectangle(temp.x + 12, temp.y, 10, 10);
for (Rectangle rec : list) {
if (rec.contains(comp))
return true;
}
}
return false;
} else if (dir == Direction.WEST) {
if (temp.x == 40)
return true;
else {
Rectangle comp = new Rectangle(temp.x - 12, temp.y, 10, 10);
for (Rectangle rec : list) {
if (rec.contains(comp))
return true;
}
}
return false;
} else if (dir == Direction.NORTH) {
if (temp.y == 10)
return true;
else {
Rectangle comp = new Rectangle(temp.x, temp.y - 12, 10, 10);
for (Rectangle rec : list) {
if (rec.contains(comp))
return true;
}
}
return false;
} else if (dir == Direction.SOUTH) {
if (temp.y == 358)
return true;
else {
Rectangle comp = new Rectangle(temp.x, temp.y + 12, 10, 10);
for (Rectangle rec : list) {
if (rec.contains(comp))
return true;
}
}
return false;
} else {
return false;
}
}
// 把自己画出来
public void draw(Graphics g) {
for (Rectangle rec : list) {
g.fillRect(rec.x, rec.y, rec.width, rec.height);
}
}
}
public static void main(String arsg[]) {
JFrame jf = new JFrame("贪吃蛇");
Snake s = new Snake(jf);
jf.getContentPane().add(s, BorderLayout.CENTER);
jf.setBounds(300, 300, 500, 500);
jf.setVisible(true);
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}
// 定义一个枚举,在此也可以用接口或者常量值代替
enum Direction {
EAST, SOUTH, WEST, NORTH;
}
VB 做一个非常简单的贪吃蛇程序
朋友给段代码给你,这个代码不要任何控件,你只需要把以下代码复制到你的窗体代码中就行了,代码很简单,相信你能看懂!仅仅用了一个结构(ShenTi)一个数组(ZhuangTai(23, 23) As Long) 一个变量(GFangXiang)
代码中自动生成了Timer1,Label1控件。以及几个函数(Randomize,Circle,Line,Erase...) 相信这些对于你来说很简单,只是没想到用这些方法来实现而已,现在你开始看看效果吧!
代码如下:
'贪吃蛇代码(无控件、全代码)
Private WithEvents Timer1 As Timer
Private WithEvents Label1 As Label
Dim GFangXiang As Boolean
Dim HWB As Single
Dim She() As ShenTi
Dim X As Long, Y As Long
Dim ZhuangTai(23, 23) As Long
Private Type ShenTi
F As Long
X As Long
Y As Long
End Type
'按键反应 ←↑↓→
Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
Dim C As Long
If KeyCode = 27 Then End 'ESC退出
If KeyCode = 32 Then
If Timer1.Enabled = True Then '空格暂停
Timer1.Enabled = False
Label1.Visible = True
Else '空格开始
Timer1.Enabled = True
Label1.Visible = False
End If
End If
C = UBound(She)
If GFangXiang = True Then Exit Sub
Select Case KeyCode
Case 37 '←
If She(C).F = 2 Then Exit Sub
She(C).F = 0
GFangXiang = True
Case 38 '↑
If She(C).F = 3 Then Exit Sub
She(C).F = 1
GFangXiang = True
Case 39 '↑
If She(C).F = 0 Then Exit Sub
She(C).F = 2
GFangXiang = True
Case 40 '→
If She(C).F = 1 Then Exit Sub
She(C).F = 3
GFangXiang = True
End Select
End Sub
Private Sub Form_Load()
Me.AutoRedraw = True
Me.BackColor = HC000
Me.FillColor = 255
Me.FillStyle = 0
Me.WindowState = 2
Set Timer1 = Controls.Add("VB.Timer", "Timer1")
Set Label1 = Controls.Add("VB.Label", "Label1")
Label1.AutoSize = True
Label1.BackStyle = 0
Label1 = "暂停"
Label1.ForeColor = RGB(255, 255, 0)
Label1.FontSize = 50
ChuShiHua '初始化
End Sub
Private Sub Form_Resize()
On Error GoTo 1:
With Me
If .WindowState 1 Then
.Cls
.ScaleMode = 3
HWB = .ScaleHeight / .ScaleWidth
.ScaleWidth = 24
.ScaleHeight = 24
Label1.Move (Me.ScaleWidth - Label1.Width) / 2, (Me.ScaleHeight - Label1.Height) / 2
HuaTu
Me.Line (X, Y)-(X + 1, Y + 1), RGB(255, 255, 0), BF
End If
End With
1:
End Sub
Private Sub Timer1_Timer()
Dim C As Long, I As Long
On Error GoTo 2:
QingChu '清图
C = UBound(She)
Select Case She(C).F
Case 0
If ZhuangTai(She(C).X - 1, She(C).Y) = 2 Then
C = C + 1
ReDim Preserve She(C)
She(C).F = She(C - 1).F
She(C).X = She(C - 1).X - 1
She(C).Y = She(C - 1).Y
ChanShengShiWu
GoTo 1:
ElseIf ZhuangTai(She(C).X - 1, She(C).Y) = 1 Then
GoTo 2:
End If
Case 1
If ZhuangTai(She(C).X, She(C).Y - 1) = 2 Then
C = C + 1
ReDim Preserve She(C)
She(C).F = She(C - 1).F
She(C).X = She(C - 1).X
She(C).Y = She(C - 1).Y - 1
ChanShengShiWu
GoTo 1:
ElseIf ZhuangTai(She(C).X, She(C).Y - 1) = 1 Then
GoTo 2:
End If
Case 2
If ZhuangTai(She(C).X + 1, She(C).Y) = 2 Then
C = C + 1
ReDim Preserve She(C)
She(C).F = She(C - 1).F
She(C).X = She(C - 1).X + 1
She(C).Y = She(C - 1).Y
ChanShengShiWu
GoTo 1:
ElseIf ZhuangTai(She(C).X + 1, She(C).Y) = 1 Then
GoTo 2:
End If
Case 3
If ZhuangTai(She(C).X, She(C).Y + 1) = 2 Then
C = C + 1
ReDim Preserve She(C)
She(C).F = She(C - 1).F
She(C).X = She(C - 1).X
She(C).Y = She(C - 1).Y + 1
ChanShengShiWu
GoTo 1:
ElseIf ZhuangTai(She(C).X, She(C).Y + 1) = 1 Then
GoTo 2:
End If
End Select
ZhuangTai(She(0).X, She(0).Y) = 0
For I = 0 To C
Select Case She(I).F
Case 0
She(I).X = She(I).X - 1
Case 1
She(I).Y = She(I).Y - 1
Case 2
She(I).X = She(I).X + 1
Case 3
She(I).Y = She(I).Y + 1
End Select
Next
TiaoZheng
1:
GFangXiang = False
ZhuangTai(She(C).X, She(C).Y) = 1
HuaTu
Exit Sub
2: '游戏结束
If MsgBox("得分:" UBound(She) - 2 "分 " vbCrLf "游戏结束,点“是”重新开始游戏,点“否”", vbYesNo, "贪吃蛇") = vbYes Then
ChuShiHua
Else
End
End If
End Sub
'初始化
Private Sub ChuShiHua()
Me.Cls
Timer1.Enabled = True
Timer1.Interval = 50
Erase ZhuangTai
ReDim She(2)
She(0).F = 2
She(0).X = 9
She(0).Y = 11
ZhuangTai(9, 11) = 1
She(1).F = 2
She(1).X = 10
She(1).Y = 11
ZhuangTai(10, 11) = 1
She(2).F = 2
She(2).X = 11
She(2).Y = 11
ZhuangTai(11, 11) = 1
HuaTu '画图
ChanShengShiWu
End Sub
'清图
Private Sub QingChu()
Dim I As Long
For I = 0 To UBound(She)
Me.Line (She(I).X, She(I).Y)-(She(I).X + 1, She(I).Y + 1), Me.BackColor, BF
Next
End Sub
'画图 蛇
Private Sub HuaTu()
Dim I As Long
For I = 0 To UBound(She)
Me.Circle (She(I).X + 0.5, She(I).Y + 0.5), 0.49, RGB(255, 255, 0), , , HWB
Next
End Sub
Private Sub TiaoZheng()
Dim I As Long
For I = 0 To UBound(She) - 1
She(I).F = She(I + 1).F
Next
End Sub
'随机产生食物
Private Sub ChanShengShiWu()
Randomize Timer
1:
X = Int(Rnd * 24)
Y = Int(Rnd * 24)
If ZhuangTai(X, Y) 0 Then GoTo 1:
ZhuangTai(X, Y) = 2
Me.Line (X, Y)-(X + 1, Y + 1), RGB(255, 255, 0), BF
End Sub
求c++贪吃蛇的代码
/*
贪吃蛇游戏,由于是C++源码 且 用到Windows API ,是控制台界面不是图形界面,需要用VC++6.0 或 VC++2010 在windows环境编译运行。如果符合上述条件一定可以编译运行zjlj,2015.3.16
*/
#define DEBUG 0 //当程序在调试阶段时 DEBUG为 1
#includeiostream
#includewindows.h
#includetime.h
#includeconio.h
using namespace std;
void readini(FILE **fphead, int *score, char *argv[]) //创建或打开一个和运行文件对应的ini文件,读取最高纪录
{
char filename[200],*pfilename;
int flag=-1,i;
strcpy(filename,argv[0]);
for(i=0;filename[i]!='\0';i++)
{
if ('.'==filename[i])flag=1;
}
if(1==flag)
{
filename[i-1]='i';
filename[i-2]='n';
filename[i-3]='i';
}
else
{
filename[i]='.';
filename[i+1]='i';
filename[i+2]='n';
filename[i+3]='i';
filename[i+4]='\0';
}
for(;filename[i]!='\\'i=0;i--)pfilename=filename[i];
if ( (*fphead=fopen(pfilename, "rb+"))==NULL)
{
if ( (*fphead=fopen(pfilename, "wb+"))==NULL)
{
printf("无法创建或打开\"%s\"文件\n",pfilename);
system("pause");
exit(0);
}
}
else
{
fread(score,sizeof(int),1,*fphead);
}
}
void writeini(FILE **fphead, int *score, char *argv[]) //打开一个和运行文件对应的ini文件,写入最高纪录
{
char filename[200],*pfilename;
int flag=-1,i;
strcpy(filename,argv[0]);
for(i=0;filename[i]!='\0';i++)
{
if ('.'==filename[i])flag=1;
}
if(1==flag)
{
filename[i-1]='i';
filename[i-2]='n';
filename[i-3]='i';
}
else
{
filename[i]='.';
filename[i+1]='i';
filename[i+2]='n';
filename[i+3]='i';
filename[i+4]='\0';
}
for(;filename[i]!='\\'i=0;i--)pfilename=filename[i];
if ( (*fphead=fopen(pfilename, "wb+"))==NULL)
{
printf("无法写入\"%s\"文件,磁盘写保护!\n",pfilename);
system("pause");
exit(0);
}
else
{
rewind(*fphead);
fwrite(score,sizeof(int),1,*fphead);
fclose(*fphead);
}
}
void gotoxy(int x,int y)//光标定位,光标定位函数SetConsoleCursorPosition是左上角位置是0,0然后向左向下延伸
{
COORD pos;
pos.X=2*y;
pos.Y=x;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),pos);
}
void color(int a)//颜色函数
{
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),a);
}
void Refresh(int q[][22], int grade, int gamespeed, int length,int score) // 输出贪吃蛇棋盘
{
int i,j;
for(i=0;i22;i++)
{
for(j=0;j22;j++)
{
if(q[i][j]==0)//输出棋盘空白
{
gotoxy(i,j);
color(11);
cout"■";
}
if(q[i][j]==1||q[i][j]==2)//输出棋盘墙壁
{
gotoxy(i,j);
color(11);
cout"□";
}
if(q[i][j]==3)//输出蛇头
{
gotoxy(i,j);
color(14);
cout"★";
}
if(q[i][j]==4)//输出蛇身
{
gotoxy(i,j);
color(12);
cout"◆";
}
if(q[i][j]==5)//输出果子
{
gotoxy(i,j);
color(12);
cout"●";
}
}
if(i==0) cout "\t***********************";
if(i==1) cout "\t等级为:" grade;//显示等级
if(i==3) cout "\t自动前进时间";
if(i==4) cout "\t间隔为:" gamespeed "ms";//显示时间
if(i==6) cout "\t历史最高分为:" score "分";
if(i==7) cout "\t你现在得分为:" (length+(grade-1)*8)*10 "分";
if(i==8) cout "\t**********************";
if(i==9) cout "\t游戏说明:";
if(i==10) cout "\t(1)用小键盘方向键控制";
if(i==11) cout "\t蛇头运动方向;";
if(i==12) cout "\t(2)蛇每吃一个果子蛇身";
if(i==13) cout "\t增加一节;";
if(i==14) cout "\t(3)蛇咬到自己或碰到墙";
if(i==15) cout "\t壁游戏结束。";
if(i==18) cout "\t**********************";
if(i==19) cout "\tC/C++语言作业:";
if(i==20) cout "\tzjlj,2015.03.16 ";
}
}
int main(int argc, char *argv[]){
int tcsQipan[22][22]; // 贪吃蛇棋盘是一个二维数组(如22*22,包括墙壁)
int i,j,score,directiontemp;
FILE *fpini;//*fpini 信息文件
readini(fpini, score, argv);//读取ini文件的最高纪录
if (score0)//最高成绩小于零设置为零,初建文件会是负数
score=0;
while(1)
{
for(i=1;i=20;i++)
for(j=1;j=20;j++)
tcsQipan[i][j]=0; //贪吃蛇棋盘相应坐标标上中间空白部分的标志0
for(i=0;i=21;i++)
tcsQipan[0][i] = tcsQipan[21][i] = 1; //贪吃蛇棋盘相应坐标标上上下墙壁的标志1
for(i=1;i=20;i++)
tcsQipan[i][0] = tcsQipan[i][21] = 2; //贪吃蛇棋盘相应坐标标上左右墙壁的标志2
int tcsZuobiao[2][500]; //蛇的坐标数组
for(i=0; i4; i++)
{
tcsZuobiao[0][i] = 1;//蛇身和蛇头的x坐标
tcsZuobiao[1][i] = i + 1;//蛇身和蛇头的y坐标
}
int head = 3,tail = 0;//标示蛇头和蛇尾的数组偏移量
for(i=1;i=3;i++)
tcsQipan[1][i]=4; //蛇身
tcsQipan[1][4]=3; //蛇头
int x1, y1; // 随机出果子
srand(time(0));//设置随机种子
do
{
x1=rand()%20+1;
y1=rand()%20+1;
}
while(tcsQipan[x1][y1]!=0);//如果不是在空白处重新出果子
tcsQipan[x1][y1]=5;//贪吃蛇棋盘相应坐标标上果子的标志5
color(12);
cout"\n\n\t\t\t\t贪吃蛇游戏即将开始 !"endl;//准备开始
long start,starttemp;
int grade = 1, length = 4; //设置初始等级和蛇的初始长度
int gamespeed = 500; //设置初始前进时间间隔
for(i=3;i=0;i--)
{
start=clock();
while(clock()-start=1000);
system("cls");
if(i0)
cout "\n\n\t\t\t\t进入倒计时:" i endl; //倒计时显示
else
Refresh(tcsQipan,grade,gamespeed,length,score); //初始棋盘显示
}
int timeover=1,otherkey=1;//初始化超时时间和按键判断参数
char direction = 77; // 设置初始情况下,向右运动
int x=tcsZuobiao[0][head],y=tcsZuobiao[1][head];//保存蛇头坐标到x,y变量
while(1)//运行一局游戏
{
start = clock();
while((timeover=((starttemp=clock())-start=gamespeed))!kbhit());//如果有键按下或时间超过自动前进时间间隔则终止循环
if(direction==72||direction==80||direction==75 ||direction==77)
directiontemp=direction;//保留上一次方向按键
//starttemp=gamespeed+start-starttemp;//保留停留时间
if(timeover)
{
#if (DEBUG==1)
direction = getch();//调试代码
#else
if((direction =getch())==-32)
direction = getch();
#endif
}
#if (DEBUG==1)//调试代码
start=clock();
while(clock()-start=2000);
gotoxy(24,4);
cout "\t按键ASCII代码"(int)direction" "endl;
#endif
if(!(direction==72||direction==80||direction==75 ||direction==77))
{
otherkey=0;// 按键非方向键,otherkey设置为0
}
else
{
otherkey=1;// 按键为方向键,otherkey设置为1
}
if(direction==72 directiontemp==80)//忽略反方向按键
{
direction=32;
otherkey=0;
//start = clock();
//while(clock()-start=starttemp);
}
else if(direction==80 directiontemp==72)
{
direction=32;//设置按键为非方向键
otherkey=0;// 按键为非方向键,otherkey设置为0
// start = clock();
//while(clock()-start=starttemp);//补偿等待时间
}
else if(direction==75 directiontemp==77)
{
direction=32;
otherkey=0;
//start = clock();
//while(clock()-start=starttemp);
}
else if(direction==77 directiontemp==75)
{
direction=32;
otherkey=0;
//start = clock();
//while(clock()-start=starttemp);
}
switch(direction)//判断方向键
{
case 72: x= tcsZuobiao[0][head]-1; y= tcsZuobiao[1][head];break; // 向上
case 80: x= tcsZuobiao[0][head]+1; y= tcsZuobiao[1][head];break; // 向下
case 75: x= tcsZuobiao[0][head]; y= tcsZuobiao[1][head]-1;break; // 向左
case 77: x= tcsZuobiao[0][head]; y= tcsZuobiao[1][head]+1;break; // 向右
default: break;
}
if(x==0 || x==21 ||y==0 || y==21) // 蛇头碰到墙壁,结束本局游戏
{
gotoxy(22,12);
cout "\t游戏已结束!" endl;
if(score=(length+(grade-1)*8)*10)//判断是否破记录
{
gotoxy(10,7);
color(12);
cout "闯关失败 加油耶!" endl;
fclose(fpini);//关闭ini文件
}
else
{
gotoxy(10,7);
color(12);
cout "恭喜您打破记录" endl;
score=(length+(grade-1)*8)*10;
writeini(fpini, score, argv);//写入ini文件的最高纪录
}
gotoxy(23,12);
cout "按回车键重新开始,按ESC退出游戏" endl;//显示的提示
break;//退出该局游戏
}
if(tcsQipan[x][y]!=0!(x==x1y==y1)tcsQipan[x][y]!=3) // 蛇头碰到蛇身,结束本局游戏
{
gotoxy(22,12);
cout "\t游戏已结束!" endl;
if(score=(length+(grade-1)*8)*10)//判断是否破记录
{
gotoxy(10,7);
color(12);
cout "闯关失败 加油耶!" endl;
fclose(fpini);//关闭ini文件
}
else
{
gotoxy(10,7);
color(12);
cout "恭喜您打破记录" endl;
score=(length+(grade-1)*8)*10;
writeini(fpini, score, argv);//写入ini文件的最高纪录
}
gotoxy(23,12);
cout "按回车键重新开始,按ESC退出游戏" endl;//显示的提示
break;//退出该局游戏
}
/*
游戏运行时的核心算法开始
*/
if(x==x1 y==y1) // 吃果子,长度加1
{
length ++;
if(length=8)//长度大于等于8重新计算长度,等级加1
{
length -= 8;//重新计算长度
grade ++;//等级加1
if(gamespeed50)//控制最快速度为50
gamespeed = 550 - grade * 50; // 改变自动前进时间间隔
}
tcsQipan[x][y]= 3;//贪吃蛇棋盘相应坐标现在蛇头标志改为蛇头标志3
tcsQipan[tcsZuobiao[0][head]][tcsZuobiao[1][head]] = 4;//贪吃蛇棋盘相应坐标原来蛇头标志改为蛇身标志4
head = (head+1)%400;//防止数组越界
tcsZuobiao[0][head] = x;//蛇头的x坐标
tcsZuobiao[1][head] = y;//蛇头的y坐标
do//随机出果子
{
x1=rand()%20+1;
y1=rand()%20+1;
}
while(tcsQipan[x1][y1]!=0);//如果不是在空白处重新出果子
tcsQipan[x1][y1]=5;//贪吃蛇棋盘相应坐标标上果子的标志5
gotoxy(22,12);
cout "\t游戏进行中!" endl;
Refresh(tcsQipan,grade,gamespeed,length,score);
}
else // 不吃果子
{
if(otherkey)
{
tcsQipan [tcsZuobiao[0][tail]][tcsZuobiao[1][tail]]=0;
tail=(tail+1)%400;//防止数组越界
tcsQipan [tcsZuobiao[0][head]][tcsZuobiao[1][head]]=4;
head=(head+1)%400;//防止数组越界
tcsZuobiao[0][head]=x;//蛇头的x坐标
tcsZuobiao[1][head]=y;//蛇头的y坐标
tcsQipan[tcsZuobiao[0][head]][tcsZuobiao[1][head]]=3;
gotoxy(22,12);
cout "\t游戏进行中!" endl;
Refresh(tcsQipan,grade,gamespeed,length,score);
}
else
{
gotoxy(22,12);
cout "\t游戏暂停中!" endl;
}
}
/*
游戏运行时的核心算法结束
*/
}
while(1)
{
while(!kbhit());
if((direction =getch())==13)//按回车键开始下一局
break;
if(direction ==27)//按ESC退出游戏
exit(0);
}
system("cls");//清除屏幕重新开始
}
return 0;
}
VB贪吃蛇代码
'定义蛇的运动速度枚举值
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
'定义蛇头及身体初始化数枚举值
Private Enum tpsSnake
SNAKEONE = 1
SNAKETWO = 2
SNAKETHREE = 3
SNAKEFOUR = 4
End Enum
'定义蛇宽度的常量
Private Const SNAKEWIDTH As Integer = 100
'该过程用于显示游戏信息
Private Sub Form_Load()
Me.Show
Me.lblTitle = "BS贪食蛇 — (版本 " App.Major "." App.Minor "." App.Revision ")"
Me.Caption = Me.lblTitle.Caption
frmSplash.Show 1
End Sub
'该过程用于使窗体恢复原始大小
Private Sub Form_Resize()
If Me.WindowState 1 Then
Me.Caption = ""
Me.Height = 6405 '窗体高度为 6405 缇
Me.Width = 8535 '窗体宽度为 8535 缇
Me.Left = (Screen.Width - Width) \ 2
Me.Top = (Screen.Height - Height) \ 2
End If
End Sub
'该过程用于重新开始开始游戏
Private Sub cmdGameStart_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
Beep
msg = MsgBox("您确认要重新开始游戏吗?", 4 + 32, "BS贪食蛇")
If msg = 6 Then Call m_subGameInitialize
End Sub
'该过程用于暂停/运行游戏
Private Sub chkPause_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
If Me.chkPause.Caption = "暂停游戏(P)" Then
Me.tmrSnakeMove.Enabled = False
Me.tmrGameTime.Enabled = False
Me.picMoveArea.Enabled = False
Me.lblPauseLab.Visible = True
Me.chkPause.Caption = "继续游戏(R)"
Else
Me.tmrSnakeMove.Enabled = True
Me.tmrGameTime.Enabled = True
Me.picMoveArea.Enabled = True
Me.lblPauseLab.Visible = False
Me.chkPause.Caption = "暂停游戏(P)"
End If
End Sub
'该过程用于显示游戏规则
Private Sub cmdGameRules_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
Beep
MsgBox " BS贪食蛇:一个规则最简单的趣味游戏,您将用键盘" Chr(13) _
"上的4个方向键来控制蛇的运动方向。在运动过程中蛇" Chr(13) _
"不能后退,蛇的头部也不能接触到运动区域的边线以外" Chr(13) _
"和蛇自己的身体,否则就游戏失败。在吃掉随机出现的" Chr(13) _
"果子后,蛇的身体会变长,越长难度越大。祝您好运!!", 0 + 64, "游戏规则"
End Sub
'该过程用于显示游戏开发信息
Private Sub cmdAbout_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
Beep
MsgBox "BS贪食蛇" "(V-" App.Major "." App.Minor "版本)" Chr(13) Chr(13) _
"" Chr(13) Chr(13) _
"由PigheadPrince设计制作" Chr(13) _
"CopyRight(C)2002,BestSoft.TCG", 0, "关于本游戏"
End Sub
'该过程用于退出游戏
Private Sub cmdExit_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
Beep
msg = MsgBox("您要退出本游戏吗?", 4 + 32, "BS贪食蛇")
Select Case msg
Case 6
End
Case 7
Me.chkWindowButton(2).Value = 0
Exit Sub
End Select
End Sub
'该过程用于拖动窗体_(点击图标)
Private Sub imgWindowTop_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
ReleaseCapture
SendMessage Me.hwnd, WM_SYSCOMMAND, SC_MOVE, 0
End Sub
'该共用过程用于处理窗体控制按钮组的相关操作_(锁定、最小化、退出)
Private Sub chkWindowButton_MouseUp(Index As Integer, Button As Integer, Shift As Integer, X As Single, Y As Single)
If Button 1 Then Exit Sub
Select Case Index
Case 0 '锁定窗体
If Me.chkWindowButton(0).Value = 1 Then
Me.imgWindowTop.BorderStyle = 0
Me.imgWindowTop.Enabled = False
Else
Me.imgWindowTop.BorderStyle = 1
Me.imgWindowTop.Enabled = True
End If
Case 1 '最小化
Me.WindowState = 1
Me.chkWindowButton(1).Value = 0
Me.Caption = "BS贪食蛇 — (V-" App.Major "." App.Minor "版本)"
Case 2 '退出
Beep
msg = MsgBox("您要退出本游戏吗?", 4 + 32, "BS贪食蛇")
Select Case msg
Case 6
End
Case 7
Me.chkWindowButton(2).Value = 0
Exit Sub
End Select
End Select
End Sub
'该过程用于设置蛇运动速度的快慢
Private Sub hsbGameSpeed_Change()
Me.tmrSnakeMove.Interval = Me.hsbGameSpeed.Value
End Sub
'该过程用于通过键盘的方向键改变蛇的运动方向
Private Sub picMoveArea_KeyDown(KeyCode As Integer, Shift As Integer)
Select Case g_intDirection
Case D_UP
If KeyCode = D_DOWN Then Exit Sub
Case D_DOWN
If KeyCode = D_UP Then Exit Sub
Case D_LEFT
If KeyCode = D_RIGHT Then Exit Sub
Case D_RIGHT
If KeyCode = D_LEFT Then Exit Sub
End Select
g_intDirection = KeyCode
End Sub
'该计时循环过程用于计算游戏耗费的秒数并显示
Private Sub tmrGameTime_Timer()
g_lngGameTime = g_lngGameTime + 1
Me.lblGameTime.Caption = g_lngGameTime "秒"
End Sub
'该计时循环过程用于控制蛇的行动轨迹
Private Sub tmrSnakeMove_Timer()
Dim lngSnakeX As Long, lngSnakeY As Long, lngSnakeColor As Long
Dim lngPointX As Long, lngPointY As Long, lngPointColor As Long
Randomize
Me.picMoveArea.SetFocus
Me.picMoveArea.Cls
'确认蛇头的运动方向并获取新的位置
Select Case g_intDirection
Case D_UP '向上运动
g_udtSnake(SNAKEONE).Snake_CurX = g_udtSnake(SNAKEONE).Snake_OldX
g_udtSnake(SNAKEONE).Snake_CurY = g_udtSnake(SNAKEONE).Snake_OldY
g_udtSnake(SNAKEONE).Snake_CurY = g_udtSnake(SNAKEONE).Snake_CurY - SNAKEWIDTH
Case D_DOWN '向下运动
g_udtSnake(SNAKEONE).Snake_CurX = g_udtSnake(SNAKEONE).Snake_OldX
g_udtSnake(SNAKEONE).Snake_CurY = g_udtSnake(SNAKEONE).Snake_OldY
g_udtSnake(SNAKEONE).Snake_CurY = g_udtSnake(SNAKEONE).Snake_CurY + SNAKEWIDTH
Case D_LEFT '向左运动
g_udtSnake(SNAKEONE).Snake_CurX = g_udtSnake(SNAKEONE).Snake_OldX
g_udtSnake(SNAKEONE).Snake_CurX = g_udtSnake(SNAKEONE).Snake_CurX - SNAKEWIDTH
g_udtSnake(SNAKEONE).Snake_CurY = g_udtSnake(SNAKEONE).Snake_OldY
Case D_RIGHT '向右运动
g_udtSnake(SNAKEONE).Snake_CurX = g_udtSnake(SNAKEONE).Snake_OldX
g_udtSnake(SNAKEONE).Snake_CurX = g_udtSnake(SNAKEONE).Snake_CurX + SNAKEWIDTH
g_udtSnake(SNAKEONE).Snake_CurY = g_udtSnake(SNAKEONE).Snake_OldY
End Select
'根据新的位置绘制蛇头
lngSnakeX = g_udtSnake(SNAKEONE).Snake_CurX
lngSnakeY = g_udtSnake(SNAKEONE).Snake_CurY
lngSnakeColor = g_udtSnake(SNAKEONE).Snake_Color
Me.picMoveArea.PSet (lngSnakeX, lngSnakeY), lngSnakeColor
'移动蛇身体其他部分的位置
For i = 2 To g_intSnakeLength
g_udtSnake(i).Snake_CurX = g_udtSnake(i - 1).Snake_OldX
g_udtSnake(i).Snake_CurY = g_udtSnake(i - 1).Snake_OldY
lngSnakeX = g_udtSnake(i).Snake_CurX
lngSnakeY = g_udtSnake(i).Snake_CurY
lngSnakeColor = g_udtSnake(i).Snake_Color
Me.picMoveArea.PSet (lngSnakeX, lngSnakeY), lngSnakeColor
Next i
'更新蛇旧的坐标位置
For j = 1 To g_intSnakeLength
g_udtSnake(j).Snake_OldX = g_udtSnake(j).Snake_CurX
g_udtSnake(j).Snake_OldY = g_udtSnake(j).Snake_CurY
Next j
'判断蛇在移动中是否到了禁区而导致游戏失败
If m_funMoveForbiddenZone(g_udtSnake(SNAKEONE).Snake_CurX, g_udtSnake(SNAKEONE).Snake_CurY) Then
Beep
MsgBox "您的蛇移动到了禁区,游戏失败!", 0 + 16, "BS贪食蛇"
Me.tmrSnakeMove.Enabled = False
Me.tmrGameTime.Enabled = False
Me.picMoveArea.Visible = False
Exit Sub
End If
'判断蛇在移动中是否碰到了自己的身体而导致游戏失败
If m_funTouchSnakeBody(g_udtSnake(SNAKEONE).Snake_CurX, g_udtSnake(SNAKEONE).Snake_CurY) Then
Beep
MsgBox "您的蛇在移动中碰到了自己的身体,游戏失败!", 0 + 16, "BS贪食蛇"
Me.tmrSnakeMove.Enabled = False
Me.tmrGameTime.Enabled = False
Me.picMoveArea.Visible = False
Exit Sub
End If
'判断蛇是否吃到了果子
If m_funEatPoint(g_udtSnake(SNAKEONE).Snake_CurX, g_udtSnake(SNAKEONE).Snake_CurY) Then
'累加玩家的得分并刷新得分显示
g_intPlayerScore = g_intPlayerScore + 1
Me.lblYourScore.Caption = g_intPlayerScore "分"
Call m_subAddSnake '加长蛇的身体
Call m_subGetPoint '获取下一个果子的位置和颜色
Else
'绘制果子
lngPointX = g_udtPoint.Point_X
lngPointY = g_udtPoint.Point_Y
lngPointColor = g_udtPoint.Point_Color
Me.picMoveArea.PSet (lngPointX, lngPointY), lngPointColor
End If
End Sub
'该私有子过程用于初始化游戏
Private Sub m_subGameInitialize()
Erase g_udtSnake '清空蛇的结构数组
g_intPlayerScore = 0 '清空玩家的得分
g_lngGameTime = 0 '清空游戏耗费的秒数
g_intDirection = D_DOWN '设定蛇的初始运动方向为下
g_intSnakeLength = 4 '设定蛇的初始长度
ReDim g_udtSnake(1 To g_intSnakeLength) '重新定义蛇的长度
'定义蛇头部的数据
With g_udtSnake(SNAKEONE)
.Snake_OldX = 530
.Snake_OldY = 530
.Snake_Color = vbBlack
End With
'定义蛇身第2节的数据
With g_udtSnake(SNAKETWO)
.Snake_OldX = 530
.Snake_OldY = 430
.Snake_Color = vbGreen
End With
'定义蛇身第3节的数据
With g_udtSnake(SNAKETHREE)
.Snake_OldX = 530
.Snake_OldY = 330
.Snake_Color = vbYellow
End With
'定义蛇身第4节的数据
With g_udtSnake(SNAKEFOUR)
.Snake_OldX = 530
.Snake_OldY = 230
.Snake_Color = vbRed
End With
Me.picMoveArea.Visible = True
Me.lblYourScore.Caption = g_intPlayerScore "分"
Me.lblGameTime.Caption = g_lngGameTime "秒"
Me.tmrSnakeMove.Interval = Me.hsbGameSpeed.Value
Me.tmrSnakeMove.Enabled = True
Me.tmrGameTime.Enabled = True
Call m_subGetPoint '获取第一个果子的位置和颜色
End Sub
'该私有子过程用于返回获取的果子的位置和颜色信息
Private Sub m_subGetPoint()
Dim lngRedValue As Long, lngGreenValue As Long, lngBlueValue As Long
Dim lngPointX As Long, lngPointY As Long, lngPointColor As Long
'随机获取果子的颜色
lngRedValue = Int((255 - 0 + 1) * Rnd + 0)
lngGreenValue = Int((255 - 0 + 1) * Rnd + 0)
lngBlueValue = Int((255 - 0 + 1) * Rnd + 0)
lngPointColor = RGB(lngRedValue, lngGreenValue, lngBlueValue)
'随机获取果子的位置
lngPointX = Int((FZ_LEFT - FZ_RIGHT + 1) * Rnd + FZ_RIGHT)
lngPointY = Int((FZ_TOP - FZ_BOTTOM + 1) * Rnd + FZ_BOTTOM)
Me.PSet (lngPointX, lngPointY), lngPointColor
'设置函数返回值
With g_udtPoint
.Point_X = lngPointX
.Point_Y = lngPointY
.Point_Color = lngPointColor
End With
End Sub
'该私有子过程用于加长蛇的身体
Private Sub m_subAddSnake()
Dim udtSnakeTemp() As Snake
Dim lngSnakeX As Long, lngSnakeY As Long, lngSnakeColor As Long
'备份蛇原先身体的数据并使蛇的身体加长
ReDim udtSnakeTemp(1 To g_intSnakeLength)
For k = 1 To g_intSnakeLength
With udtSnakeTemp(k)
.Snake_CurX = g_udtSnake(k).Snake_CurX
.Snake_CurY = g_udtSnake(k).Snake_CurY
.Snake_OldX = g_udtSnake(k).Snake_OldX
.Snake_OldY = g_udtSnake(k).Snake_OldY
.Snake_Color = g_udtSnake(k).Snake_Color
End With
Next k
g_intSnakeLength = g_intSnakeLength + 1
ReDim g_udtSnake(g_intSnakeLength)
'将备份蛇身体的数据返回到加长的蛇身数组中
For l = 1 To g_intSnakeLength - 1
With g_udtSnake(l)
.Snake_CurX = udtSnakeTemp(l).Snake_CurX
.Snake_CurY = udtSnakeTemp(l).Snake_CurY
.Snake_OldX = udtSnakeTemp(l).Snake_OldX
.Snake_OldY = udtSnakeTemp(l).Snake_OldY
.Snake_Color = udtSnakeTemp(l).Snake_Color
End With
Next l
'写入新加入的身体数据
Select Case g_intDirection
Case D_UP
With g_udtSnake(g_intSnakeLength)
.Snake_OldX = g_udtSnake(g_intSnakeLength - 1).Snake_CurX + SNAKEWIDTH
.Snake_OldY = g_udtSnake(g_intSnakeLength - 1).Snake_CurY
.Snake_Color = g_udtPoint.Point_Color
End With
Case D_DOWN
With g_udtSnake(g_intSnakeLength)
.Snake_OldX = g_udtSnake(g_intSnakeLength - 1).Snake_CurX - SNAKEWIDTH
.Snake_OldY = g_udtSnake(g_intSnakeLength - 1).Snake_CurY
.Snake_Color = g_udtPoint.Point_Color
End With
Case D_LEFT
With g_udtSnake(g_intSnakeLength)
.Snake_OldX = g_udtSnake(g_intSnakeLength - 1).Snake_CurX
.Snake_OldY = g_udtSnake(g_intSnakeLength - 1).Snake_CurY + SNAKEWIDTH
.Snake_Color = g_udtPoint.Point_Color
End With
Case D_RIGHT
With g_udtSnake(g_intSnakeLength)
.Snake_OldX = g_udtSnake(g_intSnakeLength - 1).Snake_CurX
.Snake_OldY = g_udtSnake(g_intSnakeLength - 1).Snake_CurY - SNAKEWIDTH
.Snake_Color = g_udtPoint.Point_Color
End With
End Select
lngSnakeX = g_udtSnake(g_intSnakeLength).Snake_CurX
lngSnakeY = g_udtSnake(g_intSnakeLength).Snake_CurY
lngSnakeColor = g_udtSnake(g_intSnakeLength).Snake_Color
Me.picMoveArea.PSet (lngSnakeX, lngSnakeY), lngSnakeColor
End Sub
'该自定义函数用于返回运动的蛇是否到达禁区而导致游戏失败
Private Function m_funMoveForbiddenZone(SnakeX As Long, SnakeY As Long) As Boolean
If (SnakeX = FZ_LEFT And SnakeX = FZ_RIGHT) And (SnakeY = FZ_TOP And SnakeY = FZ_BOTTOM) Then
m_funMoveForbiddenZone = False
Else
m_funMoveForbiddenZone = True
End If
End Function
'该自定义函数用于返回运动的蛇是否碰到自己的身体而导致游戏失败
Private Function m_funTouchSnakeBody(SnakeX As Long, SnakeY As Long) As Boolean
For m = 2 To g_intSnakeLength
If SnakeX = g_udtSnake(m).Snake_CurX And SnakeY = g_udtSnake(m).Snake_CurY Then
m_funTouchSnakeBody = True
Exit For
Else
m_funTouchSnakeBody = False
End If
Next m
End Function
'该自定义函数用于返回运动的蛇是否吃到了果子
Private Function m_funEatPoint(SnakeX As Long, SnakeY As Long) As Boolean
If Abs(SnakeX - g_udtPoint.Point_X) = SNAKEWIDTH And Abs(SnakeY - g_udtPoint.Point_Y) = SNAKEWIDTH Then
m_funEatPoint = True
Else
m_funEatPoint = False
End If
End Function
'(API函数调用过程_用以实现无标题窗体的拖动操作)---------------------------------
'RleaseCapture函数用以释放鼠标捕获
Public Declare Function ReleaseCapture Lib "user32" () As Long
'SendMessage函数用作向Windows发送移动窗体的消息
Public Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As _
Long, ByVal wMsg As Long, ByVal wParam As Long, IParam As Any) As Long
Public Const WM_SYSCOMMAND = H112 '声明向Windows发送消息的常量
Public Const SC_MOVE = HF012 '声明控制移动窗体常量
'(游戏变量声明部分)-------------------------------------------------------------
'定义蛇的数据类型结构
Public Type Snake
Snake_OldX As Long
Snake_OldY As Long
Snake_CurX As Long
Snake_CurY As Long
Snake_Color As Long
End Type
'定义果子的数据类型结构
Public Type Point
Point_X As Long
Point_Y As Long
Point_Color As Long
End Type
'定义蛇的动态数组
Public g_udtSnake() As Snake
'定义果子
Public g_udtPoint As Point
'定义蛇的长度
Public g_intSnakeLength As Integer
'定义蛇的颜色
Public g_lngSnakeColor As Long
'定义蛇的运动方向
Public g_intDirection As Integer
'定义玩家的得分
Public g_intPlayerScore As Integer
'定义游戏耗费的秒数
Public g_lngGameTime As Long
求,贪吃蛇 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 0x011b
int i,key;
int score = 0;/*得分*/
int gamespeed = 100000;/*游戏速度自己调整*/
struct Food
{
int x;/*食物的横坐标*/
int y;/*食物的纵坐标*/
int yes;/*判断是否要出现食物的变量*/
}food;/*食物的结构体*/
struct Snake
{
int x[N];
int y[N];
int node;/*蛇的节数*/
int direction;/*蛇移动方向*/
int life;/* 蛇的生命,0活着,1死亡*/
}snake;
void Init(void);/*图形驱动*/
void Close(void);/*图形结束*/
void DrawK(void);/*开始画面*/
void GameOver(void);/*结束游戏*/
void GamePlay(void);/*玩游戏具体过程*/
void PrScore(void);/*输出成绩*/
/*主函数*/
void main(void)
{
Init();/*图形驱动*/
DrawK();/*开始画面*/
GamePlay();/*玩游戏具体过程*/
Close();/*图形结束*/
}
/*图形驱动*/
void Init(void)
{
int gd = DETECT, gm;
initgraph(gd, gm, "c:\\tc");
cleardevice();
}
/*开始画面,左上角坐标为(50,40),右下角坐标为(610,460)的围墙*/
void DrawK(void)
{
/*setbkcolor(LIGHTGREEN);*/
setcolor(11);
setlinestyle(SOLID_LINE, 0, THICK_WIDTH);/*设置线型*/
for(i = 50; i = 600; i += 10)/*画围墙*/
{
rectangle(i, 40, i + 10, 49); /*上边*/
rectangle(i, 451, i + 10, 460);/*下边*/
}
for(i = 40; i = 450; i += 10)
{
rectangle(50, i, 59, i + 10); /*左边*/
rectangle(601, i, 610, i + 10);/*右边*/
}
}
/*玩游戏具体过程*/
void GamePlay(void)
{
randomize();/*随机数发生器*/
food.yes = 1;/*1表示需要出现新食物,0表示已经存在食物*/
snake.life = 0;/*活着*/
snake.direction = 1;/*方向往右*/
snake.x[0] = 100; snake.y[0] = 100;/*蛇头*/
snake.x[1] = 110; snake.y[1] = 100;
snake.node = 2;/*节数*/
PrScore();/*输出得分*/
while(1)/*可以重复玩游戏,压ESC键结束*/
{
while(!kbhit())/*在没有按键的情况下,蛇自己移动身体*/
{
if(food.yes == 1)/*需要出现新食物*/
{
food.x = rand() % 400 + 60;
food.y = rand() % 350 + 60;
while(food.x % 10 != 0)/*食物随机出现后必须让食物能够在整格内,这样才可以让蛇吃到*/
food.x++;
while(food.y % 10 != 0)
food.y++;
food.yes = 0;/*画面上有食物了*/
}
if(food.yes == 0)/*画面上有食物了就要显示*/
{
setcolor(GREEN);
rectangle(food.x, food.y, food.x + 10, food.y - 10);
}
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.x[0] -= 10; break;
case 3: snake.y[0] -= 10; break;
case 4: snake.y[0] += 10; break;
}
for(i = 3; i snake.node; i++)/*从蛇的第四节开始判断是否撞到自己了,因为蛇头为两节,第三节不可能拐过来*/
{
if(snake.x[i] == snake.x[0] snake.y[i] == snake.y[0])
{
GameOver();/*显示失败*/
snake.life = 1;
break;
}
}
if(snake.x[0]55||snake.x[0]595||snake.y[0]55||
snake.y[0]455)/*蛇是否撞到墙壁*/
{
GameOver();/*本次游戏结束*/
snake.life=1; /*蛇死*/
}
if(snake.life == 1)/*以上两种判断以后,如果蛇死就跳出内循环,重新开始*/
break;
if(snake.x[0] == food.x snake.y[0] == food.y)/*吃到食物以后*/
{
setcolor(0);/*把画面上的食物东西去掉*/
rectangle(food.x, food.y, food.x + 10, food.y - 10);
snake.x[snake.node] =- 20; snake.y[snake.node] =- 20;
/*新的一节先放在看不见的位置,下次循环就取前一节的位置*/
snake.node++;/*蛇的身体长一节*/
food.yes = 1;/*画面上需要出现新的食物*/
score += 10;
PrScore();/*输出新得分*/
}
setcolor(4);/*画出蛇*/
for(i = 0; i snake.node; i++)
rectangle(snake.x[i], snake.y[i], snake.x[i] + 10,
snake.y[i] - 10);
delay(gamespeed);
setcolor(0);/*用黑色去除蛇的的最后一节*/
rectangle(snake.x[snake.node-1], snake.y[snake.node-1],
snake.x[snake.node-1] + 10, snake.y[snake.node - 1] - 10);
} /*endwhile(!kbhit)*/
if(snake.life == 1)/*如果蛇死就跳出循环*/
break;
key = bioskey(0);/*接收按键*/
if(key == ESC)/*按ESC键退出*/
break;
else
if(key == UPsnake.direction!=4)
/*判断是否往相反的方向移动*/
snake.direction=3;
else
if(key == RIGHT snake.direction != 2)
snake.direction=1;
else
if(key == LEFT snake.direction != 1)
snake.direction = 2;
else
if(key == DOWN snake.direction != 3)
snake.direction = 4;
}/*endwhile(1)*/
}
/*游戏结束*/
void GameOver(void)
{
cleardevice();
PrScore();
setcolor(RED);
settextstyle(0, 0, 4);
outtextxy(200, 200, "GAME OVER");
getch();
}
/*输出成绩*/
void PrScore(void)
{
char str[10];
setfillstyle(SOLID_FILL, YELLOW);
bar(50, 15, 220, 35);
setcolor(6);
settextstyle(0,0,2);
sprintf(str, "score:%d", score);
outtextxy(55, 20, str);
}
/*图形结束*/
void Close(void)
{
getch();
closegraph();
}
贪吃蛇代码效果图的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于贪吃蛇的简单代码、贪吃蛇代码效果图的信息别忘了在本站进行查找喔。
版权说明:如非注明,本站文章均为 AH站长 原创,转载请注明出处和附带本文链接;
相关推荐
- 05-17做公司网页,做公司网页有什么简单的方法
- 05-12深圳seo公司的简单介绍
- 05-11设计一个简单的网页,独立站建站平台有哪些
- 05-09网页代码,网页代码快捷键
- 05-09hao123网址之家官网的简单介绍
- 05-07孝感seo的简单介绍
- 05-07简历源代码可以上传照片的简单介绍[20240507更新]
- 05-06单页网站的代码(完整的网页代码)[20240506更新]
- 05-06个人主页图片代码(个人主页图片代码怎么弄)[20240506更新]
- 05-06提取微信名片代码(微信名片信息提取)[20240506更新]
取消回复欢迎 你 发表评论:
- 标签列表
- 最近发表
- 友情链接