FLASH游戏之贪吃蛇游戏源代码

合集下载

贪吃蛇源代码

贪吃蛇源代码

//本程序用于初学者间的学习和交流,程序粗糙简陋在刷新重画时总出现白条画面,希望大家能提出宝贵意见。

QQ:609429837import java.awt.Color;import java.awt.Graphics;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.awt.event.KeyEvent;import java.awt.event.KeyListener;import java.io.BufferedReader;import java.io.BufferedWriter;import java.io.File;import java.io.FileReader;import java.io.FileWriter;import java.io.IOException;import java.util.ArrayList;import javax.swing.ButtonGroup;import javax.swing.JFrame;import javax.swing.JMenu;import javax.swing.JMenuBar;import javax.swing.JMenuItem;import javax.swing.JOptionPane;import javax.swing.JRadioButton;public class myTcs extends JFrame implements ActionListener, KeyListener,Runnable {// private Graphics g;// private JPanel jp;File file = new File("分数.txt");ArrayList<String> re = null;// 用于存储得分String fenshu = null;// 用于显示得分private JMenuBar menuBar;private JMenu youXiMenu, nanDuMenu, fenShuMenu, guanYuMenu;private JMenuItem kaiShiYouXi, exitItem, zuoZheItem, fenShuItem,maxfenShuItem;private JRadioButton cJianDan, cPuTong, cKunNan;private ButtonGroup bg = new ButtonGroup();private int m[] = new int[60];private int n[] = new int[60];private Thread she = null;private int life = 3;// 生命数量private int length = 6;// 蛇的长度private static int foods = 0;// 本局吃了多少苹果private boolean isApple = false;// 蛇要吃的苹果private static int maxfenshu = 0;// 本局等分private int x = 230;private int y = 200;private int time = 500;// 用于设置难易程度private String direction = "right";// 蛇运动的方向// 构造方法public myTcs() {// 实例化组件// jp=new JPanel();menuBar = new JMenuBar();youXiMenu = new JMenu("游戏");nanDuMenu = new JMenu("难度");fenShuMenu = new JMenu("分数");guanYuMenu = new JMenu("关于");kaiShiYouXi = new JMenuItem("开始");exitItem = new JMenuItem("退出");cJianDan = new JRadioButton("简单");cPuTong = new JRadioButton("普通");cKunNan = new JRadioButton("困难");zuoZheItem = new JMenuItem("作者");fenShuItem = new JMenuItem("上局得分");maxfenShuItem = new JMenuItem("最高得分");// 添加组件menuBar.add(youXiMenu);menuBar.add(nanDuMenu);menuBar.add(fenShuMenu);menuBar.add(guanYuMenu);youXiMenu.add(kaiShiYouXi);youXiMenu.add(exitItem);bg.add(cJianDan);bg.add(cPuTong);bg.add(cKunNan);nanDuMenu.add(cJianDan);nanDuMenu.add(cPuTong);nanDuMenu.add(cKunNan);fenShuMenu.add(fenShuItem);fenShuMenu.add(maxfenShuItem);guanYuMenu.add(zuoZheItem);// 添加监听kaiShiYouXi.addActionListener(this);exitItem.addActionListener(this);cJianDan.addActionListener(this);cPuTong.addActionListener(this);cKunNan.addActionListener(this);fenShuItem.addActionListener(this);maxfenShuItem.addActionListener(this);zuoZheItem.addActionListener(this);addKeyListener(this);// 设置窗体this.setJMenuBar(menuBar);this.setVisible(true);this.setSize(400, 400);this.setLocation(100, 100);this.setTitle("贪吃蛇");this.setResizable(false);this.validate();this.setDefaultCloseOperation(EXIT_ON_CLOSE);}public static void main(String aa[]) {new myTcs();}@Overridepublic void actionPerformed(ActionEvent e) {if ("开始".equals(e.getActionCommand())) {this.isApple = true;life = 3;if (she == null) {// System.out.println(x + " " + y);she = new Thread(this);she.start();} else if (she != null) {she = null;she = new Thread(this);she.start();}}if ("退出".equals(e.getActionCommand())) {System.exit(0);}if ("简单".equals(e.getActionCommand())) {time = 1000;}if ("普通".equals(e.getActionCommand())) {time = 500;}if ("困难".equals(e.getActionCommand())) {time = 200;}if ("上局得分".equals(e.getActionCommand())) {this.defen();JOptionPane.showMessageDialog(this, fenshu);}if ("最高得分".equals(e.getActionCommand())) {this.defen();JOptionPane.showMessageDialog(this, maxfenshu);}if ("作者".equals(e.getActionCommand())) {JOptionPane.showMessageDialog(this, "制作:飞" + "\r\n"+ "QQ: 609429837" + "\n");}this.repaint();// 重画}// 绘图public void paint(Graphics g) {super.paint(g);// g.setColor(Color.DARK_GRAY); // 设置背景g.fillRect(0, 50, 400, 400);g.setColor(Color.BLUE);for (int i = 0; i <= length - 1; i++) {g.fillRect(m[i], n[i], 10, 10);}if (isApple == true) {g.setColor(Color.RED);g.fillRect(x, y, 10, 10);}}@Overridepublic void run() {for (int i = 0; i <= length - 1; i++) {m[i] = 50 - i * 10;n[i] = 60;}while (she != null) {check();try {Thread.sleep(time);} catch (Exception ee) {System.out.println(direction);}}}// 判断运动方向并设置活动范围public synchronized void check() {if (she != null) {for (int i = length - 1; i >= 1; i--) {m[i] = m[i - 1];n[i] = n[i - 1];}if (direction.equals("up")) {n[0] = n[0] - 10;if (n[0] == (y - 10) && m[0] >= x & m[0] <= (x + 10)) {this.foods++;this.length++;this.apple();if (foods == 50 || life == 0) {this.isApple = false;}}}if (direction.equals("down")) {n[0] = n[0] + 10;if (n[0] == (y + 10) && m[0] >= x & m[0] <= (x + 10)) { this.foods++;this.length++;this.apple();if (foods == 50 || life == 0) {this.isApple = false;}}}if (direction.equals("left")) {m[0] = m[0] - 10;if (m[0] == (x + 10) && n[0] >= y && n[0] <= (y + 10)) { this.foods++;this.length++;this.apple();if (foods == 50 || life == 0) {this.isApple = false;}}}if (direction.equals("right")) {m[0] = m[0] + 10;if (m[0] == (x) && n[0] >= y && n[0] <= (y + 10)) {this.foods++;this.length++;this.apple();if (foods == 50 || life == 0) {this.isApple = false;}}}if (m[0] <= -5 || m[0] >= 395 || n[0] <= 45 || n[0] >= 395) { --life;she = null;if (life <= 0) {this.save();} else {if (she == null) {// System.out.println(x + " " + y);she = new Thread(this);this.length = 6;this.direction = "right";she.start();} else if (she != null) {she = null;she = new Thread(this);this.length = 6;this.direction = "right";she.start();}}}}this.repaint();// 重画}// 产生苹果并实现蛇吃苹果public void apple() {x = (int) Math.floor(Math.random() * 39) * 10;y = (int) Math.floor(Math.random() * 29) * 10 + 50; }@Overridepublic void keyTyped(KeyEvent e) {}@Overridepublic void keyPressed(KeyEvent e) {if (e.getKeyCode() == KeyEvent.VK_UP) {if (!direction.equals("down")) {direction = "up";check();}}if (e.getKeyCode() == KeyEvent.VK_DOWN) {if (!direction.equals("up")) {direction = "down";check();}}if (e.getKeyCode() == KeyEvent.VK_LEFT) {if (!direction.equals("right")) {direction = "left";check();}}if (e.getKeyCode() == KeyEvent.VK_RIGHT) {if (!direction.equals("left")) {direction = "right";check();}}}@Overridepublic void keyReleased(KeyEvent e) {// TODO Auto-generated method stub}public void save() {boolean append = false;if (file.exists()) {append = true;}FileWriter fc = null;BufferedWriter bf = null;try {fc = new FileWriter("分数.txt", append);bf = new BufferedWriter(fc);bf.append(Integer.toString(foods * 10) + "\r\n");} catch (IOException e) {e.toString();}try {bf.flush();bf.close();fc.close();} catch (IOException e) {e.toString();}}public void defen() {re = new ArrayList<String>();FileReader fr = null;BufferedReader bfr = null;if (file.exists()) {try {fr = new FileReader(file);bfr = new BufferedReader(fr);fenshu = bfr.readLine();re.add(fenshu);while (fenshu != null) {fenshu = bfr.readLine();re.add(fenshu);}if (re.size() >= 2) {fenshu = re.get(re.size() - 2);} else {fenshu = "无记录";}} catch (IOException e) {e.toString();}maxfenshu = Integer.valueOf(re.get(0));for (int i = 0; i < re.size() - 1; i++) {if (maxfenshu < Integer.valueOf(re.get(i))) {maxfenshu = Integer.valueOf(re.get(i));System.out.println(i);}}} else {fenshu = "无记录";}}}。

FLASH游戏之贪吃蛇游戏源代码

FLASH游戏之贪吃蛇游戏源代码

} } } function timestart(){ clearInterval(Interval); Interval=setInterval(walk,time[speed],x1,y1); }
clear(); score=0; x = startlong-1; y = 0; x1 = 1; y1 = 0; map = new Array(); for (i=0; i<20; i++) {
map[i] = new Array(20); } snake = new Array(); x = artlong-1; y = 0; for (var long = 0; long<startlong; long++) {
body(long, 0); } egg(); game="start";
运行结果如图:
gotoAndStop("over"); } else {
snake.push(snake[0]);
snake.shift(0); snake[long-1]._x = x*8; snake[long-1]._y = y*8; map[x][y] = 1; walks.start(); } } } function egg() { var x2, y2; x2 = random(20); y2 = random(20); while (map[x2][y2] == 1) { x2 = random(20); y2 = random(20); } map[x2][y2] = 2; egg2._x = x2*8; egg2._y = y2*8; } function body(x3, y3) { window.attachMovie(snakebody, "snake"+long,long); temp=eval("window.snake"+long); temp._x=x3*8; temp._y=y3*8; snake.push(temp); map[x3][y3] = 1; } function enter(){ if(game=="stop"){ stopallsound() gotoandplay("start"); }else if(game=="pause"){ game="start"; gotoandplay("play"); }else if(game=="start"){ game="pause"; gotoandplay("pause") } } function clear(){ if (long>startlong) { for (i=0; i<=long; i++) { snake[i].removeMovieClip();

贪吃蛇小游戏源代码

贪吃蛇小游戏源代码
return 1;
}
tail=(tail+1)%80;
qipan[zuobiao[0][head]][zuobiao[1][head]]='*';
head=(head+1)%80;
zuobiao[0][head]=x;
zuobiao[1][head]=y;
qipan[zuobiao[0][head]][zuobiao[1][head]]='#';
/*处理棋盘*/
char qipan[20][80];//定义棋盘
for(i=0;i<20;i++)
for(j=0;j<80;j++)
qipan[i][j]=' ';//初始化棋盘
for(i=0;i<80;i++)
qipan[0][i]='_';
for(i=0;i<20;i++)
qipan[i][0]='|';
printf("Input your game speed,please.(e.g.300)\n");
scanf("%d",&gamespeed);
while(direction!='q')
{
system("cls");
for(i=0;i<20;i++)//打印出棋盘
for(j=0;j<80;j++)
direction='q';
system("cls");
printf("GAME OVER!\n");

贪吃蛇游戏安卓源代码

贪吃蛇游戏安卓源代码

附录1.SnakeView类package com.example.android_snake.view;import java.util.ArrayList;import java.util.List;import java.util.Random;import java.util.Timer;import java.util.TimerTask;import com.example.android_snake.R;import com.example.android_snake.food.Food;import com.example.android_snake.snake.Body;import com.example.android_snake.snake.Head;import com.example.android_snake.snake.Snake;import com.example.android_snake.snake.SnakeDirection; import com.example.android_snake.stone.Stone;import android.annotation.SuppressLint;import android.content.Context;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Paint;import android.graphics.Paint.Style;import android.os.Handler;import android.util.DisplayMetrics;import android.view.Display;import android.view.MotionEvent;import android.view.View;import android.view.ViewManager;import android.view.WindowManager;import android.widget.Toast;public class SnakeView extends View {private Context context;private Bitmap headBitmap;private Bitmap bodyBitmap;private Bitmap foodBitmap;private Bitmap stoneBitmap;// 屏幕的高度和宽度private int screenHeight;private int screenWidth;// 每个小格子的高度和宽度private int eachHeight;private int eachWidth;private Snake snake;private Food food;private Stone stone;private int [] listx;private int [] listy;private Timer timer = new Timer();Handler handler = new Handler() {public void handleMessage(android.os.Message msg) {moveSnake();invalidate();}};public SnakeView(Context context) {super(context);this.context = context;listx =new int[100];listy =new int[100];// 获得屏幕的高和宽DisplayMetrics metrics = new DisplayMetrics();WindowManager windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);windowManager.getDefaultDisplay().getMetrics(metrics);screenHeight = metrics.heightPixels;screenWidth = metrics.widthPixels;eachHeight = screenHeight / 32;eachWidth = screenWidth / 20;// 初始化图片headBitmap = BitmapFactory.decodeResource(getResources(),R.drawable.head);bodyBitmap = BitmapFactory.decodeResource(getResources(),R.drawable.body);foodBitmap = BitmapFactory.decodeResource(getResources(),R.drawable.food);stoneBitmap = BitmapFactory.decodeResource(getResources(),R.drawable.stone);this.initSnake();this.initFood();this.initstone();gameRun();}@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);Paint paint = new Paint();// 定义画笔paint.setColor(Color.GRAY);// 设置画笔颜色paint.setAntiAlias(true);// 去除锯齿paint.setStyle(Style.STROKE);// 设置空心实心paint.setTextSize(40);drawLines(canvas, paint);drawStone(canvas, paint);if(isCollide()){canvas.drawText("Game Over!", screenWidth/4, screenHeight/3, paint);canvas.drawText("得分", screenWidth/4, screenHeight/2, paint);timer.cancel();}else{this.drawSnake(canvas, paint);}boolean flag = IsRectCollision(snake.getHead().getPointX(), snake.getHead().getPointY(), eachWidth, eachHeight,food.getPointX(), food.getPointY(), eachWidth, eachHeight);if (flag) {food = null;snake.getBodyList().add(new Body());this.initFood();this.initstone();} else {this.drawFood(canvas, paint);this.drawStone(canvas, paint);}}//方向控制@Overridepublic boolean onTouchEvent(MotionEvent event) {int x = (int) event.getX();int y = (int) event.getY();SnakeDirection nowDir = snake.getSnakeDirection();int m = -screenHeight * x + screenHeight * screenWidth - screenWidth * y;int n = screenHeight * x - screenWidth * y;if ((m > 0 && n > 0) && (nowDir != SnakeDirection.DOWN)) {snake.setSnakeDirection(SnakeDirection.UP);} else if ((m > 0 && n < 0) && (nowDir != SnakeDirection.RIGHT)) { snake.setSnakeDirection(SnakeDirection.LEFT);} else if ((m < 0 && n > 0) && (nowDir != SnakeDirection.LEFT)) { snake.setSnakeDirection(SnakeDirection.RIGHT);} else if ((m < 0 && n < 0) && (nowDir != SnakeDirection.UP)) { snake.setSnakeDirection(SnakeDirection.DOWN);}return super.onTouchEvent(event);}public void gameRun() {timer.scheduleAtFixedRate(new TimerTask() {public void run() {handler.obtainMessage().sendToTarget();}}, 100, 400);}/** 画网格线*/public void drawLines(Canvas canvas, Paint paint) {int startX = 0, startY = 0;for (int i = 0; i < 100; i++) {canvas.drawLine(0, startY, screenWidth, startY, paint);startY = startY + eachHeight;}for (int i = 0; i < 100; i++) {canvas.drawLine(startX, 0, startX, screenHeight, paint);startX = startX + eachWidth;}canvas.drawLine(0, 0, screenWidth, screenHeight, paint);canvas.drawLine(0, screenHeight, screenWidth, 0, paint);}// 初始化蛇public void initSnake() {List<Body> bodies = new ArrayList<Body>();Head head = new Head(eachWidth * 4, eachHeight * 2, headBitmap);Body body1 = new Body(eachWidth * 3, eachHeight * 2, bodyBitmap);Body body2 = new Body(eachWidth * 2, eachHeight * 2, bodyBitmap);Body body3 = new Body(eachWidth * 1, eachHeight * 2, bodyBitmap);Body body4 = new Body(eachWidth * 0, eachHeight * 2, bodyBitmap);bodies.add(body1);bodies.add(body2);bodies.add(body3);bodies.add(body4);snake = new Snake(head, bodies, SnakeDirection.RIGHT);}// 画蛇public void drawSnake(Canvas canvas, Paint paint) {canvas.drawBitmap(headBitmap, snake.getHead().getPointX(), snake .getHead().getPointY(), paint);for (int i = 0; i < snake.getBodyList().size(); i++) {canvas.drawBitmap(bodyBitmap, snake.getBodyList().get(i).getPointX(), snake.getBodyList().get(i).getPointY(), paint);}}// 改变蛇身的位置public void changSnakePosition(int pointX, int pointY) {for (int i = snake.getBodyList().size() - 1; i > 0; i--) {snake.getBodyList().get(i).setPointX(snake.getBodyList().get(i - 1).getPointX());snake.getBodyList().get(i).setPointY(snake.getBodyList().get(i - 1).getPointY());}snake.getBodyList().get(0).setPointX(snake.getHead().getPointX());snake.getBodyList().get(0).setPointY(snake.getHead().getPointY());}// 移动蛇public void moveSnake() {int nowPointX = snake.getHead().getPointX();int nowPointY = snake.getHead().getPointY();if (snake.getSnakeDirection() == SnakeDirection.RIGHT) {changSnakePosition(nowPointX, nowPointY);if (nowPointX >= screenWidth - eachWidth) {snake.getHead().setPointX(0);} else {snake.getHead().setPointX(nowPointX + eachWidth);}} else if (snake.getSnakeDirection() == SnakeDirection.DOWN) { changSnakePosition(nowPointX, nowPointY);if (nowPointY >= screenHeight - eachHeight) {snake.getHead().setPointY(0);} else {snake.getHead().setPointY(nowPointY + eachHeight);}} else if (snake.getSnakeDirection() == SnakeDirection.LEFT) {changSnakePosition(nowPointX, nowPointY);if (nowPointX <= 0) {snake.getHead().setPointX(screenWidth - eachWidth);} else {snake.getHead().setPointX(nowPointX - eachWidth);}} else if (snake.getSnakeDirection() == SnakeDirection.UP) {changSnakePosition(nowPointX, nowPointY);if (nowPointY <= 0) {snake.getHead().setPointY(screenHeight - eachHeight);} else {snake.getHead().setPointY(nowPointY - eachHeight);}}}// 初始化foodpublic void initFood() {int x = new Random().nextInt(19);int y = new Random().nextInt(29);food = new Food(eachWidth * x, eachHeight * y, foodBitmap);}// 在界面上画出Foodpublic void drawFood(Canvas canvas, Paint paint) {if (food != null) {canvas.drawBitmap(foodBitmap, food.getPointX(), food.getPointY(),paint);}}// 初始化stonepublic void initstone() {int x = new Random().nextInt(17);int y = new Random().nextInt(23);stone = new Stone(eachWidth * x, eachHeight * y, stoneBitmap);int i=0,j=0;listx[i++]=x;listy[j++]=y;}// 在界面上画出Stonepublic void drawStone(Canvas canvas, Paint paint) {if (true) {canvas.drawBitmap(stoneBitmap, stone.getPointX(), stone.getPointY(),paint);for(int k=0;k<100;k++){//food = new Food(eachWidth * listx[k], eachHeight * listy[k], foodBitmap);//canvas.drawBitmap(stoneBitmap,listx[k], listy[k],paint);}}}/*** 矩形碰撞检测参数为x,y,width,height** @param x1* 第一个矩形的x* @param y1* 第一个矩形的y* @param w1* 第一个矩形的w* @param h1* 第一个矩形的h* @param x2* 第二个矩形的x* @param y2* 第二个矩形的y* @param w2* 第二个矩形的w* @param h2* 第二个矩形的h* @return是否碰撞*/public boolean IsRectCollision(int x1, int y1, int w1, int h1, int x2, int y2, int w2, int h2) {if (x2 > x1 && x2 >= x1 + w1) {return false;} else if (x2 < x1 && x2 <= x1 - w2) {return false;} else if (y2 > y1 && y2 >= y1 + h1) {return false;} else if (y2 < y1 && y2 <= y1 - h2) {return false;} else {return true;}}//检测蛇头是否与蛇身碰撞//检测蛇头与墙的碰撞//public boolean isCollide() {boolean flag = false;for (int i = 0; i < snake.getBodyList().size(); i++) {flag = IsRectCollision(snake.getHead().getPointX(),snake.getHead().getPointY(), eachWidth, eachHeight,snake.getBodyList().get(i).getPointX(),snake.getBodyList().get(i).getPointY(),eachWidth,eachHeight);for(int j=0;j<100;j++){flag = IsRectCollision(snake.getHead().getPointX(),snake.getHead().getPointY(), eachWidth, eachHeight,listx[j],listy[j], eachWidth,eachHeight);if(flag){break;}}if ((snake.getHead().getPointX() < 1) ||(snake.getHead().getPointY() < 1) ||(snake.getHead().getPointX() > screenWidth - 1)||(snake.getHead().getPointY() > screenHeight - 1)){flag = true;}if(flag){break;}}return flag;}}2.MainActivity类package com.example.android_snake;import com.example.android_snake.R;import com.example.android_snake.view.SnakeView;//Downloads By import android.os.Bundle;import android.app.Activity;import android.view.Menu;import android.view.MenuItem;import android.view.Window;import android.view.WindowManager;public class MainActivity extends Activity {@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);requestWindowFeature(Window.FEATURE_NO_TITLE);//设置全屏getWindow().setFlags(youtParams.FLAG_FULLSCREEN, youtParams.FLAG_FULLSCREEN);SnakeView view = new SnakeView(this);setContentView(view);}@Overridepublic boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.main, menu);return true;}}3.Food类package com.example.android_snake.food;import android.graphics.Bitmap;public class Food {private int pointX;private int pointY;private Bitmap foodBitmap;public Food() {super();}public Food(int pointX, int pointY, Bitmap foodBitmap) { super();this.pointX = pointX;this.pointY = pointY;this.foodBitmap = foodBitmap;}public int getPointX() {return pointX;}public void setPointX(int pointX) {this.pointX = pointX;}public int getPointY() {return pointY;}public void setPointY(int pointY) {this.pointY = pointY;}public Bitmap getFoodBitmap() {return foodBitmap;}public void setFoodBitmap(Bitmap foodBitmap) {this.foodBitmap = foodBitmap;}}4.Body类package com.example.android_snake.snake;import android.graphics.Bitmap;public class Body {private int pointX;private int pointY;private Bitmap bodyBitMap;public Body() {super();}public Body(int pointX, int pointY, Bitmap bodyBitMap) { super();this.pointX = pointX;this.pointY = pointY;this.bodyBitMap = bodyBitMap;}public int getPointX() {return pointX;}public void setPointX(int pointX) {this.pointX = pointX;}public int getPointY() {return pointY;}public void setPointY(int pointY) {this.pointY = pointY;}public Bitmap getBodyBitMap() {return bodyBitMap;}public void setBodyBitMap(Bitmap bodyBitMap) {this.bodyBitMap = bodyBitMap;}}5.Head类package com.example.android_snake.snake;import android.graphics.Bitmap;public class Head {private int pointX;private int pointY;private Bitmap headBitMap;public Head() {super();}public Head(int pointX, int pointY, Bitmap headBitMap) {super();this.pointX = pointX;this.pointY = pointY;this.headBitMap = headBitMap;}public int getPointX() {return pointX;}public void setPointX(int pointX) {this.pointX = pointX;}public int getPointY() {return pointY;}public void setPointY(int pointY) {this.pointY = pointY;}public Bitmap getHeadBitMap() {return headBitMap;}public void setHeadBitMap(Bitmap headBitMap) {this.headBitMap = headBitMap;}}6.Snake类package com.example.android_snake.snake;import java.util.ArrayList;import java.util.List;import android.graphics.Bitmap;public class Snake {private Head head;private Body body;private List<Body> bodyList;private SnakeDirection snakeDirection;public Snake(){}public Snake(Head head,List<Body> bodyList,SnakeDirection snakeDirection){ super();this.head = head;this.bodyList = bodyList;this.snakeDirection = snakeDirection;}public Head getHead() {return head;}public void setHead(Head head) {this.head = head;}public Body getBody() {return body;}public void setBody(Body body) {this.body = body;}public List<Body> getBodyList() {return bodyList;}public void setBodyList(List<Body> bodyList) {this.bodyList = bodyList;}public SnakeDirection getSnakeDirection() {return snakeDirection;}public void setSnakeDirection(SnakeDirection snakeDirection) { this.snakeDirection = snakeDirection;}}7.SnakeDirection类package com.example.android_snake.snake;public enum SnakeDirection {UP,DOWN,LEFT,RIGHT;}8.Stone类package com.example.android_snake.stone;import android.graphics.Bitmap;public class Stone {private int pointX;private int pointY;private Bitmap stoneBitmap;public Stone() {super();}public Stone(int pointX, int pointY, Bitmap foodBitmap) { super();this.pointX = pointX;this.pointY = pointY;this.stoneBitmap = stoneBitmap;}public int getPointX() {return pointX;}public void setPointX(int pointX) {this.pointX = pointX;}public int getPointY() {return pointY;}public void setPointY(int pointY) {this.pointY = pointY;}public Bitmap getStoneBitmap() {return stoneBitmap;}public void setFoodBitmap(Bitmap foodBitmap) { this.stoneBitmap = stoneBitmap;}}。

贪吃蛇 源代码

贪吃蛇 源代码

#include"stdafx.h"#include<iostream>#include<conio.h>#include<time.h>#include<windows.h>using namespace std;const int X=30,Y=15; //初始边界大小int level=1; //初始等级int length=3; //初始长度int food_bool=0; //食物是否存在int food_x,food_y; //食物存在的座标char direction='d'; //初始方向int success=1; //成功条件void SetPoint(int x,int y) //构造gotoxy函数{COORD s={x,y};SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),s);}struct body{ //构造蛇和墙体的身体int x,y;body *next;};body *head=new(struct body); //声明蛇头body *wall; //声明墙体的头节点class snake{ //构造蛇类public:void gaming(); //声明游戏的主函数void map(); //声明边界构造函数void paint_body(); //声明蛇体构造函数void food(); //声明创建食物函数void str_wall(); //声明墙体构造函数void add_wall(); //声明墙体添加函数};void snake::str_wall() //墙体构造函数{struct body *p=new(struct body); //声明并初始化操作节点wall=p; //让墙体头节点等于pp->x=(rand()+time(NULL))%(X-3)+2; //随机创建节点坐标p->y=(rand()+time(NULL))%(Y-3)+2;int k=0;while(k==0) //判断墙体是否出现在蛇身{k=1;struct body *q;q=head;while(q!=NULL){if(p->x==q->x&&p->y==q->y){k=0;p->x=(rand()+time(NULL))%(X-3)+2;p->y=(rand()+time(NULL))%(Y-3)+2;break;}q=q->next;}}SetPoint(p->x,p->y);cout<<"■";for(int i=0;i<10;i++){p->next=new(struct body); //构建10个初始墙体p=p->next;p->x=(rand()+time(NULL))%(X-3)+2;p->y=(rand()+time(NULL))%(Y-3)+2;while(k==0) //判断墙体是否出现在蛇身{k=1;struct body *q;q=head;while(q!=NULL){if(p->x==q->x&&p->y==q->y){k=0;p->x=(rand()+time(NULL))%(X-3)+2;p->y=(rand()+time(NULL))%(Y-3)+2;break;}q=q->next;}}k=0;SetPoint(p->x,p->y); //墙体出现位置正确时画出墙体cout<<"■";}p->next=NULL; //设置末节点为NULL}void snake::add_wall() //墙体添加函数{struct body *p;for(int i=0;i<3;i++) //判断墙体是否成立{p=new(struct body);int k=0;p->x=(rand()+time(NULL))%(X-3)+2;p->y=(rand()+time(NULL))%(Y-3)+2;while(k==0){k=1;struct body *q;q=head;while(q!=NULL){if(p->x==q->x&&p->y==q->y){k=0;p->x=(rand()+time(NULL))%(X-3)+2;p->y=(rand()+time(NULL))%(Y-3)+2;break;}q=q->next;}}p->next=wall;wall=p; //将新得到的墙体插入到头节点SetPoint(p->x,p->y);cout<<"■";}}void snake::food() //创建食物函数{int k;k=0;food_x=(rand()+time(NULL))%(X-3)+2;food_y=(rand()+time(NULL))%(Y-3)+2;body *p;while(k==0){k=1;p=wall;while(p!=NULL) //判断食物是否出现在墙体上{if(p->x==food_x&&p->y==food_y){k=0;food_x=(rand()+time(NULL))%(X-3)+2;food_y=(rand()+time(NULL))%(Y-3)+2;break;}p=p->next;}p=head;while(p!=NULL) //判断食物是否出现在蛇身上{if(p->x==food_x&&p->y==food_y){k=0;food_x=(rand()+time(NULL))%(X-3)+2;food_y=(rand()+time(NULL))%(Y-3)+2;break;}p=p->next;}}SetPoint(food_x,food_y); //画出食物cout<<"*";food_bool=1;}void snake::map() //边界构造函数{system("cls"); //清屏for(int i=0;i<=X;i+=2) //画出墙体{SetPoint(i,0);cout<<"■";}for(int i=1;i<Y;i++){SetPoint(0,i);cout<<"■";}for(int i=1;i<Y;i++){SetPoint(X,i);cout<<"■";}for(int i=0;i<=X+1;i+=2){SetPoint(i,Y);cout<<"■";}SetPoint(X+5,3); //画出信息cout<<"长度:"<<length;SetPoint(X+5,5);cout<<"等级:"<<level;}void snake::paint_body() //蛇体构造函数{body *body; //构建身体,比较丑,但是不想改了head->x=X/2; //游戏开始时,蛇出现在地图中心,此时长度为三 head->y=Y/2;body=new(struct body);head->next=body;body->x=head->x-1;body->y=head->y;body->next=new(struct body);body->next->x=head->x-2;body->next->y=head->y;body->next->next=NULL;SetPoint(head->x,head->y);cout<<"*";SetPoint(head->next->x,head->next->y);cout<<"*";SetPoint(head->next->next->x,head->next->next->y);cout<<"*";}void snake::gaming() //这里是gaming!!!!!!!!!!{int time_begin=clock();char x;char x1;struct body *newb;newb=new(body);map(); //构造边界paint_body(); //构造蛇身体str_wall(); //构造墙体food(); //构造一个食物x=direction; //读取方向while(1){if(_kbhit()) //如果读入缓存中有输入{x=_getch();while(_kbhit()) //读掉剩下的输入缓存中的数_getch();}if(x==' '){_getch();x=direction;}elseif((x=='w'||x=='W')&&direction!='s'){newb->x=head->x;newb->y=head->y-1;x1='w';}else if((x=='a'||x=='A')&&direction!='d'){newb->x=head->x-1;newb->y=head->y;x1='a';}else if((x=='s'||x=='S')&&direction!='w'){newb->x=head->x;newb->y=head->y+1;x1='s';}else if((x=='d'||x=='D')&&direction!='a'){newb->x=head->x+1;newb->y=head->y;x1='d';}else{if(x1=='w'){newb->x=head->x;newb->y=head->y-1;}else if(x1=='a'){newb->x=head->x-1;newb->y=head->y;}else if(x1=='s'){newb->x=head->x;newb->y=head->y+1;}else if(x1=='d'){newb->x=head->x+1;newb->y=head->y;}}if(clock()-time_begin>(500-level*45))//移动蛇身,随时间加快{time_begin=clock();{direction=x1;newb->next=head;head=newb;}if(head->x==food_x&&head->y==food_y)//遇见食物吃掉,食物小时{food_bool=0;}if(head->x==X||head->y==Y||head->x==0||head->y==0)//遇到墙体死亡{success=0;}else{body *p=head->next;if(food_bool==1){while(p->next!=NULL){if(p->x==head->x&&p->y==head->y)success=0;p=p->next;}}else{while(p!=NULL){if(p->x==head->x&&p->y==head->y)success=0;p=p->next;}}}{body *p=wall;while(p!=NULL){if(p->x==head->x&&p->y==head->y)//遇到墙体死亡success=0;p=p->next;}}if(success==0){system("cls");cout<<"你失败了"<<endl;cout<<"死的时候你的长度为"<<length<<endl;break;}if(food_bool==1){body *p=head;while(p->next->next!=NULL)//将指针移到末尾{p=p->next;}SetPoint(p->next->x,p->next->y);//蛇身移动后最后一部分消失cout<<" ";delete(p->next);p->next=NULL;}else{food();length++;if(length%5==0){level++;add_wall();}if(level==10)success=2;SetPoint(X+5,3);cout<<"长度:"<<length;SetPoint(X+5,5);cout<<"等级:"<<level;}{SetPoint(head->x,head->y);//吃到食物后蛇身增加cout<<"*";}if(success==2){system("cls");cout<<"你通关了"<<endl;break;}newb=new(body);}SetPoint(X+30,Y);}}void prompt(){cout<<"****************************************************"<<endl;cout<<"* 欢迎进入贪吃蛇世界 *"<<endl;cout<<"* *代表蛇身或食物 *"<<endl;cout<<"* ■代表墙 *"<<endl;cout<<"* *"<<endl;cout<<"* *"<<endl;cout<<"* 初试身体长度为3,每到5的倍数升一级 *"<<endl;cout<<"* *"<<endl;cout<<"* wasd操控,注意切换输入法哦 *"<<endl;cout<<"* *"<<endl;cout<<"* 每升一级速度加快,同时增加三个墙体 *"<<endl;cout<<"* *"<<endl;cout<<"* 按任意键开始游戏 *"<<endl;cout<<"* ps:按空格键暂停 *"<<endl;cout<<"****************************************************"<<endl;_getch();}int main(int argc,char argv[]){snake H;prompt();system("cls");H.gaming();system("pause");return 0;}。

贪吃蛇游戏源代码

贪吃蛇游戏源代码

贪吃蛇游戏源代码#include <stdio.h>#include <stdlib.h>#include <conio.h>#include <graphics.h>#include <bios.h>#include <dos.h>#include<string.h>#define LEFT_MARGIN 140#define FRAME_UNIT_WIDTH 25#define FRAME_UNIT_HEIGHT 15#define BOX_SIZE 15#define WINDOW_WIDTH 640#define WINDOW_HEIGHT 480#define SNAK_DEFAULT_POS_X 10#define SNAK_DEFAULT_POS_Y 5#define SMD_UP 1#define SMD_DOWN 2#define SMD_RIGHT 3#define SMD_LEFT 4#define UP_MOVE 72#define DOWN_MOVE 80#define LEFT_MOVE 75#define RIGHT_MOVE 77#define STEP_MOVE 7#define GAME_STOP 57#define ESC_OUT 1#define GENERAT_EGG 8#define NO_EVENT 0#define Boolean int#define TRUTH 1#define FALS 0#define Type_GAMESTATUS int#define ON_PAL YING 2#define WINNER 1#define GAMEOVER 0#define TIMEINTERV AL 6typedef struct{int p_X;int p_Y;}POS_in_Fram;typedef struct SNode{POS_in_Fram cur_pos;int color;struct SNode *next;}SNode, *LSNode;typedef struct{int direction;int len;POS_in_Fram Head_pre_pos; POS_in_Fram Head_cur_pos;int Head_color;LSNode next;Boolean Dead;}SNAK;typedef struct{POS_in_Fram egg_pos;int egg_color;}EggType;SNAK obj_snake;EggType obj_egg;int Message_Event;int ScoreTotal;int SpeedLevel;Type_GAMESTATUS GameStat;void set_Message_Event(int T){Message_Event = T;}int get_Message_Event(){return(Message_Event);}void clear_ScoreTotal(){ScoreTotal = 0;}int get_ScoreTotal(){return(ScoreTotal);}void draw_ScoreTotal(){char text_buffer[20];int ul_X, ul_Y;ul_X = LEFT_MARGIN;ul_Y = WINDOW_HEIGHT - BOX_SIZE * (FRAME_UNIT_HEIGHT - 4); setcolor(BLUE);sprintf(text_buffer, "Score Total: %d", get_ScoreTotal());moveto(ul_X, ul_Y);outtext(text_buffer);setcolor(YELLOW);ScoreTotal++;sprintf(text_buffer, "Score Total: %d", get_ScoreTotal());moveto(ul_X, ul_Y);outtext(text_buffer);}void init_SpeedLevel(){SpeedLevel = 1;}int get_SpeedLevel(){return(SpeedLevel);}void draw_SpeedLevel(int old_l, int new_l){char text_buffer[20];int ul_X, ul_Y;ul_X = LEFT_MARGIN;ul_Y = WINDOW_HEIGHT - BOX_SIZE * (FRAME_UNIT_HEIGHT - 4); setcolor(BLUE);sprintf(text_buffer, "Speed Level: %d", old_l);moveto(ul_X, ul_Y + textheight("H") * 2);outtext(text_buffer);setcolor(YELLOW);sprintf(text_buffer, "Speed Level: %d", new_l);moveto(ul_X, ul_Y + textheight("H") * 2);outtext(text_buffer);}void setSpeedLevel(int score){if(score >= 0 && score < 20){draw_SpeedLevel(get_SpeedLevel(), 1);SpeedLevel = 1;}else if(score >= 20 && score < 50){draw_SpeedLevel(get_SpeedLevel(), 2);SpeedLevel = 2;}else if(score >= 50 && score < 100){draw_SpeedLevel(get_SpeedLevel(), 3);SpeedLevel = 3;}else{draw_SpeedLevel(get_SpeedLevel(), 4);SpeedLevel = 4;}}void set_GameStat(Type_GAMESTATUS state){GameStat = state;}Type_GAMESTATUS get_GameStat() {return(GameStat);}void set_SnakeDead(Boolean T){obj_snake.Dead = T;}Boolean Is_SnakeDead(){return(obj_snake.Dead);}int get_SHOD(int T){switch(T){case SMD_UP:return(SMD_DOWN);case SMD_DOWN:return(SMD_UP);case SMD_RIGHT:return(SMD_LEFT);case SMD_LEFT:return(SMD_RIGHT);}}int get_SHD(){return(obj_snake.direction);}Boolean findPointInSnake(int pX, int pY) {LSNode p;if((obj_snake.Head_cur_pos.p_X == pX) && (obj_snake.Head_cur_pos.p_Y == pY))return(TRUTH);for(p = obj_snake.next;p != NULL;p = p->next){if((p->cur_pos.p_X == pX) && (p->cur_pos.p_Y == pY))return(TRUTH);}return(FALS);}Boolean Is_SnakEating(){if((obj_snake.Head_pre_pos.p_X == obj_egg.egg_pos.p_X) && (obj_snake.Head_pre_pos.p_Y == obj_egg.egg_pos.p_Y))return(TRUTH);elsereturn(FALS);}void Init_obj_snake(){obj_snake.direction = SMD_RIGHT;obj_snake.len = 1;obj_snake.Head_cur_pos.p_X = SNAK_DEFAULT_POS_X;obj_snake.Head_cur_pos.p_Y = SNAK_DEFAULT_POS_Y;obj_snake.Head_pre_pos = obj_snake.Head_cur_pos;obj_snake.Head_color = RED;obj_snake.next = NULL;obj_snake.Dead = FALS;}void Init_obj_egg(){obj_egg.egg_pos.p_X = 0;obj_egg.egg_pos.p_Y = 0;obj_egg.egg_color = BLACK;}void RegistryGraphicMode(){int Driver, Mode;detectgraph(&Driver, &Mode);initgraph(&Driver, &Mode,"");}void Draw_FrameInWindow(int f_ul_X, int f_ul_Y, int f_dr_X, int f_dr_Y, int W, int H) {int i, x, y;rectangle(f_ul_X - 1, f_ul_Y - 1, f_dr_X + 1, f_dr_Y + 1);setfillstyle(SOLID_FILL, BLACK);bar(f_ul_X, f_ul_Y, f_dr_X, f_dr_Y);setcolor(DARKGRAY);for(i = 1;i < W;i++){x = f_ul_X + i * BOX_SIZE;line(x, f_ul_Y, x, f_dr_Y);}for(i = 1;i < H;i++){y = f_ul_Y + i * BOX_SIZE;line(f_ul_X, y, f_dr_X, y);}}void Draw_mainGraphWindow(){int ul_X, ul_Y, dr_X, dr_Y;setfillstyle(SOLID_FILL, BLUE);bar(0, 0, WINDOW_WIDTH - 1, WINDOW_HEIGHT - 1);ul_X = LEFT_MARGIN;ul_Y = WINDOW_HEIGHT - BOX_SIZE * (FRAME_UNIT_HEIGHT * 2 - 3);dr_X = LEFT_MARGIN + BOX_SIZE * FRAME_UNIT_WIDTH;dr_Y = WINDOW_HEIGHT - BOX_SIZE * (FRAME_UNIT_HEIGHT - 3);Draw_FrameInWindow(ul_X, ul_Y, dr_X, dr_Y, FRAME_UNIT_WIDTH, FRAME_UNIT_HEIGHT);ul_X = LEFT_MARGIN;ul_Y = WINDOW_HEIGHT - BOX_SIZE * (FRAME_UNIT_HEIGHT - 4);settextjustify(LEFT_TEXT, TOP_TEXT);settextstyle(DEFAULT_FONT, HORIZ_DIR, 1);setcolor(YELLOW);sprintf(text_buffer, "Score Total: %d", get_ScoreTotal());moveto(ul_X, ul_Y);outtext(text_buffer);sprintf(text_buffer, "Speed Level: %d", get_SpeedLevel());moveto(ul_X, gety() + textheight("H") * 2);outtext(text_buffer);strcpy(text_buffer, "EXIT: ESC Button");moveto(ul_X, gety() + textheight("H") * 2);outtext(text_buffer);strcpy(text_buffer, "Created By: qiuyongfei");moveto(ul_X, gety() + textheight("H") * 2);outtext(text_buffer);strcpy(text_buffer, "Class: 04hulianwang29hao");moveto(ul_X, gety() + textheight("H") * 2);outtext(text_buffer);strcpy(text_buffer, "UP: Up Arrow");moveto(ul_X + textwidth("H") * 30, ul_Y);strcpy(text_buffer, "DOWN: Down Arrow");moveto(ul_X + textwidth("H") * 30, gety() + textheight("H") * 2);outtext(text_buffer);strcpy(text_buffer, "LEFT: Left Arrow");moveto(ul_X + textwidth("H") * 30, gety() + textheight("H") * 2);outtext(text_buffer);strcpy(text_buffer, "RIGHT: Right Arrow");moveto(ul_X + textwidth("H") * 30, gety() + textheight("H") * 2);outtext(text_buffer);strcpy(text_buffer, "STOP: Space Button");moveto(ul_X + textwidth("H") * 30, gety() + textheight("H") * 2);outtext(text_buffer);}void draw_egg(Boolean T){int ul_X, ul_Y;int color;ul_X = LEFT_MARGIN;ul_Y = WINDOW_HEIGHT - BOX_SIZE * (FRAME_UNIT_HEIGHT * 2 - 3);if(T == FALS)color = BLACK;elsecolor = obj_egg.egg_color;setfillstyle(SOLID_FILL, color);bar(ul_X + BOX_SIZE * obj_egg.egg_pos.p_Y + 1, ul_Y + BOX_SIZE * obj_egg.egg_pos.p_X + 1, ul_X + BOX_SIZE * (obj_egg.egg_pos.p_Y + 1) - 1, ul_Y + BOX_SIZE * (obj_egg.egg_pos.p_X + 1) - 1);}void Mapped_Draw(Boolean T){int ul_X, ul_Y;int Ax, Ay, Bx, By;int color;LSNode p;ul_X = LEFT_MARGIN;ul_Y = WINDOW_HEIGHT - BOX_SIZE * (FRAME_UNIT_HEIGHT * 2 - 3);if(T == FALS)color = BLACK;elsecolor = obj_snake.Head_color;setfillstyle(SOLID_FILL, color);Ax = ul_X + BOX_SIZE * obj_snake.Head_cur_pos.p_Y + 1;Ay = ul_Y + BOX_SIZE * obj_snake.Head_cur_pos.p_X + 1;Bx = ul_X + BOX_SIZE * (obj_snake.Head_cur_pos.p_Y + 1) - 1;By = ul_Y + BOX_SIZE * (obj_snake.Head_cur_pos.p_X + 1) - 1;bar(Ax, Ay, Bx, By);if(T == TRUTH){setfillstyle(SOLID_FILL, YELLOW);bar(Ax + 4, Ay + 4, Ax + 4 + 5, Ay + 4 + 5);}for(p = obj_snake.next;p != NULL;p = p->next){if(T == FALS)color = BLACK;elsecolor = p->color;setfillstyle(SOLID_FILL, color);Ax = ul_X + BOX_SIZE * p->cur_pos.p_Y + 1;Ay = ul_Y + BOX_SIZE * p->cur_pos.p_X + 1;Bx = ul_X + BOX_SIZE * (p->cur_pos.p_Y + 1) - 1;By = ul_Y + BOX_SIZE * (p->cur_pos.p_X + 1) - 1;bar(Ax, Ay, Bx, By);}}void draw_GS_GO_Surface(Type_GAMESTA TUS T){char text_buffer[40];settextjustify(LEFT_TEXT, TOP_TEXT);switch(T){case ON_PAL YING:settextstyle(SANS_SERIF_FONT, HORIZ_DIR, 4);setcolor(LIGHTCY AN);strcpy(text_buffer, "ITEM - 2: Game.Greed Snake");moveto(100, 100);outtext(text_buffer);settextstyle(SANS_SERIF_FONT, HORIZ_DIR, 1);setcolor(YELLOW);strcpy(text_buffer, "Please press any key to continue ...");moveto(150, 300);outtext(text_buffer);break;case GAMEOVER:settextstyle(GOTHIC_FONT, HORIZ_DIR, 8);setcolor(RED);strcpy(text_buffer, "GAME OVER");moveto(70, 80);outtext(text_buffer);settextstyle(SANS_SERIF_FONT, HORIZ_DIR, 2);setcolor(YELLOW);strcpy(text_buffer, "Sorry!");moveto(160, 320);outtext(text_buffer);sprintf(text_buffer, "Total Score: %d", get_ScoreTotal());moveto(240, 320);outtext(text_buffer);sprintf(text_buffer, "Speed Level: %d", get_SpeedLevel());moveto(240, 350);outtext(text_buffer);break;case WINNER:settextstyle(GOTHIC_FONT, HORIZ_DIR, 8);setcolor(RED);strcpy(text_buffer, "YOU WIN !");moveto(80, 80);outtext(text_buffer);settextstyle(SANS_SERIF_FONT, HORIZ_DIR, 2);setcolor(YELLOW);strcpy(text_buffer, "Congratulation!");moveto(120, 320);outtext(text_buffer);sprintf(text_buffer, "Total Score: %d", get_ScoreTotal());moveto(280, 320);outtext(text_buffer);sprintf(text_buffer, "Speed Level: %d", get_SpeedLevel());moveto(280, 350);outtext(text_buffer);break;default:break;}}void set_SH_Pre_Pos(int T){int H_pX, H_pY;H_pX = obj_snake.Head_cur_pos.p_X;H_pY = obj_snake.Head_cur_pos.p_Y;switch(T){case SMD_UP:if((H_pX - 1) < 0 || findPointInSnake(H_pX - 1, H_pY) == TRUTH){set_SnakeDead(TRUTH);return;}obj_snake.Head_pre_pos.p_X = H_pX - 1;obj_snake.Head_pre_pos.p_Y = H_pY;break;case SMD_DOWN:if((H_pX + 1) >= FRAME_UNIT_HEIGHT || findPointInSnake(H_pX + 1, H_pY) == TRUTH){set_SnakeDead(TRUTH);return;}obj_snake.Head_pre_pos.p_X = H_pX + 1;obj_snake.Head_pre_pos.p_Y = H_pY;break;case SMD_RIGHT:if((H_pY + 1) >= FRAME_UNIT_WIDTH || findPointInSnake(H_pX, H_pY + 1) == TRUTH){set_SnakeDead(TRUTH);return;}obj_snake.Head_pre_pos.p_X = H_pX;obj_snake.Head_pre_pos.p_Y = H_pY + 1;break;case SMD_LEFT:if((H_pY - 1) < 0 || findPointInSnake(H_pX, H_pY - 1) == TRUTH){set_SnakeDead(TRUTH);return;}obj_snake.Head_pre_pos.p_X = H_pX;obj_snake.Head_pre_pos.p_Y = H_pY - 1;break;}}Boolean set_SHD(int T){if(get_SHD() == T || get_SHOD(get_SHD()) == T) return(FALS);obj_snake.direction = T;return(TRUTH);}void process_SnakeNode(Boolean eated){int i;POS_in_Fram temp1_cur_pos, temp2_cur_pos; LSNode p, q;temp1_cur_pos = obj_snake.Head_cur_pos;obj_snake.Head_cur_pos = obj_snake.Head_pre_pos;p = obj_snake.next;for(i = 1;i < obj_snake.len;i++){temp2_cur_pos = p->cur_pos;p->cur_pos = temp1_cur_pos;temp1_cur_pos = temp2_cur_pos;p = p->next;}if(eated == TRUTH){q = (LSNode)malloc(sizeof(SNode));q->color = obj_egg.egg_color;q->cur_pos = temp1_cur_pos;if(obj_snake.len == 1){q->next = obj_snake.next;obj_snake.next = q;obj_snake.len++;return;}for(p = obj_snake.next;p->next != NULL;p = p->next);q->next = p->next;p->next = q;obj_snake.len++;}}void generate_Egg(){int temp_pX, temp_pY, temp_color;draw_egg(FALS);temp_pX = random(FRAME_UNIT_HEIGHT);temp_pY = random(FRAME_UNIT_WIDTH);while(findPointInSnake(temp_pX, temp_pY) == TRUTH){temp_pX = random(FRAME_UNIT_HEIGHT);temp_pY = random(FRAME_UNIT_WIDTH);}obj_egg.egg_pos.p_X = temp_pX;obj_egg.egg_pos.p_Y = temp_pY;for(temp_color = random(16);temp_color == BLACK;temp_color = random(16)); obj_egg.egg_color = temp_color;draw_egg(TRUTH);set_Message_Event(NO_EVENT);}void move_To(int T, Boolean step) {if(step == FALS){if(set_SHD(T) == FALS)goto Skip_1;}set_SH_Pre_Pos(T);if(Is_SnakeDead() == TRUTH) goto Skip_2;if(Is_SnakEating() == TRUTH) {Mapped_Draw(FALS);process_SnakeNode(TRUTH);Mapped_Draw(TRUTH);draw_ScoreTotal();setSpeedLevel(get_ScoreTotal());goto Skip_3;}else{Mapped_Draw(FALS);process_SnakeNode(FALS);Mapped_Draw(TRUTH);goto Skip_1;}Skip_1:set_Message_Event(NO_EVENT); return;Skip_2:set_Message_Event(ESC_OUT); return;Skip_3:set_Message_Event(GENERAT_EGG); return;}void pause_game(){while((bioskey(0) >> 8) != GAME_STOP);set_Message_Event(NO_EVENT);}void process_GameStat(Type_GAMESTATUS T) {LSNode p, q;switch(T){case ON_PAL YING:draw_GS_GO_Surface(ON_PAL YING);break;case WINNER:cleardevice();draw_GS_GO_Surface(WINNER);getch();break;case GAMEOVER:cleardevice();draw_GS_GO_Surface(GAMEOVER);getch();break;default:break;}p = obj_snake.next;while(p != NULL){q = p->next;free(p);}}Boolean IsWinner(){if(get_SpeedLevel() == 4)return(TRUTH);elsereturn(FALS);}Boolean IsGameOver(){if(get_Message_Event() == ESC_OUT)return(TRUTH);elsereturn(FALS);}Boolean IsTimeOut(){static long temp, sourc;temp = biostime(0, sourc);if((temp - sourc) < (TIMEINTERVAL - SpeedLevel))return FALS;else{sourc = temp;return TRUTH;}}void getMessageEvent(){if(get_Message_Event() == GENERAT_EGG || get_Message_Event() == ESC_OUT || get_Message_Event() == GAME_STOP)return;if(IsTimeOut() == TRUTH){set_Message_Event(STEP_MOVE);}if(bioskey(1)){set_Message_Event(bioskey(0) >> 8); return;}}void dispatchMessage_Event(){switch(get_Message_Event()){case UP_MOVE:move_To(SMD_UP, FALS);break;case DOWN_MOVE:move_To(SMD_DOWN, FALS);break;case LEFT_MOVE:move_To(SMD_LEFT, FALS);break;case RIGHT_MOVE:move_To(SMD_RIGHT, FALS);break;case STEP_MOVE:move_To(get_SHD(), TRUTH);break;case GENERA T_EGG:generate_Egg();break;case GAME_STOP:pause_game();break;case ESC_OUT:break;default:set_Message_Event(NO_EVENT); }}void main(){RegistryGraphicMode();set_GameStat(ON_PAL YING);process_GameStat(get_GameStat());clear_ScoreTotal();Init_obj_snake();Init_obj_egg();init_SpeedLevel();randomize();set_Message_Event(GENERAT_EGG);getch();cleardevice();Draw_mainGraphWindow();do{getMessageEvent(); dispatchMessage_Event();if(IsWinner() == TRUTH){set_GameStat(WINNER);break;}if(IsGameOver() == TRUTH){set_GameStat(GAMEOVER); break;}}while(1);process_GameStat(get_GameStat());closegraph(); }。

贪吃蛇游戏c语言源代码

贪吃蛇游戏c语言源代码

#include <stdlib.h>#include <graphics.h>#include <bios.h>#include <dos.h>#include <conio.h>#define Enter 7181#define ESC 283#define UP 18432#define DOWN 20480#define LEFT 19200#define RIGHT 19712#ifdef __cplusplus#define __CPPARGS ...#else#define __CPPARGS#endifvoid interrupt (*oldhandler)(__CPPARGS);void interrupt newhandler(__CPPARGS);void SetTimer(void interrupt (*IntProc)(__CPPARGS));void KillTimer(void);void Initgra(void);void TheFirstBlock(void);void DrawMap(void);void Initsnake(void);void Initfood(void);void Snake_Headmv(void);void Flag(int,int,int,int);void GameOver(void);void Snake_Bodymv(void);void Snake_Bodyadd(void);void PrntScore(void);void Timer(void);void Win(void);void TheSecondBlock(void);void Food(void);void Dsnkorfd(int,int,int);void Delay(int);struct Snake{int x;int y;int color;}Snk[12];struct Food{int x;int y;int color;}Fd;int flag1=1,flag2=0,flag3=0,flag4=0,flag5=0,flag6=0,checkx,checky,num,key=0,Times,Score,Hscore,Snkspeed,TimerCounter,TureorFalse; char Sco[2],Time[6];void main(){ Initgra();SetTimer(newhandler);TheFirstBlock();while(1){DrawMap();Snake_Headmv();GameOver();Snake_Bodymv();Snake_Bodyadd();PrntScore();Timer();Win();if(key==ESC)break;if(key==Enter){cleardevice();TheFirstBlock();}TheSecondBlock();Food();Delay(Snkspeed);}closegraph();KillTimer();}void interrupt newhandler(__CPPARGS){TimerCounter++;oldhandler();}void SetTimer(void interrupt (*IntProc)(__CPPARGS)) {oldhandler=getvect(0x1c);disable();setvect(0x1c,IntProc);enable();}void KillTimer(){disable();setvect(0x1c,oldhandler);enable();}void Initgra(){int gd=DETECT,gm;initgraph(&gd,&gm,"d:\\tc");}void TheFirstBlock(){setcolor(11);settextstyle(0,0,4);outtextxy(100,220,"The First Block");loop:key=bioskey(0);if(key==Enter){cleardevice();Initsnake();Initfood();Score=0;Hscore=1;Snkspeed=10;num=2;Times=0;key=0;TureorFalse=1;TimerCounter=0;Time[0]='0';Time[1]='0';Time[2]=':';Time[3]='1';Time[4]='0';Time[5]='\0'; }else if(key==ESC) cleardevice();else goto loop;}void DrawMap(){line(10,10,470,10);line(470,10,470,470);line(470,470,10,470);line(10,470,10,10);line(480,20,620,20);line(620,20,620,460);line(620,460,480,460);line(480,460,480,20);}void Initsnake(){randomize();num=2;Snk[0].x=random(440);Snk[0].x=Snk[0].x-Snk[0].x%20+50;Snk[0].y=random(440);Snk[0].y=Snk[0].y-Snk[0].y%20+50;Snk[0].color=4;Snk[1].x=Snk[0].x;Snk[1].y=Snk[0].y+20;Snk[1].color=4;}void Initfood(){randomize();Fd.x=random(440);Fd.x=Fd.x-Fd.x%20+30;Fd.y=random(440);Fd.y=Fd.y-Fd.y%20+30;Fd.color=random(14)+1;}void Snake_Headmv(){if(bioskey(1)){key=bioskey(0);switch(key){case UP:Flag(1,0,0,0);break;case DOWN:Flag(0,1,0,0);break;case LEFT:Flag(0,0,1,0);break;case RIGHT:Flag(0,0,0,1);break;default:break;}}if(flag1){checkx=Snk[0].x;checky=Snk[0].y;Dsnkorfd(Snk[0].x,Snk[0].y,0);Snk[0].y-=20;Dsnkorfd(Snk[0].x,Snk[0].y,Snk[0].color); }if(flag2){checkx=Snk[0].x;checky=Snk[0].y;Dsnkorfd(Snk[0].x,Snk[0].y,0);Snk[0].y+=20;Dsnkorfd(Snk[0].x,Snk[0].y,Snk[0].color); }if(flag3){checkx=Snk[0].x;checky=Snk[0].y;Dsnkorfd(Snk[0].x,Snk[0].y,0);Snk[0].x-=20;Dsnkorfd(Snk[0].x,Snk[0].y,Snk[0].color);}if(flag4){checkx=Snk[0].x;checky=Snk[0].y;Dsnkorfd(Snk[0].x,Snk[0].y,0);Snk[0].x+=20;Dsnkorfd(Snk[0].x,Snk[0].y,Snk[0].color);}}void Flag(int a,int b,int c,int d){flag1=a;flag2=b;flag3=c;flag4=d;}void GameOver(){int i;if(Snk[0].x<20||Snk[0].x>460||Snk[0].y<20||Snk[0].y>460) {cleardevice();setcolor(11);settextstyle(0,0,4);outtextxy(160,220,"Game Over");loop1:key=bioskey(0);if(key==Enter){cleardevice();TheFirstBlock();}elseif(key==ESC)cleardevice();elsegoto loop1;}for(i=3;i<num;i++){if(Snk[0].x==Snk[i].x&&Snk[0].y==Snk[i].y) {cleardevice();setcolor(11);settextstyle(0,0,4);outtextxy(160,220,"Game Over");loop2:key=bioskey(0);if(key==Enter){cleardevice();TheFirstBlock();}elseif(key==ESC)cleardevice();else goto loop2;}}}void Snake_Bodymv(){int i,s,t;for(i=1;i<num;i++){Dsnkorfd(checkx,checky,Snk[i].color); Dsnkorfd(Snk[i].x,Snk[i].y,0);s=Snk[i].x;t=Snk[i].y;Snk[i].x=checkx;Snk[i].y=checky;checkx=s;checky=t;}}void Food(){if(flag5){randomize();Fd.x=random(440);Fd.x=Fd.x-Fd.x%20+30;Fd.y=random(440);Fd.y=Fd.y-Fd.y%20+30;Fd.color=random(14)+1;flag5=0;}Dsnkorfd(Fd.x,Fd.y,Fd.color);}void Snake_Bodyadd(){if(Snk[0].x==Fd.x&&Snk[0].y==Fd.y) {if(Snk[num-1].x>Snk[num-2].x){num++;Snk[num-1].x=Snk[num-2].x+20;Snk[num-1].y=Snk[num-2].y;Snk[num-1].color=Fd.color;}elseif(Snk[num-1].x<Snk[num-2].x){num++;Snk[num-1].x=Snk[num-2].x-20;Snk[num-1].y=Snk[num-2].y;Snk[num-1].color=Fd.color;}elseif(Snk[num-1].y>Snk[num-2].y) {num++;Snk[num-1].x=Snk[num-2].x; Snk[num-1].y=Snk[num-2].y+20; Snk[num-1].color=Fd.color;}elseif(Snk[num-1].y<Snk[num-2].y) {num++;Snk[num-1].x=Snk[num-2].x; Snk[num-1].y=Snk[num-2].y-20; Snk[num-1].color=Fd.color;}flag5=1;Score++;}}void PrntScore(){if(Hscore!=Score){setcolor(11);settextstyle(0,0,3); outtextxy(490,100,"SCORE"); setcolor(2);setfillstyle(1,0);rectangle(520,140,580,180); floodfill(530,145,2);Sco[0]=(char)(Score+48);Sco[1]='\0';Hscore=Score;setcolor(4);settextstyle(0,0,3); outtextxy(540,150,Sco);}}void Timer(){if(TimerCounter>18){Time[4]=(char)(Time[4]-1); if(Time[4]<'0'){Time[4]='9';Time[3]=(char)(Time[3]-1);}if(Time[3]<'0'){Time[3]='5';Time[1]=(char)(Time[1]-1);}if(TureorFalse){setcolor(11);settextstyle(0,0,3);outtextxy(490,240,"TIMER");setcolor(2);setfillstyle(1,0);rectangle(490,280,610,320);floodfill(530,300,2);setcolor(11);settextstyle(0,0,3);outtextxy(495,290,Time);TureorFalse=0;}if(Time[1]=='0'&&Time[3]=='0'&&Time[4]=='0') {setcolor(11);settextstyle(0,0,4);outtextxy(160,220,"Game Over");loop:key=bioskey(0);if(key==Enter){cleardevice();TheFirstBlock();}else if(key==ESC) cleardevice();else goto loop;}TimerCounter=0;TureorFalse=1;}}void Win(){if(Score==3)Times++;if(Times==2){cleardevice();setcolor(11);settextstyle(0,0,4);outtextxy(160,220,"You Win");loop:key=bioskey(0);if(key==Enter){cleardevice();TheFirstBlock();key=0;}else if(key==ESC) cleardevice();else goto loop;}}void TheSecondBlock(){if(Score==3){cleardevice();setcolor(11);settextstyle(0,0,4);outtextxy(100,220,"The Second Block"); loop:key=bioskey(0);if(key==Enter){cleardevice();Initsnake();Initfood();Score=0;Hscore=1;Snkspeed=8;num=2;key=0;}else if(key==ESC) cleardevice();else goto loop;}}void Dsnkorfd(int x,int y,int color) {setcolor(color);setfillstyle(1,color);circle(x,y,10);floodfill(x,y,color);}void Delay(int times){int i;for(i=1;i<=times;i++)delay(15000);}。

贪吃蛇游戏源代码

贪吃蛇游戏源代码
mainFrame.setVisible(true);
begin();
}
//----------------------------------------------------------------------
//keyPressed():按键检测
//----------------------------------------------------------------------
void begin()
{
if(snakeModel==null||!snakeModel.running)
{
snakeModel=new SnakeModel(this,canvasWidth/nodeWidth,
this.canvasHeight/nodeHeight);
(new Thread(snakeModel)).start();
//GreedSnake():初始化游戏界面
//----------------------------------------------------------------------
public GreedSnake()
{
//设置界面元素
mainFrame=new JFrame("GreedSnake");
*要点分析:
*1)数据结构:matrix[][]用来存储地图上面的信息,如果什么也没有设置为false,
* 如果有食物或蛇,设置为true;nodeArray,一个LinkedList,用来保存蛇的每
* 一节;food用来保存食物的位置;而Node类是保存每个位置的信息。

as3.0贪吃蛇源码与步骤

as3.0贪吃蛇源码与步骤
var snkHead:Sprite=new Sprite();;
var snkHeadx:int=0;
var snkHeady:int=0;
var stagew:uint=500;
var stageh:uint=300;
var sDir:String="left";
var num:int=0;
var food:Sprite;
package {
import flash.display.*;
import flash.events.*;
import flash.text.TextField;
import fl.motion.MotionEvent;
public class snake extends Sprite {
var snkBody:Array=[];
var label:TextField=new TextField();
label.text="重新开始";
label.textColor=0xffffff;
label.x=400;
label.y=250;
snkreStart.addChild(label);
addChild(snkreStart);
for(var i=0;i<count;i++)
{
snkBody.push(snkBodySec(0x000000));
snkBody[i].x=i*10+160;
snkBody[i].y=150;
addChild(snkBody[i]);
}
}
//创建键盘方向控制被触发事件
private function oneKey(e:KeyboardEvent):void

贪吃蛇源代码

贪吃蛇源代码

// proj_test.cpp : Defines the entry point for the console application./*设计思路:1、首先开辟单链表,内有3个节点表示蛇身2、蛇每移动一次,开辟新节点,加入链表头结点作为蛇头,释放尾部节点,形成移动效果3、随机产生食物,若在移动中吃到食物,则本次周期无需释放尾部节点,蛇身加长按键指示:上:W下:S左:A右:D加速: 1减速:2*///头文件定义#include "stdafx.h"#include<stdio.h>#include <graphics.h>#include <malloc.h>#include <conio.h>#include <stdlib.h>#include <time.h>#include <math.h>#include <windows.h>#define Hori_Len 30 //水平格数struct node *FindSecTailNode(struct node *Pnode); //函数功能:找到尾部前一节点,以便清除尾节点struct node *MoveNextStep(struct node *headnode,int direction); //函数功能:开辟新节点,清除尾节点,形成移动效果struct node *InitNode(); //函数功能:初始化蛇身,开辟单链表,内含3个节点;void DrawSnake(struct node *headnod); //函数功能:绘制蛇身int CheckSnake(struct node *p); //函数功能:错误检测,如果到达边界,返回错误标志void delay(); //函数功能:延时-决定蛇移动速度int keydown(int *z); //函数功能:获取键盘输入void drawDot(int x,int y); //函数功能:绘图--绘点void ReMoveDot(int x,int y); //函数功能:黑色填充目标点void mkfood(struct node *p); //函数功能:产生食物void SpeedCtrl(struct node *TempNode,struct node *HeadNode);//速度控制函数void RecordDisp(); //打印游戏纪录void InitFill() ;//初始化填充struct node{int x;int y;struct node *next;};int cnt_X=100;int food[2]={2,15};int check_result=1;int timelenX=5000;int Dire=2;int speed=450;int fen=0;//积分int jilu;//最高分记录char jiluzhe[20];char ch1[10];char ch2[10];char ch3[10];int main(){FILE *fp;//从文件载入最高记录if((fp=fopen("Record.txt","r"))==NULL)jilu=0;else {fgets(jiluzhe,20,fp);fscanf(fp,"%d",&jilu);}// fclose (fp);struct node *MoveNode;MoveNode=InitNode();initgraph(600, 600); // 初始化图形空间mkfood(MoveNode);//产生食物InitFill();//初始化填充RecordDisp();for(;;){//delay();Sleep(600-speed);int temp_dir=Dire;Dire=keydown(&Dire);if(Dire==5) //新增暂停功能{outtextxy(300,300,"暂停");getch();Dire=temp_dir;outtextxy(300,300," ");}if(MoveNode!=NULL){MoveNode=MoveNextStep(MoveNode,Dire);if(check_result==0){//closegraph();break;//return 0;}DrawSnake(MoveNode);}//Sleep(timelenX/55);}setfont(50,0,"宋体");setcolor(YELLOW);outtextxy(175,250,"GAMEOVER!"); /*setcolor(WHITE);Sleep(1000);jilu=0;if (fen>=jilu){strcpy(jiluzhe,"daqing");fp=fopen("Record.txt","w");fprintf(fp,"%s\n%d",jiluzhe,fen);fclose (fp);Sleep(1000);}*/if (fen>=jilu){strcpy(jiluzhe,"Daqing56");fp=fopen("Record.txt","w");fprintf(fp,"%s\n%d",jiluzhe,fen);fclose (fp);}Sleep(1000);closegraph();return 0;}void DrawSnake(struct node *headnod){struct node *TempNode=headnod;while(TempNode&&(TempNode->next!=NULL)){drawDot(TempNode->x,TempNode->y);TempNode=TempNode->next;}drawDot(TempNode->x,TempNode->y);}struct node *MoveNextStep(struct node *headnode,int direction){struct node *TempNode=(struct node *) malloc(sizeof(struct node));if(TempNode!=NULL)TempNode->next=headnode;switch(direction){case 1: //TempNode->x=headnode->x-1;TempNode->y=headnode->y;break;case 2:TempNode->x=headnode->x+1;TempNode->y=headnode->y;break;case 3:TempNode->x=headnode->x;TempNode->y=headnode->y-1;break;case 4:TempNode->x=headnode->x;TempNode->y=headnode->y+1;break;default:break;}check_result=CheckSnake(TempNode);if(check_result==0)//一旦游戏失败,函数返回{return TempNode;}if(!(TempNode->x==food[0]&&TempNode->y==food[1])) //检测没有吃掉食物,则去尾巴{struct node *tailnode, *Sectailnode=FindSecTailNode(TempNode);tailnode=Sectailnode->next;ReMoveDot(tailnode->x,tailnode->y);//填充黑色以便清除尾巴free(tailnode);Sectailnode->next=NULL;}else{fen++;mkfood(TempNode);}SpeedCtrl(TempNode,headnode);return TempNode;}void SpeedCtrl(struct node *TempNode,struct node *HeadNode){//添加自动调速代码int DistToFood_X=abs(TempNode->x-food[0]);int DistToFood_Y=abs(TempNode->y-food[1]);int DistToEdge_X=abs(TempNode->x-1)<abs(TempNode->x-(Hori_Len-1))?abs(TempNode->x-1):abs(TempNode->x-(Hori_Len-1));int DistToEdge_Y=abs(TempNode->y-3)<abs(TempNode->y-(Hori_Len-1))?abs(TempNode ->y-3):abs(TempNode->y-(Hori_Len-1));int HoriSign=(Dire==1)||(Dire==2);/*if((DistToFood_X<7&&DistToFood_Y==0) || (DistToFood_Y<7&&DistToFood_X==0)) //与目标点距离过小timelenX=5000+(7-DistToFood_X-DistToFood_Y)*1000;else// if((DistToEdge_X<7&&HoriSign==1)||(DistToEdge_Y<7&&HoriSign==0)) //与边缘距离过小if((Dire==1&&TempNode->x<6)||(Dire==2&&TempNode->x>23)||(Dire==3&&TempNode->y<8)| |(Dire==4&&TempNode->y>23)){if(Dire==1&&TempNode->x<6) //水平移动// timelenX=5000+(6-TempNode->x)*2000;speed=speed-(6-TempNode->x)*20;if(Dire==2&&TempNode->x>23) //水平移动// timelenX=5000+(TempNode->x+8-Hori_Len)*2000;speed=speed-(TempNode->x+7-Hori_Len)*20;if(Dire==3&&TempNode->y<8) //水平移动// timelenX=5000+(9-TempNode->y)*2000;speed=speed-(8-TempNode->y)*20;if(Dire==4&&TempNode->y>23) //水平移动// timelenX=5000+(TempNode->y+8-Hori_Len)*2000;speed=speed-(TempNode->y+7-Hori_Len)*20;}else{speed=speed<500?(speed=450+5*fen):500; //正常情况}if(speed>500) speed=500;*/speed=speed<500?(speed=450+5*fen):500; //正常情况if(speed>500) speed=500;sprintf(ch1, "%d ", fen);sprintf(ch2, "%d ", speed);settextcolor(WHITE);outtextxy(55,20,ch1);outtextxy(185,20,ch2);/*struct node *p=HeadNode;if(p!=NULL)do{int diffX=abs(TempNode->x-p->x);int diffY=abs(TempNode->y-p->y);if(Dire==1&&TempNode->x>p->x&&diffX<4)timelenX=5000+(4-diffX)*2000;if(Dire==2&&TempNode->x<p->x&&diffX<4)timelenX=5000+(4-diffX)*2000;if(Dire==3&&TempNode->y>p->y&&diffY<4)timelenX=5000+(4-diffY)*2000;if(Dire==4&&TempNode->y<p->y&&diffY<4)timelenX=5000+(4-diffY)*1500;p=p->next;} while(p!=NULL);*/}struct node *FindSecTailNode(struct node *Pnode){struct node * TempNode=Pnode;while(TempNode&&(TempNode->next!=NULL)&&(TempNode->next->next!=NULL)) {TempNode=TempNode->next;}return TempNode;}struct node *InitNode(){struct node *head=(struct node *) malloc(sizeof(struct node));struct node *head_1=(struct node *) malloc(sizeof(struct node));struct node *head_2=(struct node *) malloc(sizeof(struct node));head->x=3;head->y=5;head_1->x=2;head_1->y=5;head_2->x=1;head_2->y=5;if(head!=NULL)head->next=head_1;if(head_1!=NULL)head_1->next=head_2;if(head_2!=NULL)head_2->next=NULL;return head;}int keydown(int *z)//获取输入{char ch;if(kbhit()){ch=getch();switch(ch){case 'A':case 'a':if((*z)!=2) *z=1;break; case 'D':case 'd':if((*z)!=1)*z=2;break; case 'W':case 'w':if((*z)!=4)*z=3;break; case 'S':case 's':if((*z)!=3)*z=4;break; case 'E':case 'e':(*z)=5;break; //暂停default :break;}if(ch==27) *z=27;}return *z;}void delay(){for(int i=0;i<timelenX;i++)for(int j=0;j<timelenX;j++){}}void drawDot(int x,int y){x=x*20;y=y*20;setfillcolor(GREEN);bar(x+1,y+1,x+19,y+19);}void ReMoveDot(int x,int y){x=x*20;y=y*20;setfillcolor(BLACK);bar(x+1,y+1,x+19,y+19);}void mkfood(struct node *p2){//MoveTo(20,20);// gotoxy(20,20);////goto_pos(20,20);// cleardevice();struct node *p1;struct node *p;p=p1=p2;srand((unsigned)clock());//设定随机数种子food[1]=rand()%26+3;//随机产生食物坐标food[0]=rand()%28+1;//检测食物的坐标是否与蛇身体重复,如果是,则重新生成食物if(p!=NULL){do{if (food[0]==p->x&&food[1]==p->y){mkfood(p1);}p=p->next;}while(p!=NULL);}drawDot(food[0],food[1]);}void InitFill() //初始化填充{int x=0,y=0;for(int i=0;i<30;i++){setfillcolor(GREEN);x=i*20;y=0;bar(x+1,y+1,x+19,y+19);y=40;bar(x+1,y+1,x+19,y+19);y=580;bar(x+1,y+1,x+19,y+19);}for(int j=0;j<30;j++){setfillcolor(GREEN);y=j*20;x=0;bar(x+1,y+1,x+19,y+19);x=580;bar(x+1,y+1,x+19,y+19);}}void RecordDisp(){ch1[10];ch2[10];ch3[10];sprintf(ch1, "%d ", fen);sprintf(ch2, "%d ", speed);sprintf(ch3, "%d ", jilu);settextcolor(YELLOW);outtextxy(20,20,"分数:");outtextxy(150,20,"速度:");outtextxy(280,20,"最高纪录:");outtextxy(410,20,"保持者:");settextcolor(WHITE);outtextxy(55,20,ch1);outtextxy(185,20,ch2);outtextxy(350,20,ch3);outtextxy(465,20,jiluzhe);}int CheckSnake(struct node *p){struct node *p2;p2=p;int pointX=p2->x;int pointY=p2->y;if(pointX==29||pointY==29||pointX==0||pointY==2) return 0;while(p2!=NULL){p2=p2->next;if(p2!=NULL){if(pointX==p2->x&&pointY==p2->y)return 0;}}return 1;}。

贪吃蛇游戏C语言源代码学习

贪吃蛇游戏C语言源代码学习

贪吃蛇游戏C语言源代码学习阅读学习了源代码,并做了简单的注释和修改,里面只用了链表数据结构,非常适合C语言入门者学习阅读。

程序可在VS2013下编译运行。

1 #include<stdio.h>2 #include<time.h>3 #include<windows.h>4 #include<stdlib.h>56#define U 17#define D 28#define L 39#define R 4 //蛇的状态,U:上;D:下;L:左 R:右1011 typedef struct SNAKE //蛇身的一个节点12 {13int x;14int y;15struct SNAKE *next;16 }snake;1718//全局变量//19int score = 0, add = 10;//总得分与每次吃食物得分。

20int status, sleeptime = 200;//每次运行的时间间隔21 snake *head, *food;//蛇头指针,食物指针22 snake *q;//遍历蛇的时候用到的指针23int endGamestatus = 0; //游戏结束的情况,1:撞到墙;2:咬到自己;3:主动退出游戏。

2425//声明全部函数//26void Pos();27void creatMap();28void initSnake();29int biteSelf();30void createFood();31void cantCrossWall();32void snakeMove();33void pause();34void runGame();35void initGame();36void endGame();37void gameStart();3839void Pos(int x, int y)//设置光标位置40 {41 COORD pos;42 HANDLE hOutput;43 pos.X = x;44 pos.Y = y;45 hOutput = GetStdHandle(STD_OUTPUT_HANDLE);//返回标准的输入、输出或错误的设备的句柄,也就是获得输入、输出/错误的屏幕缓冲区的句柄46 SetConsoleCursorPosition(hOutput, pos);47 }4849void creatMap()//创建地图50 {51int i;52for (i = 0; i<58; i += 2)//打印上下边框53 {54 Pos(i, 0);55 printf("■");//一个方块占两个位置56 Pos(i, 26);57 printf("■");58 }59for (i = 1; i<26; i++)//打印左右边框60 {61 Pos(0, i);62 printf("■");63 Pos(56, i);64 printf("■");65 }66 }6768void initSnake()//初始化蛇身69 {70 snake *tail;71int i;72 tail = (snake*)malloc(sizeof(snake));//从蛇尾开始,头插法,以x,y设定开始的位置//73 tail->x = 24;74 tail->y = 5;75 tail->next = NULL;76for (i = 1; i <= 4; i++)//初始长度为477 {78 head = (snake*)malloc(sizeof(snake));79 head->next = tail;80 head->x = 24 + 2 * i;81 head->y = 5;82 tail = head;83 }84while (tail != NULL)//从头到为,输出蛇身85 {86 Pos(tail->x, tail->y);87 printf("■");88 tail = tail->next;89 }90 }91//??92int biteSelf()//判断是否咬到了自己93 {94 snake *self;95 self = head->next;96while (self != NULL)97 {98if (self->x == head->x && self->y == head->y)99 {100return1;101 }102 self = self->next;103 }104return0;105 }106107void createFood()//随机出现食物108 {109 snake *food_1;110 srand((unsigned)time(NULL));//为了防止每次产生的随机数相同,种子设置为time111 food_1 = (snake*)malloc(sizeof(snake));112while ((food_1->x % 2) != 0) //保证其为偶数,使得食物能与蛇头对其113 {114 food_1->x = rand() % 52 + 2;115 }116 food_1->y = rand() % 24 + 1;117 q = head;118while (q->next == NULL)119 {120if (q->x == food_1->x && q->y == food_1->y) //判断蛇身是否与食物重合121 {122free(food_1);123 createFood();124 }125 q = q->next;126 }127 Pos(food_1->x, food_1->y);128 food = food_1;129 printf("■");130 }131132void cantCrossWall()//不能穿墙133 {134if (head->x == 0 || head->x == 56 || head->y == 0 || head->y == 26)135 {136 endGamestatus = 1;137 endGame();138 }139 }140141void snakeMove()//蛇前进,上U,下D,左L,右R142 {143 snake * nexthead;144 cantCrossWall();145146 nexthead = (snake*)malloc(sizeof(snake));147if (status == U)148 {149 nexthead->x = head->x;150 nexthead->y = head->y - 1;151if (nexthead->x == food->x && nexthead->y == food->y)//如果下一个有食物//152 {153 nexthead->next = head;154 head = nexthead;155 q = head;156while (q != NULL)157 {158 Pos(q->x, q->y);159 printf("■");160 q = q->next;161 }162 score = score + add;163 createFood();164 }165else//如果没有食物//166 {167 nexthead->next = head;168 head = nexthead;169 q = head;170while (q->next->next != NULL)171 {172 Pos(q->x, q->y);173 printf("■");174 q = q->next;175 }176 Pos(q->next->x, q->next->y);177 printf("");178free(q->next);179 q->next = NULL;180 }181 }182if (status == D)183 {184 nexthead->x = head->x;185 nexthead->y = head->y + 1;186if (nexthead->x == food->x && nexthead->y == food->y) //有食物187 {188 nexthead->next = head;189 head = nexthead;190 q = head;191while (q != NULL)192 {193 Pos(q->x, q->y);194 printf("■");195 q = q->next;196 }197 score = score + add;198 createFood();199 }200else//没有食物201 {202 nexthead->next = head;203 head = nexthead;204 q = head;205while (q->next->next != NULL)206 {207 Pos(q->x, q->y);208 printf("■");209 q = q->next;210 }211 Pos(q->next->x, q->next->y);212 printf("");213free(q->next);214 q->next = NULL;215 }216 }217if (status == L)218 {219 nexthead->x = head->x - 2;220 nexthead->y = head->y;221if (nexthead->x == food->x && nexthead->y == food->y)//有食物222 {223 nexthead->next = head;224 head = nexthead;225 q = head;226while (q != NULL)227 {228 Pos(q->x, q->y);229 printf("■");230 q = q->next;231 }232 score = score + add;233 createFood();234 }235else//没有食物236 {237 nexthead->next = head;238 head = nexthead;239 q = head;240while (q->next->next != NULL)241 {242 Pos(q->x, q->y);243 printf("■");244 q = q->next;245 }246 Pos(q->next->x, q->next->y);247 printf("");248free(q->next);249 q->next = NULL;250 }251 }252if (status == R)253 {254 nexthead->x = head->x + 2;255 nexthead->y = head->y;256if (nexthead->x == food->x && nexthead->y == food->y)//有食物257 {258 nexthead->next = head;259 head = nexthead;260 q = head;261while (q != NULL)262 {263 Pos(q->x, q->y);264 printf("■");265 q = q->next;266 }267 score = score + add;268 createFood();269 }270else//没有食物271 {272 nexthead->next = head;273 head = nexthead;274 q = head;275while (q->next->next != NULL)276 {277 Pos(q->x, q->y);278 printf("■");279 q = q->next;280 }281 Pos(q->next->x, q->next->y);282 printf("");283free(q->next);284 q->next = NULL;285 }286 }287if (biteSelf() == 1) //判断是否会咬到自己288 {289 endGamestatus = 2;290 endGame();291 }292 }293294void pause()//暂停295 {296while (1)297 {298 Sleep(300);299if (GetAsyncKeyState(VK_SPACE))300 {301break;302 }303304 }305 }306307void runGame()//控制游戏308 {309310 Pos(64, 15);311 printf("不能穿墙,不能咬到自己\n");312 Pos(64, 16);313 printf("用↑.↓.←.→分别控制蛇的移动.");314 Pos(64, 17);315 printf("F1 为加速,F2 为减速\n");316 Pos(64, 18);317 printf("ESC :退出游戏.space:暂停游戏.");318 Pos(64, 20);319 printf("C语言研究中心 ");320 status = R;321while (1)322 {323 Pos(64, 10);324 printf("得分:%d ", score);325 Pos(64, 11);326 printf("每个食物得分:%d分", add);327if (GetAsyncKeyState(VK_UP) && status != D)328 {329 status = U;330 }331else if (GetAsyncKeyState(VK_DOWN) && status != U) 332 {333 status = D;334 }335else if (GetAsyncKeyState(VK_LEFT) && status != R) 336 {337 status = L;338 }339else if (GetAsyncKeyState(VK_RIGHT) && status != L) 340 {341 status = R;342 }343else if (GetAsyncKeyState(VK_SPACE))344 {345 pause();346 }347else if (GetAsyncKeyState(VK_ESCAPE))348 {349 endGamestatus = 3;350break;351 }352else if (GetAsyncKeyState(VK_F1))353 {354if (sleeptime >= 50)355 {356 sleeptime = sleeptime - 30;357 add = add + 2;358if (sleeptime == 320)359 {360 add = 2;//防止减到1之后再加回来有错361 }362 }363 }364else if (GetAsyncKeyState(VK_F2))365 {366if (sleeptime<350)367 {368 sleeptime = sleeptime + 30;369 add = add - 2;370if (sleeptime == 350)371 {372 add = 1; //保证最低分为1373 }374 }375 }376 Sleep(sleeptime);377 snakeMove();378 }379 }380381void initGame()//开始界面382 {383 Pos(40, 12);384385 system("title C语言研究中心 ");386 printf("欢迎来到贪食蛇游戏!");387 Pos(40, 25);388 printf(" C语言研究中心 .\n"); 389 system("pause");390 system("cls");391 Pos(25, 12);392 printf("用↑.↓.←.→分别控制蛇的移动, F1 为加速,2 为减速\n");393 Pos(25, 13);394 printf("加速将能得到更高的分数。

贪吃蛇游戏源代码

贪吃蛇游戏源代码

//主函数# include <windows.h># include <time.h># include "resource.h"#include "snake.h"#include "table.h"#define GAME_STATE_W AIT 0//游戏等待状态#define GAME_STATE_RUN 1//游戏运行状态#define GAME_STATE_END 2//游戏结束状态//界面相关物件尺寸的定义#define WALL_WIDTH 80//外墙左部到游戏区的宽度#define WALL_HEIGHT 80//外墙顶部到游戏区的高度#define BMP_W ALL_WIDTH 16//墙位图的宽度#define BMP_W ALL_HEIGHT 16//墙位图的高度LRESULT CALLBACK WndProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam);void DrawGame(void);void ShellDraw( HDC hdc );void GameAreaDraw(HDC hdc);void OnTimer(UINT uTIMER_ID);void StartGame( void );void EndGame( void );//创建一个桌子CTable table;int tableBlockWidth = 0; //桌子的格子的宽度int tableBlockHeight = 0; //桌子的格子的高度int iScores = 0; //游戏的得分UINT uGameState = GAME_STATE_W AIT; //当前游戏状态HDC windowDC = NULL; //windows屏幕设备HDC bufferDC = NULL; //缓冲设备环境HDC picDC = NULL; //snake图像内存设备HDC endDC = NULL; //游戏终结图像内存设备HDC scoreDC = NULL; //分数板内存设备HWND hAppWnd = NULL; //本application窗口句柄HBITMAP picBMP = NULL; //snake图像位图句柄HBITMAP bufferBMP = NULL; //缓冲位图句柄HBITMAP endBMP = NULL; //游戏终结hAppWnd图像内存句柄HBITMAP hbmpWall = NULL; //墙位图句柄HBITMAP hbmpScore = NULL; //分数板位图句柄HBRUSH hbrushWall = NULL; //墙画刷//定时器标识UINT uSnakeMoveTimer; //蛇的移动UINT uFoodAddTimer; //水果的产生//框架的位置数据定义//GDI RECT 而不是MFC CRectRECT g_ClientRect;int g_iClientWidth;int g_iClientHeight;int WINAPI WinMain(HINSTANCE hInstance, // handle to current instanceHINSTANCE hPrevInstance, // handle to previous instanceLPSTR lpCmdLine, // command lineint nCmdShow // show state){WNDCLASS wndClass;UINT width,height;//定义窗口wndClass.cbClsExtra = 0;wndClass.cbWndExtra = 0;wndClass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);wndClass.hIcon = LoadIcon(NULL,MAKEINTRESOURCE(IDI_MAIN));wndClass.hCursor = LoadCursor(NULL,IDC_ARROW);wndClass.hInstance = hInstance;wndClass.lpfnWndProc = WndProc;wndClass.lpszClassName = "Snake";wndClass.lpszMenuName = NULL;wndClass.style = CS_HREDRAW | CS_VREDRAW;//注册窗口RegisterClass(&wndClass);width = GetSystemMetrics(SM_CXSCREEN);height = GetSystemMetrics(SM_CYSCREEN);HWND hWnd;hWnd = CreateWindow("Snake","贪吃蛇游戏",WS_POPUP,0,0,width,height,NULL,NULL,hInstance,NULL);hAppWnd = hWnd;//显示窗口ShowWindow(hWnd,SW_SHOWNORMAL);UpdateWindow(hWnd);GetClientRect(hWnd,&g_ClientRect);g_iClientWidth = g_ClientRect.right - g_ClientRect.left;g_iClientHeight = g_ClientRect.bottom - g_ClientRect.top;//将游戏区域分成横纵均匀的20小块tableBlockWidth = (g_ClientRect.right - 2 * WALL_WIDTH) / 20;tableBlockHeight = (g_ClientRect.bottom - 2 * WALL_HEIGHT) / 20;//获取当前主设备与windowDC相连windowDC = GetDC(NULL);//创建与windowDC兼容的内存设备环境bufferDC = CreateCompatibleDC(windowDC);picDC = CreateCompatibleDC(windowDC);endDC = CreateCompatibleDC(windowDC);scoreDC =CreateCompatibleDC(windowDC);//位图的初始化与载入位图bufferBMP = CreateCompatibleBitmap(windowDC,g_iClientWidth,g_iClientHeight);picBMP = (HBITMAP)LoadImage(NULL,"snake.bmp",IMAGE_BITMAP,160,80,LR_LOADFROMFILE);hbmpWall = (HBITMAP)LoadImage(NULL,"brick.bmp",IMAGE_BITMAP,16,16,LR_LOADFROMFILE);endBMP = (HBITMAP)LoadImage(NULL,"end.bmp",IMAGE_BITMAP,369,300,LR_LOADFROMFILE);hbmpScore = (HBITMAP)LoadImage(NULL,"scoreboard.bmp",IMAGE_BITMAP,265,55,LR_LOADFROMFILE);//生声明位图与设备环境的关联SelectObject(bufferDC,bufferBMP);SelectObject(picDC,picBMP);SelectObject(endDC,endBMP);SelectObject(scoreDC,hbmpScore);hbrushWall = CreatePatternBrush(hbmpWall);StartGame();MSG Msg;while (GetMessage(&Msg,NULL,0,0)){TranslateMessage(&Msg);DispatchMessage(&Msg);}return Msg.wParam;}LRESULT CALLBACK WndProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam){switch (message){case WM_TIMER:OnTimer((UINT)wParam);break;case WM_KEYDOWN:switch (wParam){case VK_ESCAPE:KillTimer(hAppWnd,uSnakeMoveTimer);KillTimer(hAppWnd,uFoodAddTimer);uGameState = GAME_STATE_W AIT;if (IDYES == MessageBox(hWnd,"真的要退出吗?","贪吃蛇",MB_YESNO | MB_ICONQUESTION)){exit(0);}uSnakeMoveTimer = SetTimer(hAppWnd,500,100,NULL);uFoodAddTimer = SetTimer(hAppWnd,600,7000,NULL);uGameState = GAME_STATE_RUN;break;case VK_UP:table.ChangeSnakeDirect(S_UP);break;case VK_DOWN:table.ChangeSnakeDirect(S_DOWN);break;case VK_LEFT:table.ChangeSnakeDirect(S_LEFT);break;case VK_RIGHT:table.ChangeSnakeDirect(S_RIGHT);break;case VK_SPACE:if (GAME_STATE_END == uGameState){StartGame();}else if (GAME_STATE_RUN == uGameState){KillTimer(hAppWnd,uSnakeMoveTimer);KillTimer(hAppWnd,uFoodAddTimer);uGameState = GAME_STATE_W AIT;}else{uSnakeMoveTimer = SetTimer(hAppWnd,500,100,NULL);uFoodAddTimer = SetTimer(hAppWnd,600,7000,NULL);uGameState = GAME_STATE_RUN;}break;}break;case WM_SETCURSOR:SetCursor(NULL);break;case WM_DESTROY:ReleaseDC(hWnd,picDC);ReleaseDC(hWnd,bufferDC);ReleaseDC(hWnd,windowDC);PostQuitMessage(0);break;}return DefWindowProc(hWnd,message,wParam,lParam);}void DrawGame(){ShellDraw(bufferDC);GameAreaDraw(bufferDC);BitBlt(windowDC,0,0,g_iClientWidth,g_iClientHeight,bufferDC,0,0,SRCCOPY);}void OnTimer(UINT uTIMER_ID){if (uTIMER_ID == uSnakeMoveTimer){//移动蛇table.SnakeMove();//检测蛇是否碰到自己的身体if (table.GetSnake() ->IsHeadTouchBody(table.GetSnake() ->GetPos()[0].x,table.GetSnake() ->GetPos()[0].y)){EndGame();}//根据蛇头所在区域做相应的处理switch (table.GetData(table.GetSnake() ->GetPos()[0].x,table.GetSnake() ->GetPos()[0].y)){case TB_STATE_FOOD:table.ClearFood(table.GetSnake() ->GetPos()[0].x,table.GetSnake() ->GetPos()[0].y);table.AddBlock((rand())%tableBlockWidth,rand()%tableBlockHeight);table.GetSnake() ->AddBody();iScores++;break;case TB_STATE_BLOCK:case TB_STATE_SBLOCK:EndGame();break;}//xianshiDrawGame();}else if (uTIMER_ID == uFoodAddTimer){//定时加食物table.AddFood((rand())%tableBlockWidth,rand()%tableBlockHeight);}}//开始游戏void StartGame(){iScores = 0;int iFoodNumber;//桌面初始化table.InitialTable(tableBlockWidth,tableBlockHeight);table.GetSnake() ->ChangeDirect(S_RIGHT);table.GetSnake() ->SetHeadPos(tableBlockWidth / 2,tableBlockHeight / 2);//预先随机产生一些食物srand( (unsigned)time(NULL));for (iFoodNumber = 0; iFoodNumber < 400; iFoodNumber++){table.AddFood((rand())%tableBlockWidth,(rand())%tableBlockHeight);}//打开定时器DrawGame();uSnakeMoveTimer = SetTimer(hAppWnd,500,100,NULL);uFoodAddTimer = SetTimer(hAppWnd,600,7000,NULL);uGameState = GAME_STATE_RUN;}void EndGame(){//关计时器KillTimer(hAppWnd,uSnakeMoveTimer);KillTimer(hAppWnd,uFoodAddTimer);uGameState = GAME_STATE_END;}void ShellDraw(HDC hdc){char szText[30] = "Score: ";char szNum[20];int iNowScores = iScores * 100;itoa(iNowScores,szNum,10);strcat(szText,szNum);RECT rt,rect;GetClientRect(hAppWnd,&rt);//墙的绘制SelectObject(hdc,hbrushWall);PatBlt(hdc,rt.left,rt.top,rt.right,rt.bottom,PATCOPY);//内部游戏区为白色底平面rect.left = rt.left + WALL_WIDTH;rect.top = rt.top + WALL_HEIGHT;rect.right = rt.right - WALL_WIDTH;rect.bottom = rt.bottom - WALL_HEIGHT;FillRect(hdc,&rect,(HBRUSH)(COLOR_WINDOW + 1));BitBlt(hdc,GetSystemMetrics(SM_CXSCREEN) / 3 ,10,256,55,scoreDC,0,0,SRCCOPY);SetBkMode(hdc,TRANSPARENT);TextOut(hdc,GetSystemMetrics(SM_CXSCREEN) / 3 + 50,30,szText,strlen(szText));}void GameAreaDraw(HDC hdc){int i,j;int x, y, x_pos, y_pos;BitmapState state;//绘制水果与毒果for (i = 0; i < tableBlockHeight; i++){for (j = 0; j < tableBlockWidth; j++){x_pos = j * 20 + WALL_WIDTH;y_pos = i * 20 + WALL_HEIGHT;switch (table.GetData(j,i)){case TB_STATE_FOOD:BitBlt(hdc,x_pos,y_pos,20,20,picDC,100,0,SRCPAINT);BitBlt(hdc,x_pos,y_pos,20,20,picDC,20,0,SRCAND);break;case TB_STATE_BLOCK:BitBlt(hdc,x_pos,y_pos,20,20,picDC,80,0,SRCPAINT);BitBlt(hdc,x_pos,y_pos,20,20,picDC,0,0,SRCAND);break;}}}//根据当前的形状绘制蛇头x = table.GetSnake()->GetPos()[0].x;y = table.GetSnake()->GetPos()[0].y;x_pos = x * 20 + WALL_WIDTH;y_pos = y * 20 + WALL_HEIGHT;state = table.GetSnake()->GetStateArray()[0];switch (state){case M_UP_UP:BitBlt(hdc,x_pos,y_pos,20,20,picDC,80,20,SRCPAINT);BitBlt(hdc,x_pos,y_pos,20,20,picDC,0,20,SRCAND);break;case M_DOWN_DOWN:BitBlt(hdc,x_pos,y_pos,20,20,picDC,140,20,SRCPAINT);BitBlt(hdc,x_pos,y_pos,20,20,picDC,60,20,SRCAND);break;case M_LEFT_LEFT:BitBlt(hdc,x_pos,y_pos,20,20,picDC,100,20,SRCPAINT);BitBlt(hdc,x_pos,y_pos,20,20,picDC,20,20,SRCAND);break;case M_RIGHT_RIGHT:BitBlt(hdc,x_pos,y_pos,20,20,picDC,120,20,SRCPAINT);BitBlt(hdc,x_pos,y_pos,20,20,picDC,40,20,SRCAND);break;}//根据蛇身各节点的状态绘制蛇身for (i = 1; i < table.GetSnake()->GetLength() - 1; i++){x = table.GetSnake()->GetPos()[i].x;y = table.GetSnake()->GetPos()[i].y;x_pos = x * 20 + WALL_WIDTH;y_pos = y * 20 + WALL_HEIGHT;state = table.GetSnake()->GetStateArray()[i];switch (state){case M_UP_UP:case M_DOWN_DOWN:BitBlt(hdc,x_pos,y_pos,20,20,picDC,80,40,SRCPAINT);BitBlt(hdc,x_pos,y_pos,20,20,picDC,0,40,SRCAND);break;case M_LEFT_LEFT:case M_RIGHT_RIGHT:BitBlt(hdc,x_pos,y_pos,20,20,picDC,100,40,SRCPAINT);BitBlt(hdc,x_pos,y_pos,20,20,picDC,20,40,SRCAND);break;case M_RIGHT_DOWN:case M_UP_LEFT:BitBlt(hdc,x_pos,y_pos,20,20,picDC,100,60,SRCPAINT);BitBlt(hdc,x_pos,y_pos,20,20,picDC,20,60,SRCAND);break;case M_RIGHT_UP:case M_DOWN_LEFT:BitBlt(hdc,x_pos,y_pos,20,20,picDC,140,40,SRCPAINT);BitBlt(hdc,x_pos,y_pos,20,20,picDC,60,40,SRCAND);break;case M_LEFT_DOWN:case M_UP_RIGHT:BitBlt(hdc,x_pos,y_pos,20,20,picDC,80,60,SRCPAINT);BitBlt(hdc,x_pos,y_pos,20,20,picDC,0,60,SRCAND);break;case M_LEFT_UP:case M_DOWN_RIGHT:BitBlt(hdc,x_pos,y_pos,20,20,picDC,120,40,SRCPAINT);BitBlt(hdc,x_pos,y_pos,20,20,picDC,40,40,SRCAND);break;}}//绘制蛇尾巴x = table.GetSnake()->GetPos()[table.GetSnake()->GetLength()-1].x;y = table.GetSnake()->GetPos()[table.GetSnake()->GetLength()-1].y;x_pos = x * 20 + WALL_WIDTH;y_pos = y * 20 + WALL_HEIGHT;state = table.GetSnake()->GetStateArray()[table.GetSnake()->GetLength()-1];switch (state){case M_UP_UP:BitBlt(hdc,x_pos,y_pos,20,20,picDC,120,60,SRCPAINT);BitBlt(hdc,x_pos,y_pos,20,20,picDC,40,60,SRCAND);break;case M_DOWN_DOWN:BitBlt(hdc,x_pos,y_pos,20,20,picDC,120,0,SRCPAINT);BitBlt(hdc,x_pos,y_pos,20,20,picDC,40,0,SRCAND);break;case M_LEFT_LEFT:BitBlt(hdc,x_pos,y_pos,20,20,picDC,140,60,SRCPAINT);BitBlt(hdc,x_pos,y_pos,20,20,picDC,60,60,SRCAND);break;case M_RIGHT_RIGHT:BitBlt(hdc,x_pos,y_pos,20,20,picDC,140,0,SRCPAINT);BitBlt(hdc,x_pos,y_pos,20,20,picDC,60,0,SRCAND);break;}//绘制游戏结束图案if (uGameState == GAME_STA TE_END){x_pos = g_iClientWidth / 3;y_pos = g_iClientHeight / 4;BitBlt(hdc,x_pos,y_pos,369,300,endDC,0,0,SRCCOPY);}}# include "snake.h"CSnake::CSnake(int x_pos,int y_pos,int len){if (len < 1){len = 1;}int i;m_length = len;//蛇的身体体长//初始化蛇的坐标位置m_pPos = new SPoint[m_length+2];m_pPos[0].x = x_pos;m_pPos[0].y = y_pos;for (i = 1; i < m_length +2; i++){m_pPos[i].x = 0;m_pPos[i].y = 0;}//初始化蛇的运动状态m_newSnake.head = S_NONE;m_oldSnake.head = S_NONE;m_newSnake.body = new MoveState[m_length];m_oldSnake.body = new MoveState[m_length];for(i = 0; i < m_length; i++){m_oldSnake.body[i] = S_NONE;m_newSnake.body[i] = S_NONE;}m_newSnake.tail = S_NONE;m_oldSnake.tail = S_NONE;//初始化蛇的位图显示状态;m_pStateArray = new BitmapState[m_length+2];for (i = 0; i < m_length + 2; i++){m_pStateArray[i] = M_NONE;}}CSnake::~CSnake(){SAFE_DELETE_ARRAY(m_pPos);SAFE_DELETE_ARRAY(m_pStateArray);}//根据新旧两蛇的运动状态,确定当前显示的运动状态BitmapState CSnake::GetRightState(MoveState oldDirect,MoveState newDirect) {BitmapState re;switch(oldDirect){case S_NONE:switch(newDirect){case S_NONE:re = M_NONE;break;case S_UP:re = M_UP_UP;break;case S_DOWN:re = M_DOWN_DOWN;break;case S_LEFT:re = M_LEFT_LEFT;break;case S_RIGHT:re = M_RIGHT_RIGHT;break;}break;case S_UP:switch(newDirect){case S_UP:re = M_UP_UP;break;case S_LEFT:re = M_UP_LEFT;break;case S_RIGHT:re = M_UP_RIGHT;break;}break;case S_DOWN:switch(newDirect){case S_DOWN:re = M_DOWN_DOWN;break;case S_LEFT:re = M_DOWN_LEFT;break;case S_RIGHT:re = M_DOWN_RIGHT;break;}break;case S_LEFT:switch(newDirect){case S_UP:re = M_LEFT_UP;break;case S_LEFT:re = M_LEFT_LEFT;break;case S_DOWN:re = M_LEFT_DOWN;break;}break;case S_RIGHT:switch(newDirect){case S_UP:re = M_RIGHT_UP;break;case S_DOWN:re = M_RIGHT_DOWN;break;case S_RIGHT:re = M_RIGHT_RIGHT;break;}break;}return re;}//改变方向void CSnake::ChangeDirect(MoveState d) {//方向不能为其对立方switch(d){case S_NONE:m_newSnake.head = S_NONE;break;case S_UP:if(m_newSnake.head != S_DOWN)m_newSnake.head = S_UP;break;case S_DOWN:if(m_newSnake.head != S_UP)m_newSnake.head = S_DOWN;break;case S_LEFT:if(m_newSnake.head != S_RIGHT)m_newSnake.head = S_LEFT;break;case S_RIGHT:if(m_newSnake.head != S_LEFT)m_newSnake.head = S_RIGHT;break;}}//蛇移动void CSnake::Move(){int i;//1.计算各节点的新状态//保存蛇身体各部位的形状for (i = 0; i < m_length; i++){m_oldSnake.body[i] = m_newSnake.body[i];}m_newSnake.tail = m_newSnake.body[m_length-1];for(i = m_length - 1; i > 0; i--){m_newSnake.body[i] = m_newSnake.body[i-1];}m_newSnake.body[0] = m_newSnake.head;//根据新旧状态获取新的状态m_pStateArray[0] = GetRightState(m_oldSnake.head,m_newSnake.head);for(i = 0; i < m_length; i++){m_pStateArray[i+1] = GetRightState(m_oldSnake.body[i],m_newSnake.body[i]);}m_pStateArray[m_length+1] = GetRightState(m_oldSnake.tail,m_newSnake.tail);//2、整个蛇坐标移动,除蛇头外其他为原状态的前一位置for(i = m_length + 1; i > 0; i--){m_pPos[i] = m_pPos[i-1];}//蛇头根据新位置进行偏移switch(m_newSnake.head){case S_UP:m_pPos[0].y -= SNAKE_MOVE;break;case S_DOWN:m_pPos[0].y += SNAKE_MOVE;break;case S_LEFT:m_pPos[0].x -= SNAKE_MOVE;break;case S_RIGHT:m_pPos[0].x += SNAKE_MOVE;break;}}//蛇身体的增长void CSnake::AddBody(int n){//分配变量作为保存各种数据状态int i;Snake_Struct saveOldSnake,saveNewSnake;BitmapState *saveStateArray;SPoint *savePos;//保存蛇的位置信息savePos = new SPoint[m_length+2];for(i = 0; i < m_length + 2; i++){savePos[i] = m_pPos[i];}//保存蛇的状态信息saveOldSnake.head = m_oldSnake.head;saveOldSnake.body = new MoveState[m_length];for(i = 0; i < m_length; i++){saveOldSnake.body[i] = m_oldSnake.body[i];}saveOldSnake.tail = m_oldSnake.tail;saveNewSnake.head = m_newSnake.head;saveNewSnake.body = new MoveState[m_length];for(i = 0; i < m_length; i++){saveNewSnake.body[i] = m_newSnake.body[i];}saveNewSnake.tail = m_newSnake.tail;saveStateArray = new BitmapState[m_length+2];for (i = 0; i < m_length + 2; i++){saveStateArray[i] = m_pStateArray[i];}//将长度增长m_length += n;//释放所有存储蛇状态数据的存储空间SAFE_DELETE_ARRAY(m_newSnake.body); SAFE_DELETE_ARRAY(m_oldSnake.body); SAFE_DELETE_ARRAY(m_pPos);SAFE_DELETE_ARRAY(m_pStateArray);//创建并初始化蛇增长后的存储空间m_pPos = new SPoint[m_length+2];for (i = 0; i < m_length +2; i++){m_pPos[i].x = 0;m_pPos[i].y = 0;}//初始化蛇的运动状态m_newSnake.head = S_NONE;m_oldSnake.head = S_NONE;m_newSnake.body = new MoveState[m_length]; m_oldSnake.body = new MoveState[m_length];for(i = 0; i < m_length; i++){m_oldSnake.body[i] = S_NONE;m_newSnake.body[i] = S_NONE;}m_newSnake.tail = S_NONE;m_oldSnake.tail = S_NONE;//初始化蛇的位图显示状态;m_pStateArray = new BitmapState[m_length+2]; for (i = 0; i < m_length + 2; i++){m_pStateArray[i] = M_NONE;}//恢复原来的长度数据m_newSnake.head = saveNewSnake.head;m_oldSnake.head = saveOldSnake.head;for(i = 0; i < m_length - n; i++){m_newSnake.body[i] = saveNewSnake.body[i];m_oldSnake.body[i] = saveOldSnake.body[i];}m_newSnake.tail = saveNewSnake.tail;m_oldSnake.tail = saveOldSnake.tail;m_pStateArray = new BitmapState[m_length+2];for (i = 0; i < m_length + 2 - n; i++)m_pStateArray[i] = saveStateArray[i];m_pPos = new SPoint[m_length+2];for(i = 0; i < m_length + 2 - n; i++)m_pPos[i] = savePos[i];}//设置蛇头坐标void CSnake::SetHeadPos(int x, int y){m_pPos[0].x = x;m_pPos[0].y = y;}//取蛇状态的标志数组BitmapState* CSnake::GetStateArray(){return m_pStateArray;}//取蛇的位置信息SPoint* CSnake::GetPos(){return m_pPos;}//取蛇长度int CSnake::GetLength()return m_length + 2;}//检测蛇头是否碰到身体bool CSnake::IsHeadTouchBody(int x, int y){int i;for(i = 1; i < m_length + 2; i++){if (m_pPos[i].x == x && m_pPos[i].y == y)return true;}return false;}//初始化,用作游戏结束后重新开始void CSnake::Initial(){//释放以前的存储空间SAFE_DELETE_ARRAY(m_pPos);SAFE_DELETE_ARRAY(m_pStateArray);SAFE_DELETE_ARRAY(m_newSnake.body);SAFE_DELETE_ARRAY(m_oldSnake.body);int i;int x_pos = 0;int y_pos = 0;m_length = 1;//蛇的身体体长//初始化蛇的坐标位置m_pPos = new SPoint[m_length+2];m_pPos[0].x = x_pos;m_pPos[0].y = y_pos;for (i = 1; i < m_length +2; i++){m_pPos[i].x = 0;m_pPos[i].y = 0;}//初始化蛇的运动状态m_newSnake.head = S_NONE;m_oldSnake.head = S_NONE;m_newSnake.body = new MoveState[m_length];m_oldSnake.body = new MoveState[m_length];for(i = 0; i < m_length; i++){m_oldSnake.body[i] = S_NONE;m_newSnake.body[i] = S_NONE;}m_newSnake.tail = S_NONE;m_oldSnake.tail = S_NONE;//初始化蛇的位图显示状态;m_pStateArray = new BitmapState[m_length+2];for (i = 0; i < m_length + 2; i++){m_pStateArray[i] = M_NONE;}}#ifndef __SNAKE_H_H#define __SNAKE_H_H#define SNAKE_MOVE 1#define SAFE_DELETE_ARRAY(p) {delete [](p);(p)=NULL;}#include <stdio.h>//节点图像显示位图状态enumBitmapState{M_NONE,M_UP_UP,M_DOWN_DOWN,M_LEFT_LEFT,M_RIGHT_RIGHT, M_UP_LEFT,M_UP_RIGHT,M_DOWN_LEFT,M_DOWN_RIGHT,M_LEFT_UP,M_LEFT_DOWN,M_RIGHT_UP,M_RIGHT_DOWN};//节点运动状态enum MoveState{S_NONE,S_UP,S_DOWN,S_LEFT,S_RIGHT};//节点位置坐标struct SPointint x;int y;};//定义蛇体状态struct Snake_Struct{MoveState head;//头部MoveState *body;//身体MoveState tail;//尾部};class CSnake{private:int m_length; //蛇的长度Snake_Struct m_newSnake; //蛇的新态的所有节点的运动状态Snake_Struct m_oldSnake; //蛇的原态的所有节点的坐标的运动状态BitmapState *m_pStateArray; //蛇的所有节点显示位图的状态SPoint *m_pPos; //蛇体坐标BitmapState GetRightState(MoveState oldDirect,MoveState newDirect);public:void Move(void);void ChangeDirect(MoveState d);void AddBody(int n=1);void SetHeadPos(int x, int y);BitmapState * GetStateArray(void);SPoint * GetPos(void);bool IsHeadTouchBody(int x, int y);int GetLength(void);void Initial(void);CSnake(int x_pos = 0, int y_pos = 0, int len = 1);~CSnake();};#endif#include "table.h"CTable::CTable()m_width = 0;m_height = 0;m_foodNumber = 0;m_blockNumber = 0;m_board = NULL;}CTable::~CTable(){if (m_board != NULL){SAFE_DELETE_ARRAY(m_board);}}//初始化面板void CTable::InitialTable(int w,int h){int i, j;m_width = w;m_height = h;m_snake.Initial();if (m_board != NULL){SAFE_DELETE_ARRAY(m_board);}//根据高度和宽度设置新的桌子m_board = new int * [m_height];for (i = 0; i < m_height; i++){m_board[i] = new int[m_width];for (j = 0; j < m_width; j++){m_board[i][j] = 0;}}//将桌子四周设置为墙for (i = 0; i < m_height; i++){m_board[i][0] = TB_STATE_SBLOCK;m_board[i][m_width-1] = TB_STA TE_SBLOCK;}for (i = 0; i < m_width; i++){m_board[0][i] = TB_STATE_SBLOCK;m_board[m_height-1][i] = TB_STA TE_SBLOCK;}}//食物的操作bool CTable::AddBlock(int x, int y){if( (x > 0) && (x < m_width) && (y > 0) && (y < m_height) && (m_board[y][x] == TB_STATE_OK)){m_board[y][x] = TB_STA TE_BLOCK;m_blockNumber++;return true;}return false;}bool CTable::AddFood(int x, int y){if( (x > 0) && (x < m_width) && (y > 0) && (y < m_height) && (m_board[y][x] == TB_STATE_OK)){m_board[y][x] = TB_STA TE_FOOD;m_foodNumber++;return true;}return false;}bool CTable::ClearFood(int x, int y){m_board[y][x] = TB_STA TE_OK;return true;}//取蛇对象CSnake * CTable::GetSnake(void){return &m_snake;}//取桌子对象int ** CTable::GetBoard(void){return m_board;}//获取数据信息int CTable::GetData(int x, int y){return m_board[y][x];}//蛇的操作void CTable::SnakeMove(void){m_snake.Move();}bool CTable::ChangeSnakeDirect(MoveState d){m_snake.ChangeDirect(d);return true;}#ifndef __TABLE_H_H#define __TABLE_H_H#define TB_STATE_OK 0 //正常#define TB_STATE_FOOD 1 //食物#define TB_STATE_BLOCK 2 //障碍-毒果#define TB_STATE_SBLOCK 3 //障碍-墙#include "snake.h"class CTable{private:int m_width;//桌子的宽度int m_height;//桌子的宽度int m_foodNumber;//桌子上食物的数量int m_blockNumber;//毒果的数量CSnake m_snake;//桌上的蛇int ** m_board;//桌的面板public:CTable();~CTable();//初始化面板void InitialTable(int w,int h);//食物的操作bool AddBlock(int x, int y);bool AddFood(int x, int y);bool ClearFood(int x, int y);//物件获取CSnake * GetSnake(void);int ** GetBoard(void);int GetData(int x, int y);//蛇的操作void SnakeMove(void);bool ChangeSnakeDirect(MoveState d); };#endif。

贪吃蛇C语言源代码

贪吃蛇C语言源代码

#include <stdio.h>#include <stdlib.h>#include <Windows.h>//windows编程头文件#include <time.h>#include <conio.h>//控制台输入输出头文件#ifndef __cplusplustypedef char bool;#define false 0#define true 1#endif//将光标移动到控制台的(x,y)坐标点处void gotoxy(int x, int y){COORD coord;coord.X = x;coord.Y = y;SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord); }#define SNAKESIZE 100//蛇的身体最大节数#define MAPWIDTH 78//宽度#define MAPHEIGHT 24//高度//食物的坐标struct {int x;int y;}food;//蛇的相关属性struct {int speed;//蛇移动的速度int len;//蛇的长度int x[SNAKESIZE];//组成蛇身的每一个小方块中x的坐标int y[SNAKESIZE];//组成蛇身的每一个小方块中y的坐标}snake;//绘制游戏边框void drawMap();//随机生成食物void createFood();//按键操作void keyDown();//蛇的状态bool snakeStatus();//从控制台移动光标void gotoxy(int x, int y);int key = 72;//表示蛇移动的方向,72为按下“↑”所代表的数字//用来判断蛇是否吃掉了食物,这一步很重要,涉及到是否会有蛇身移动的效果以及蛇身增长的效果int changeFlag = 0;int sorce = 0;//记录玩家的得分int i;void drawMap(){//打印上下边框for (i = 0; i <= MAPWIDTH; i += 2)//i+=2是因为横向占用的是两个位置{//将光标移动依次到(i,0)处打印上边框gotoxy(i, 0);printf("■");//将光标移动依次到(i,MAPHEIGHT)处打印下边框gotoxy(i, MAPHEIGHT);printf("■");}//打印左右边框for (i = 1; i < MAPHEIGHT; i++){//将光标移动依次到(0,i)处打印左边框gotoxy(0, i);printf("■");//将光标移动依次到(MAPWIDTH, i)处打印左边框gotoxy(MAPWIDTH, i);printf("■");}//随机生成初试食物while (1){srand((unsigned int)time(NULL));food.x = rand() % (MAPWIDTH - 4) + 2;food.y = rand() % (MAPHEIGHT - 2) + 1;//生成的食物横坐标的奇偶必须和初试时蛇头所在坐标的奇偶一致,因为一个字符占两个字节位置,若不一致//会导致吃食物的时候只吃到一半if (food.x % 2 == 0)break;}//将光标移到食物的坐标处打印食物gotoxy(food.x, food.y);printf("*");//初始化蛇的属性snake.len = 3;snake.speed = 200;//在屏幕中间生成蛇头snake.x[0] = MAPWIDTH / 2 + 1;//x坐标为偶数snake.y[0] = MAPHEIGHT / 2;//打印蛇头gotoxy(snake.x[0], snake.y[0]);printf("■");//生成初试的蛇身for (i = 1; i < snake.len; i++){//蛇身的打印,纵坐标不变,横坐标为上一节蛇身的坐标值+2snake.x[i] = snake.x[i - 1] + 2;snake.y[i] = snake.y[i - 1];gotoxy(snake.x[i], snake.y[i]);printf("■");}//打印完蛇身后将光标移到屏幕最上方,避免光标在蛇身处一直闪烁gotoxy(MAPWIDTH - 2, 0);return;}void keyDown(){int pre_key = key;//记录前一个按键的方向if (_kbhit())//如果用户按下了键盘中的某个键{fflush(stdin);//清空缓冲区的字符//getch()读取方向键的时候,会返回两次,第一次调用返回0或者224,第二次调用返回的才是实际值key = _getch();//第一次调用返回的不是实际值key = _getch();//第二次调用返回实际值}/**蛇移动时候先擦去蛇尾的一节*changeFlag为0表明此时没有吃到食物,因此每走一步就要擦除掉蛇尾,以此营造一个移动的效果*为1表明吃到了食物,就不需要擦除蛇尾,以此营造一个蛇身增长的效果*/if (changeFlag == 0){gotoxy(snake.x[snake.len - 1], snake.y[snake.len - 1]);printf(" ");//在蛇尾处输出空格即擦去蛇尾}//将蛇的每一节依次向前移动一节(蛇头除外)for (i = snake.len - 1; i > 0; i--){snake.x[i] = snake.x[i - 1];snake.y[i] = snake.y[i - 1];}//蛇当前移动的方向不能和前一次的方向相反,比如蛇往左走的时候不能直接按右键往右走//如果当前移动方向和前一次方向相反的话,把当前移动的方向改为前一次的方向if (pre_key == 72 && key == 80)key = 72;if (pre_key == 80 && key == 72)key = 80;if (pre_key == 75 && key == 77)key = 75;if (pre_key == 77 && key == 75)key = 77;/***控制台按键所代表的数字*“↑”:72*“↓”:80*“←”:75*“→”:77*///判断蛇头应该往哪个方向移动switch (key){case 75:snake.x[0] -= 2;//往左break;case 77:snake.x[0] += 2;//往右break;case 72:snake.y[0]--;//往上break;case 80:snake.y[0]++;//往下break;}//打印出蛇头gotoxy(snake.x[0], snake.y[0]);printf("■");gotoxy(MAPWIDTH - 2, 0);//由于目前没有吃到食物,changFlag值为0changeFlag = 0;return;}void createFood(){if (snake.x[0] == food.x && snake.y[0] == food.y)//蛇头碰到食物{//蛇头碰到食物即为要吃掉这个食物了,因此需要再次生成一个食物while (1){int flag = 1;srand((unsigned int)time(NULL));food.x = rand() % (MAPWIDTH - 4) + 2;food.y = rand() % (MAPHEIGHT - 2) + 1;//随机生成的食物不能在蛇的身体上for (i = 0; i < snake.len; i++){if (snake.x[i] == food.x && snake.y[i] == food.y){flag = 0;break;}}//随机生成的食物不能横坐标为奇数,也不能在蛇身,否则重新生成if (flag && food.x % 2 == 0)break;}//绘制食物gotoxy(food.x, food.y);printf("*");snake.len++;//吃到食物,蛇身长度加1sorce += 10;//每个食物得10分snake.speed -= 5;//随着吃的食物越来越多,速度会越来越快changeFlag = 1;//很重要,因为吃到了食物,就不用再擦除蛇尾的那一节,以此来造成蛇身体增长的效果}return;}bool snakeStatus(){//蛇头碰到上下边界,游戏结束if (snake.y[0] == 0 || snake.y[0] == MAPHEIGHT)return false;//蛇头碰到左右边界,游戏结束if (snake.x[0] == 0 || snake.x[0] == MAPWIDTH)return false;//蛇头碰到蛇身,游戏结束for (i = 1; i < snake.len; i++){if (snake.x[i] == snake.x[0] && snake.y[i] == snake.y[0])return false;}return true;}int main(){drawMap();while (1){keyDown();if (!snakeStatus())break;createFood();Sleep(snake.speed);}gotoxy(MAPWIDTH / 2, MAPHEIGHT / 2);printf("Game Over!\n");gotoxy(MAPWIDTH / 2, MAPHEIGHT / 2 + 1);printf("本次游戏得分为:%d\n", sorce);Sleep(5000);return 0;}。

贪吃蛇源代码(需要easy x,vc6.0可以成功编译运行)

贪吃蛇源代码(需要easy x,vc6.0可以成功编译运行)

#include <graphics.h>#include <stdlib.h>#include <time.h>//#include <dos.h>#include <conio.h>#include <stdio.h>//#include <winnt.h>#define MAX_JOINTS 200#define LEFT 0x4b00#define RIGHT 0x4d00#define DOWN 0x5000#define UP 0x4800#define ESC 0x011b#define MV_RIGHT 1#define MV_LEFT 2#define MV_UP 3#define MV_DOWN 4void InitGraph(void); /*图形驱动初始化函数*/void DrawFence(void); /*绘制游戏场景*/void GameOver(int score); /*结束游戏*/void GamePlay(void); /*玩游戏具体过程*/void PrScore(int score); /*输出成绩*/struct Food /*食物的结构体定义*/{int x; /*食物的横坐标*/int y; /*食物的纵坐标*/int addFood; /*判断是否要出现食物的变量*/};struct Snake /*蛇的结构体定义*/{int x[MAX_JOINTS]; /*保存蛇身每一节位于屏幕上的列坐标*/ int y[MAX_JOINTS]; /*保存蛇身每一节位于屏幕上的行坐标*/ int joint; /*蛇的节数*/int direction; /*蛇移动方向*/int life; /*蛇的生命,0活着,1死亡*/};/*主函数*/void main(void){InitGraph(); /*图形驱动*/DrawFence(); /*游戏场景*/GamePlay(); /*玩游戏具体过程*/closegraph(); /*图形结束*/}/*图形驱动初始化函数*/void InitGraph(void){int gd = DETECT, gm;initgraph(&gd, &gm, "");cleardevice();setbkcolor(BLUE);cleardevice();setcolor(WHITE);//settextstyle(DEFAULT_FONT, HORIZ_DIR, 3);setfont(32, 0, "宋体");outtextxy(170, 150, "Greedy Snake");outtextxy(219, 254, "Ready?");setcolor(BLUE);cleardevice();}/*游戏开始画面,左上角坐标为(50,40),右下角坐标为(610,460)的围墙*/ void DrawFence(void){int i;setbkcolor(LIGHTGREEN);setcolor(11);//setlinestyle(SOLID_LINE, 0, THICK_WIDTH);setlinestyle(PS_SOLID, 0, 3);/*画围墙*/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){int i, key;//int gamespeed = 22000; /*控制游戏速度*/int gamespeed = 200;int score = 0; /*记录游戏得分*/struct Food food; /*食物结构体变量*/struct Snake snake; /*蛇结构体变量*/food.addFood = 1; /*1表示需要出现新食物,0表示已经存在食物*/ snake.life = 0; /*置蛇的生命状态为活着*/snake.direction = MV_RIGHT; /*置蛇头方向往右*/snake.x[0] = 100; snake.y[0] = 100; /*置蛇头初始位置*/snake.x[1] = 110; snake.y[1] = 100;snake.joint = 2; /*置蛇的初始节数为2*/PrScore(score); /*显示游戏得分*//*重复玩游戏,直到按Esc键结束*/srand(time(NULL));while (1){while (!kbhit())/*在没有按键的情况下,蛇自己移动身体*/{if (food.addFood == 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.addFood = 0; /*画面上有食物*/}if (food.addFood == 0) /*画面上有食物,则显示*/{setcolor(GREEN);rectangle(food.x, food.y, food.x+10, food.y-10);}for (i=snake.joint-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 MV_RIGHT: snake.x[0] += 10; break;case MV_LEFT: snake.x[0] -= 10; break;case MV_UP: snake.y[0] -= 10; break;case MV_DOWN: snake.y[0] += 10; break;}/*从蛇的第四节开始判断是否撞到自己,因为蛇头为两节,第三节不可能拐过来*/for (i=3; i<snake.joint; i++){if (snake.x[i]==snake.x[0] && snake.y[i]==snake.y[0]){GameOver(score); /*显示失败*/snake.life = 1; /*蛇死*/break;}}/*判断蛇是否撞到墙壁*/if (snake.x[0]<55 || snake.x[0]>595|| snake.y[0]<55 || snake.y[0]>455){GameOver(score); /*本次游戏结束*/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.joint] =-20; snake.y[snake.joint] =-20;snake.joint++; /*蛇的身体长一节*/food.addFood = 1; /*画面上需要出现新食物*/score += 10;PrScore(score); /*输出新得分*/}/*画蛇*/setcolor(4);for (i=0; i<snake.joint; i++){rectangle(snake.x[i], snake.y[i],snake.x[i]+10, snake.y[i]-10);}//delay(gamespeed); /*延时控制蛇的速度*/Sleep(gamespeed);/*去除蛇的最后一节*/setcolor(BLUE);rectangle(snake.x[snake.joint-1], snake.y[snake.joint-1],snake.x[snake.joint-1]+10,snake.y[snake.joint-1]-10);} /*end of while(!kbhit)*/if (snake.life == 1) break; /*如果蛇死,则跳出循环*///key = bioskey(0); /*接收按键*/key = getch();/*if (kbhit()){key = getch();}*//*判断按键,是否往相反方向移动,按Esc键则退出*/ /* if (key == ESC) break;else if (key==UP && snake.direction!=4)snake.direction = MV_UP;else if (key==RIGHT && snake.direction!= MV_LEFT)snake.direction = MV_RIGHT;else if (key==LEFT && snake.direction!= MV_RIGHT)snake.direction = MV_LEFT;else if (key==DOWN && snake.direction!= MV_UP)snake.direction = MV_DOWN;*/if (key == ESC) break;else if (key=='W' && snake.direction!=4)snake.direction = MV_UP;else if (key=='D' && snake.direction!= MV_LEFT)snake.direction = MV_RIGHT;else if (key=='A' && snake.direction!= MV_RIGHT)snake.direction = MV_LEFT;else if (key=='S' && snake.direction!= MV_UP)snake.direction = MV_DOWN;} /*end of while(1)*/ }/*结束游戏*/void GameOver(int score){cleardevice();PrScore(score);setcolor(RED);//settextstyle(0, 0, 4);setfont(60, 0,"黑体");outtextxy(200, 200, "GAME OVER");getch();}/*输出成绩*/void PrScore(int score){char str[10];setfillstyle(SOLID_FILL, YELLOW);bar(50, 15, 220, 35);setcolor(6);//settextstyle(0, 0, 2);setfont(16, 0,"宋体");sprintf(str, "score:%d", score);outtextxy(55, 20, str);}。

贪食蛇flash游戏的源代码

贪食蛇flash游戏的源代码

贪食蛇flash游戏的源代码以下是该游戏脚本:var unit = 15;var uwh = 20;var canMove = false;var dir = 2;var score = 0;aPieceList = new Array();mouseListener = new Object();mouseListener.onMouseDown = function(){if (!canMove){canMove = true;startGame();}};Mouse.addListener(mouseListener);k = new Object();k.onKeyDown = function(){var k = Key.getCode();if (k == Key.UP && dir != 2 && canMove) {dir = 0;canMove = false;}else if (k == Key.LEFT && dir != 3 && canMove) {dir = 1;canMove = false;}else if (k == Key.DOWN && dir != 0 && canMove) {dir = 2;canMove = false;}else if (k == Key.RIGHT && dir != 1 && canMove) {dir = 3;canMove = false;}};Key.addListener(k);addPiecefunction addPiece(){var p = this.attachMovie("piece", "piece" + aPieceList.length, aPieceList.length);p._x = aPieceList[aPieceList.length - 1]._x;p._y = aPieceList[aPieceList.length - 1]._y; aPieceList.push(p); } function moveFood(){var moveIt = true;while (moveIt) {food._x = Math.floor(Math.random() * uwh) * unit;food._y = Math.floor(Math.random() * uwh) * unit;moveIt = false;for (var i = 0; i < aPieceList.length; i++){if (aPieceList[i]._x == food._x && aPieceList[i]._y == food._y) {moveIt = true;}}}}function gameOver(){delete this.onEnterFrame;tScore.text = "You Lose. Score: " + score;canMove = false; }function startGame(){for (var i = aPieceList.length - 1; i >= 0; i--){aPieceList[i].removeMovieClip();aPieceList.pop();}score = 0;var p = this.attachMovie("piece", "piece" + aPieceList.length, aPieceList.length);aPieceList.push(p);p._x = 10 * unit;p._y = 10 * unit;var food = this.attachMovie("food", "food", -1);moveFood();var startingLength = 3;for (var i = 1; i < startingLength; i++){addPiece();}this.onEnterFrame = function(){canMove = true;tScore.text = score;for (var i = aPieceList.length - 1; i > 0; i--) {aPieceList[i]._x = aPieceList[i - 1]._x; aPieceList[i]._y = aPieceList[i - 1]._y;}if (dir == 0){aPieceList[0]._y -= unit;}else if (dir == 1){aPieceList[0]._x -= unit;}else if (dir == 2){aPieceList[0]._y += unit;}else if (dir == 3){aPieceList[0]._x += unit;}if (aPieceList[0]._y / unit == 20){aPieceList[0]._y = 0;}else if (aPieceList[0]._y / unit == -1) //{aPieceList[0]._y = 19 * unit;}else if (aPieceList[0]._x / unit == -1) //{aPieceList[0]._x = 19 * unit;}else if (aPieceList[0]._x / unit == 20) //{aPieceList[0]._x = 0;}if (aPieceList[0]._x == food._x && aPieceList[0]._y == food._y) {score += 10 * aPieceList.length / 2;moveFood();addPiece();}for (var i = 1; i < aPieceList.length; i++){if (aPieceList[0]._x == aPieceList[i]._x && aPieceList[0]._y == aPieceList[i]._y){gameOver();}}};}下载源文件。

贪吃蛇源代码

贪吃蛇源代码

#include <graphics.h>#include <stdlib.h>#include <conio.h>#include <time.h>#include <stdio.h>#define LEFT 'a'#define RIGHT 'd'#define DOWN 's'#define UP 'w'#define ESC 27#define N 200 /*蛇的最大长度*/int i;char key;int score=0; /*得分*/int gamespeed=100; /*游戏速度自己调整*/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=9,gm=2;initgraph(&gd,&gm," ");cleardevice();}/*开始画面,左上角坐标为(50,40),右下角坐标为(610,460)的围墙*/void DrawK(void){/*setbkcolor(LIGHTGREEN);*/setcolor(LIGHTCYAN);setlinestyle(PS_SOLID,0,1); /*设置线型*/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){srand(time(NULL)); /*随机数发生器*/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(BLACK); /*把画面上的食物东西去*/ 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(RED); /*画出蛇*/for(i=0;i<snake.node;i++)rectangle(snake.x[i],snake.y[i],snake.x[i]+10,snake.y[i]-10); Sleep(gamespeed);setcolor(BLACK); /*用黑色去除蛇的的最后*/ 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=getch(); /*接收按键*/if (key == ESC) break; /*按ESC键退出*/switch(key){case UP:if(snake.direction!=4) /*判断是否往相反的方向移动*/ snake.direction=3;break;case RIGHT:if(snake.direction!=2) snake.direction=1; break;case LEFT:if(snake.direction!=1) snake.direction=2; break;case DOWN:if(snake.direction!=3) snake.direction=4; break;}}/*endwhile(1)*/}/*游戏结束*/void GameOver(void){cleardevice();PrScore();setcolor(RED);setfont(56,0,"黑体");outtextxy(200,200,"GAME OVER");getch();}/*输出成绩*/void PrScore(void){char str[10];setfillstyle(YELLOW);bar(50,15,220,35);setcolor(BROWN);setfont(16,0,"宋体");sprintf(str,"score:%d",score);outtextxy(55,16,str);}/*图形结束*/void Close(void){closegraph();}。

贪吃蛇源代码

贪吃蛇源代码

#include<stdio.h>#include <stdlib.h>#include <windows.h>#include<time.h>#include <conio.h>struct snake{int x, y;snake *next;};snake *head;static int direction=1;//1,2,3,4分别代表左上右下int food_x, food_y;int foodflag = false;int count = 0;int manu();void init();int gamerun();//游戏开始void move();//移动void printframe();//画界面void paint();//打印蛇身int check();//检测int food();//产生实物int setposition(int x, int y);//设置光标位置int check(){if (head->x == 2 || head->x == 63 || head->y == 1 || head->y == 25) return 0;elsereturn 1;}int food(){srand(unsigned int(time(0)));if (!foodflag){food_x = rand() % 60 + 3;food_y = rand() % 23 + 2;foodflag = true;}setposition(food_x, food_y);printf("*");return 0;}int setposition(int x,int y){HANDLE hOut;hOut = GetStdHandle(STD_OUTPUT_HANDLE);COORD pos = { x-1, y-1 }; /* 光标的起始位(第1列,第3行)0是第1列2是第3行*/SetConsoleCursorPosition(hOut, pos);return 0;}void printframe(){HANDLE consolehwnd;//创建句柄consolehwnd =GetStdHandle(STD_OUTPUT_HANDLE);//实例化句柄SetConsoleTextAttribute(consolehwnd, BACKGROUND_GREEN );//设置字体颜色for (int i = 1; i <40;i++){printf(" ");}setposition(1, 25);for (int i = 1; i < 41; i++){printf(" ");}for (int i = 1; i < 25; i++){setposition(1, i);printf(" ");}for (int i = 1; i < 25; i++){setposition(79, i);printf(" ");}for (int i = 1; i < 25;i++){setposition(63, i);printf(" ");}setposition(67, 5);SetConsoleTextAttribute(consolehwnd, 0x07);//设置字体颜色printf("你的分数:%d\n",count);setposition(66, 8);printf("暂停请按回车");}void init(){snake *temp1, *temp2;head = new snake;temp1 = new snake;temp2 = new snake;head->x = 26;head->y = 12;head->next = temp1;temp1->x = 27;temp1->y = 12;temp1->next = temp2;temp2->x = 28;temp2->y = 12;temp2->next = NULL;}void paint(){snake *p;p = head;while (p){setposition(p->x, p->y);printf("*");p = p->next;}}void move(){snake * newHead;newHead = new snake;newHead->next = head;if (direction==1){newHead->x = head->x - 1;newHead->y = head->y;}if (direction == 2){newHead->x = head->x ;newHead->y = head->y-1;}if (direction == 3){newHead->x = head->x +1;newHead->y = head->y;}if (direction == 4){newHead->x = head->x;newHead->y = head->y+1;}head = newHead;}int gamerun(){char c;setposition(30, 13);printf("按任意键开始");_getch();system("cls");printframe();init();while (1){food();paint();if (_kbhit()){c = _getch();if (c ==-32){c = _getch();if (c ==75 && direction != 3){direction = 1;}if (c == 72 && direction != 4){direction = 2;}if (c == 77 && direction != 1){direction = 3;}if (c == 80 && direction != 2){direction = 4;}}if (c==' '){c = _getch();}if ((c == 'a' || c == 'A')&&direction !=3){direction = 1;}if ((c == 'w' || c == 'W')&&direction != 4){direction = 2;}if ((c == 'd' || c == 'D')&&direction != 1){direction = 3;}if ((c == 's' || c == 'S')&&direction != 2){direction = 4;}}move();paint();if (head->x!=food_x||head->y!=food_y) {snake *t;t = head;while (t->next->next){t = t->next;}setposition(t->next->x, t->next->y);printf(" ");delete t->next;t->next = NULL;}else{foodflag = false;count++;HANDLE consolehwnd;//创建句柄consolehwnd = GetStdHandle(STD_OUTPUT_HANDLE);//实例化句柄setposition(67, 5);SetConsoleTextAttribute(consolehwnd, 0x07);//设置字体颜色printf("你的分数:%d\n", count);}if (!check()){system("cls");setposition(20, 10);printf("你的最终分数为:%d", count);break;}Sleep(200);}return 1;}int main(){gamerun();_getch();return 0;}。

用ActionScript3制作的游戏代码 贪吃蛇

用ActionScript3制作的游戏代码 贪吃蛇

1.贪吃蛇package{import flash.display.Sprite;import flash.display.StageScaleMode;import flash.events.Event;import flash.events.KeyboardEvent;import flash.events.TimerEvent;import flash.text.TextField;import flash.text.TextFormat;import flash.text.TextFormatAlign;import flash.utils.Timer;public class Game extends Sprite {public var frame:Sprite, randombrick:Sprite;public var txt_level:TextField = new TextField(), txt_score:TextField =new TextField(), txt_explain:TextField = new TextField(), txt_winlose:TextField = new TextField(), txt_author:TextField = new TextField();public var tf1:TextFormat = new TextFormat(), tf2:TextFormat = new TextFormat();public var xx:int, yy:int;public var rank:uint = 1;public var time:Timer;public var p_eat:Boolean = true, p_start:Boolean = true;public var body:uint = 5;public var arr:Array = new Array();public function Game(){BASIC();stage.addEventListener(Event.ENTER_FRAME, TFEVENT);stage.addEventListener(KeyboardEvent.KEY_DOWN, START);stage.addEventListener(KeyboardEvent.KEY_DOWN, diction);function START(e:KeyboardEvent):void {if (e.keyCode == 13 &&p_start == true){p_start = false;xx = -20;yy = 0;body = 5;initarr();txt_winlose.text = "";time = new Timer(((rank < 5) ? (400 - rank * 50) : (200 - rank * 10)));time.start();time.addEventListener(TimerEvent.TIMER, MOVE);stage.addEventListener(Event.ENTER_FRAME, RANDOMBRICK);stage.addEventListener(Event.ENTER_FRAME, WINLOSE);}}}private function WINLOSE(et:Event):void {if (arr.length == ((rank < 10) ? (20) : (15))){rank += 1;WINANDLOSE();txt_winlose.text = "WIN";}if (arr.length != 0){if (arr[0].x < 0 || arr[0].x > 390 || arr[0].y < 0 || arr[0].y > 390){ WINANDLOSE();txt_winlose.text = "LOSE";}if (arr.length != 0){for (var a:uint = 2; a <arr.length; a++){if (arr[0].hitTestObject(arr[a])){WINANDLOSE();txt_winlose.text = "LOSE";}}}}function WINANDLOSE():void{p_start = true;for (var m:uint = 0; m <arr.length; m++){removeChild(arr[m]);}arr.splice(0, arr.length - 1);arr.shift();time.removeEventListener(TimerEvent.TIMER, MOVE);stage.removeEventListener(Event.ENTER_FRAME, RANDOMBRICK);stage.removeEventListener(Event.ENTER_FRAME, WINLOSE);}}private function initarr():void{ //初始化数组for (var i:uint = 0; i< body; i++){var brick:Sprite = BRICK();arr.push(brick);addChild(arr[i]);arr[i].x = i * 20 + 200 + 3;arr[i].y = 200 + 3;}}private function MOVE(evt:TimerEvent):void {var temp:Array = arr.splice(arr.length - 1, 1);temp[0].x = arr[0].x + xx;temp[0].y = arr[0].y + yy;arr.unshift(temp[0]);}private function RANDOMBRICK(evt:Event):void { if (p_eat == true){p_eat = false;randombrick = BRICK();var dx:Number = Math.random() * 400;var dy:Number = Math.random() * 400;for (var e:uint = 0; e < 20; e++){if (dx >= 20 * e && dx <= 20 * (e + 1)){randombrick.x = e * 20 + 3;}if (dy>= 20 * e &&dy<= 20 * (e + 1)){randombrick.y = e * 20 + 3;}}addChild(randombrick);randombrick.alpha=1;}if (arr[0].hitTestObject(randombrick)){p_eat = true;body += 1;arr.unshift(randombrick);randombrick.alpha = 0.5;arr[0].x = arr[1].x + xx;arr[0].y = arr[1].y + yy;}}private function FRAME():Sprite { //绘制方格frame = new Sprite();for (var m:uint = 0; m <= 20; m++){frame.graphics.moveTo(0, m * 20);frame.graphics.lineStyle(1, 0x0000ff);frame.graphics.lineTo(400, m * 20);}for (var n:uint = 0; n <= 20; n++){frame.graphics.moveTo(n * 20, 0);frame.graphics.lineStyle(1, 0x0000ff);frame.graphics.lineTo(n * 20, 400);}return frame;}private function TF():void{tf1.size = 14;tf1.color = 0xffffff;tf1.bold = true;tf2.size = 22;tf2.color = 0xffff00;tf2.bold = true;tf2.align = TextFormatAlign.CENTER;}private function TFEVENT(event:Event):void {TF();txt_explain.setTextFormat(tf1, 0, 7);txt_explain.setTextFormat(tf1, 12, 17);txt_explain.setTextFormat(tf2, 8, 10);txt_explain.setTextFormat(tf2, 17, 19);txt_level.text = "LEVEL:\n" + rank;txt_level.setTextFormat(tf1, 0, 6);txt_level.setTextFormat(tf2, 7, txt_level.length);txt_score.text = "SCORE:\n" + (body - 5);txt_score.setTextFormat(tf1, 0, 6);txt_score.setTextFormat(tf2, 7, txt_score.length);txt_winlose.setTextFormat(tf2);txt_author.setTextFormat(tf1);}private function BRICK():Sprite { //画蛇身体var panel:Sprite = new Sprite();panel.graphics.lineStyle(1, 0x00ffff);panel.graphics.beginFill(0x00ff00);panel.graphics.drawRect(0, 0, 18, 18);panel.graphics.endFill();panel.alpha = 0.5;return panel;}private function diction(event:KeyboardEvent):void { //控制蛇头移动方向switch (event.keyCode){case 37:xx = -20;yy = 0;break;case 38:xx = 0;yy = -20;break;case 39:xx = 20;yy = 0;break;case 40:xx = 0;yy = 20;break;default:break;}}private function BASIC():void{stage.scaleMode = StageScaleMode.NO_SCALE; //屏幕不缩放//加载方格frame = FRAME();addChild(frame);frame.x = frame.y = 2;//说明txt_explain.text = "ENTER键:\n开始\n\n方向键:\n移动";txt_winlose.text = "";txt_level.text = "LEVEL:\n" + rank;txt_score.text = "SCORE:\n" + (body - 5);txt_author.text = "author:\n 梅州小露子"txt_explain.selectable = txt_winlose.selectable = txt_level.selectable = txt_score.selectable = txt_author.selectable = false;txt_explain.x = txt_winlose.x = txt_level.x = txt_score.x = txt_author.x = 405;txt_level.y = 20;txt_score.y = 90;txt_winlose.y = 160;txt_explain.y = 210;txt_author.y = 340;txt_explain.background = txt_winlose.background = txt_level.background = txt_score.background = txt_author.background = true;txt_explain.backgroundColor = txt_winlose.backgroundColor =txt_level.backgroundColor = txt_score.backgroundColor = txt_author.backgroundColor = 0x400080;txt_explain.width = txt_winlose.width = txt_level.width = txt_score.width = txt_author.width = 90;txt_explain.height = 105;txt_winlose.height = 30;txt_level.height = txt_score.height = txt_author.height = 50;addChild(txt_explain);addChild(txt_winlose);addChild(txt_level);addChild(txt_score);addChild(txt_author);}}}设置闹钟package{import flash.display.Sprite;import flash.events.Event;import flash.text.TextField;public class Main extends Sprite{public var myhour:Number;public var myminute:Number;public var mysecond:Number; //设定闹钟信息public var mynaozhong:Object={h: 12, m: 02, info: "时间到,该起床了!"};public var txt_shezhi:TextField=new TextField();public var txt_current:TextField=new TextField();public var txt_jieguo:TextField=new TextField();public function Main(){txt_shezhi.text=mynaozhong.h + "时" + mynaozhong.m + "分";txt_shezhi.addEventListener(Event.ENTER_FRAME, _gettime);txt_current.y=50;txt_jieguo.y=100;addChild(txt_shezhi);}public function _gettime(e:Event):void{var mydate:Date=new Date();myhour=mydate.getHours();myminute=mydate.getMinutes();mysecond=mydate.getSeconds();txt_current.text=myhour + "时" + myminute + "分" + mysecond + "秒";addChild(txt_current);if (myhour == mynaozhong.h&&myminute == mynaozhong.m){txt_jieguo.text=;addChild(txt_jieguo);}}}}2.。

贪吃蛇游戏代码

贪吃蛇游戏代码

贪吃蛇游戏可以使用Python的pygame库来实现。

以下是一份完整的贪吃蛇游戏代码:```pythonimport pygameimport sysimport random#初始化pygamepygame.init()#设置屏幕尺寸和标题screen_size=(800,600)screen=pygame.display.set_mode(screen_size)pygame.display.set_caption('贪吃蛇')#设置颜色white=(255,255,255)black=(0,0,0)#设置蛇和食物的大小snake_size=20food_size=20#设置速度clock=pygame.time.Clock()speed=10snake_pos=[[100,100],[120,100],[140,100]]snake_speed=[snake_size,0]food_pos=[random.randrange(1,(screen_size[0]//food_size))*food_size,random.randrange(1,(screen_size[1]//food_size))*food_size]food_spawn=True#游戏主循环while True:for event in pygame.event.get():if event.type==pygame.QUIT:pygame.quit()sys.exit()keys=pygame.key.get_pressed()for key in keys:if keys[pygame.K_UP]and snake_speed[1]!=snake_size:snake_speed=[0,-snake_size]if keys[pygame.K_DOWN]and snake_speed[1]!=-snake_size:snake_speed=[0,snake_size]if keys[pygame.K_LEFT]and snake_speed[0]!=snake_size:snake_speed=[-snake_size,0]if keys[pygame.K_RIGHT]and snake_speed[0]!=-snake_size:snake_speed=[snake_size,0]snake_pos[0][0]+=snake_speed[0]snake_pos[0][1]+=snake_speed[1]#碰撞检测if snake_pos[0][0]<0or snake_pos[0][0]>=screen_size[0]or\snake_pos[0][1]<0or snake_pos[0][1]>=screen_size[1]or\snake_pos[0]in snake_pos[1:]:pygame.quit()sys.exit()#蛇吃食物if snake_pos[0]==food_pos:food_spawn=Falseelse:snake_pos.pop()if not food_spawn:food_pos=[random.randrange(1,(screen_size[0]//food_size))*food_size,random.randrange(1,(screen_size[1]//food_size))*food_size] food_spawn=True#绘制screen.fill(black)for pos in snake_pos:pygame.draw.rect(screen,white,pygame.Rect(pos[0],pos[1],snake_size,snake_size)) pygame.draw.rect(screen,white,pygame.Rect(food_pos[0],food_pos[1],food_size, food_size))pygame.display.flip()clock.tick(speed)```这个代码实现了一个简单的贪吃蛇游戏,包括基本的游戏循环、蛇的移动、食物的生成和碰撞检测。

FlashActionscript制作贪吃蛇简陋版-电脑资料

FlashActionscript制作贪吃蛇简陋版-电脑资料

FlashActionscript制作贪吃蛇简陋版-电脑资料全部代码如下:/************2005.5**************//*********贪吃蛇简陋版************//***********寒冰(胡乱编写)********/var s_x = 0;var s_y = 0;var dir = [[-1, 0], [0, -1], [1, 0], [0, 1]];//四个方向var _dir;var c_x = (Stage.width-256)/2;var c_y = (Stage.height-256)/2;var map;var speed;var level = 1;var child_num;var Child;var snake_arr;init();function init() {speed = 15;child_num = 1;snake_arr = [];DrawOutRound();//画外框DrawMap();//画地图SnakeRun();//蛇移动MakeWall();//创建障碍物MakeChild();//创建食物(后来变成蛇身)createTextField("info", getNextHighestDepth(), 30, 350, 400, 20);createTextField("status", getNextHighestDepth(), 320, 370, 100, 20);status.text = "状态:playing";info.text = "[用方向键控制方向,dead后请点鼠标重新开始]____寒冰制造";}function DrawBox(name, color, w, h) {//画方块var _b = createEmptyMovieClip(name, getNextHighestDepth());with (_b) {lineStyle(0);beginFill(color);lineTo(w, 0);lineTo(w, h);lineTo(0, h);endFill();}return _b;}function DrawOutRound() {DrawBox("outround", 0xffffff, 400, 400);}function DrawMap() {var _box = DrawBox("box", 0xffffff, 16, 16);_box._visible = false;map = [];for (var i = 0; i<16; i++) {map[i] = [];for (var j = 0; j<16; j++) {map[i][j] = 0;_box.duplicateMovieClip("_map"+i+j, getNextHighestDepth(), {_x:c_x+j*16, _y:c_y+i*16});}}//trace(map)}function MakeSnake() {var Snake = DrawBox("snake", 0x000000, 16, 16);snake_arr.push(snake);Snake.x = s_x;Snake.y = s_y;//map[Snake.y][Snake.x] = 1;Snake._x = c_x+s_x*16;Snake._y = c_y+s_y*16;return Snake;}function SnakeRun() {var S = MakeSnake();var i = 0;_dir = dir[3];SnakeControl();S.onEnterFrame. = function() {if (++i>100/speed) {ChildRun();i = 0;if (map[this.y+_dir[1]][this.x+_dir[0]] == 0) {} else if (map[this.y+_dir[1]][this.x+_dir[0]] == 8) { speed++;map[this.y+_dir[1]][this.x+_dir[0]] == 0; snake.swapDepths(getNextHighestDepth()); Child._name = Child._name.substr(1);snake_arr.push(Child);MakeChild();} else {status.text = "状态:over";delete this.onEnterFrame;return;}this.x += _dir[0];this.y += _dir[1];this._x = c_x+16*this.x;this._y = c_y+16*this.y;}};//trace(S);}function SnakeControl() {var bj = {};obj.onKeyDown = function() {var key = Key.getCode();switch (key) {case 37 :_dir = dir[0];break;case 38 :_dir = dir[1];break;case 39 :_dir = dir[2];break;case 40 :_dir = dir[3];}};Key.addListener(obj);}function RndArr() {//随机乱数,为了取得随机的障碍物的位置,不过这里用随机是为了偷懒,应该固定位置的.var arr = [];for (var i = 1; i<256; i++) {arr[i-1] = i;}arr.sort(function () {return random(2) ? 1 : -1;});return arr;}function MakeChild() {var rgb = 0x0000ff;Child = DrawBox("_child"+child_num, rgb, 16, 16);Child._alpha = 0;Child.onEnterFrame. = function() {if ((this._alpha += 5)>100) {delete this.onEnterFrame;}};do {var x = random(16);var y = random(16);} while (map[y][x] != 0 or (x == 0 and y == 0));Child.createTextField("txt", Child.getNextHighestDepth(), 0, 0, 16, 16);//食物上的数字Child.txt.textColor = "0xffffff";Child.txt.text = child_num;map[y][x] = 8;Child._x = c_x+x*16;Child._y = c_y+y*16;child_num++;}function MakeWall() {var _arr = RndArr();for (var i = 0; i<="">var x = _arr[i]%16;var y = int(_arr[i]/16);map[y][x] = 1;var Wall = DrawBox("wall"+i, 0xff0000, 16, 16);Wall._x = c_x+x*16;Wall._y = c_y+y*16;}}function ChildRun() {for (var j in snake_arr) {map[snake_arr[j].y][snake_arr[j].x] = 0;}for (var i = child_num; i>0; i--) {var last_child = this["child"+(i-1)];if (last_child == child0) {last_child = snake;}this["child"+i].x = last_child.x;this["child"+i].y = last_child.y;map[this["child"+i].y][this["child"+i].x] = 1;this["child"+i]._x = c_x+this["child"+i].x*16;this["child"+i]._y = c_y+this["child"+i].y*16;}}nMouseDown = function () {// 鼠标点击进行刷新,重新开始for (var i in this) {if (this[i].__proto__ == MovieClip.prototype) {this[i].removeMovieClip();} else if (this[i].__proto__ == TextField.prototype) {this[i].removeTextField();}}init();}//晚上边玩边弄的,居然写了这么多.bug多多哦,只是个大概样子,唬唬人的: )。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

scorecommand("allowscale", "false");
fscommand("showmenu", "false");
loadedbytes=0;
total=_root.getBytesTotal();
loadedbytes=_root.getBytesLoaded()
if (loadedbytes==total){nextScene();}
else{bfb=int((loadedbytes/total*100))+"%";}
stop();
fscommand("allowscale", "false");
fscommand("showmenu", "false");
music=new Sound()
music.attachSound("music");
music.stop()
music.start(0,10000)
musicstart=true
onClipEvent(keyDown){
temp=Key.getCode();
if(!keyon){;}
else if(game=="stop" and (temp==189 or temp==109)){ if (speed>1) {
speed--;
rate = speed;}}
else if (game=="stop" and (temp==107 or temp==187)) { if (speed<maxspeed) {
speed ++;
rate =speed;}
}else if(game<>"start"){enter();
}else if(temp==Key.ENTER){
enter();
}else if (temp == Key.DOWN and y1>=0) {
x1=0;
y1 = 1;
walk();
timestart()
}else if (temp == Key.UP and y1<=0) {
x1=0;
y1 = -1;
walk();
timestart()
}else if (temp == Key.LEFT and x1<=0) {
y1=0;
x1 = -1;
walk();
timestart()
}else if (temp == Key.RIGHT and x1>=0) {
y1=0;
x1 = 1;
walk();
timestart()
}
}
walks=new Sound();
walks.attachSound("walks");
die=new Sound();
die.attachSound("die");
eat=new Sound();
eat.attachSound("eat");
snakebody="snake1";
game="stop";
keyon=true;
startlong = 7;
maxspeed=10;
speed = 4;
time=new Array(0,1000,800,600,400,250,175,100,75,50,30) rate = speed;
function walk() {
x = x+x1;
y = y+y1;
if (x<0 or x>19 or y<0 or y>19) {
gotoAndStop("over");
} else if (map[x][y] == 2) {
eat.start();
body(x, y);
egg();
long++;
score=score+speed;
} else {
map[snake[0]._x/8][snake[0]._y/8] = 0;
if (map[x][y] == 1) {
gotoAndStop("over");
} else {
snake.push(snake[0]);
snake.shift(0);
snake[long-1]._x = x*8;
snake[long-1]._y = y*8;
map[x][y] = 1;
walks.start();
}
}
}
function egg() {
var x2, y2;
x2 = random(20);
y2 = random(20);
while (map[x2][y2] == 1) {
x2 = random(20);
y2 = random(20);
}
map[x2][y2] = 2;
egg2._x = x2*8;
egg2._y = y2*8;
}
function body(x3, y3) {
window.attachMovie(snakebody, "snake"+long,long);
temp=eval("window.snake"+long);
temp._x=x3*8;
temp._y=y3*8;
snake.push(temp);
map[x3][y3] = 1;
}
function enter(){
if(game=="stop"){
stopallsound()
gotoandplay("start");
}else if(game=="pause"){
game="start";
gotoandplay("play");
}else if(game=="start"){
game="pause";
gotoandplay("pause")
}
}
function clear(){
if (long>startlong) {
for (i=0; i<=long; i++) {
snake[i].removeMovieClip();
}
}
}
function timestart(){
clearInterval(Interval);
Interval=setInterval(walk,time[speed],x1,y1); }
clear();
score=0;
x = startlong-1;
y = 0;
x1 = 1;
y1 = 0;
map = new Array();
for (i=0; i<20; i++) {
map[i] = new Array(20);
}
snake = new Array();
x = startlong-1;
y = 0;
for (var long = 0; long<startlong; long++) { body(long, 0);
}
egg();
game="start";
运行结果如图:。

相关文档
最新文档