第26天 贪吃蛇项目源码
2016-12-27 20:22
363 查看
贪吃蛇游戏:一个游戏最核心的部分是游戏的业务逻辑代码
分析里面的有几个事物:
1. 地图
2. 蛇
3. 食物
了解游戏规则:
1.蛇初始化的时候是三个节点,而且一开始蛇是出现在地图的中间位置。
2. 蛇吃到东西会长长一节。
3. 蛇咬到自己会死,蛇撞墙也会死。
4. 食物是随机生成的,食物不能长在石头上,食物可以长在蛇身上。
***********************************
* *
* @ *
* *
* ##$ *
* *
* *
* *
***********************************
char[][] 宽 高
把这个地图存储到一个二维数组中给我,
贪吃蛇版本2
package cn.itcast.snake;
import java.awt.BorderLayout;
import java.awt.Point;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.util.LinkedList;
import java.util.Random;
import javax.swing.JButton;
import javax.swing.JFrame;
import cn.itcast.util.FrameUtil;
public class SnakeGame {
//地图的宽(列数)
public static final int WIDTH = 35;
//地图高(行数)
public static final int HEIGHT = 9;
//地图
private char[][] background = new char[HEIGHT][WIDTH];
//使用集合保存蛇节点的所有信息
LinkedList<Point> snake = new LinkedList<Point>();
//食物
Point food;
//使用四个常量表示四个方向
public static final int UP_DIRECTION = 1; //上
public static final int DOWN_DIRECTION = -1; //下
public static final int LEFT_DIRECTION = 2; //左
public static final int RIGHT_DIRECTION =-2; //右
//蛇当前的方向
int currentDrection = -2; // 蛇默认是向右行走
//记录游戏是否结束
static boolean isGameOver = false; //默认游戏没有结束的。
//蛇移动的方法
public void move(){
Point head = snake.getFirst();
//蛇是根据当前的方向移动的
switch (currentDrection) {
case UP_DIRECTION:
//添加新的蛇头
snake.addFirst(new Point(head.x,head.y-1));
break;
case DOWN_DIRECTION:
//添加新的蛇头
snake.addFirst(new Point(head.x,head.y+1));
break;
case LEFT_DIRECTION:
if(head.x==0){
snake.addFirst(new Point(WIDTH-1,head.y));
}else{
//添加新的蛇头
snake.addFirst(new Point(head.x-1,head.y));
}
break;
case RIGHT_DIRECTION:
if(head.x==WIDTH-1){
snake.addFirst(new Point(0,head.y));
}else{
//添加新的蛇头
snake.addFirst(new Point(head.x+1,head.y));
}
break;
default:
break;
}
if(eat()){
//吃到了食物
createFood();
}else{
//删除蛇尾
snake.removeLast();
}
}
//改变当前方向的方法
public void changeDirection(int newDirection){
//判断新方向是否与当前方向是否是相反方向,才允许其改变
if(newDirection+currentDrection!=0){
this.currentDrection = newDirection;
}
}
//生成食物
public void createFood(){
//创建一个随机数对象
Random random = new Random();
while(true){
int x = random.nextInt(WIDTH);
int y = random.nextInt(HEIGHT);
if(background[y][x]!='*'){
food = new Point(x,y);
break;
}
}
}
//显示食物
public void showFood(){
background[food.y][food.x] ='@';
}
//初始化蛇
public void initSnake(){
int x = WIDTH/2;
int y = HEIGHT/2;
snake.addFirst(new Point(x-1,y));
snake.addFirst(new Point(x,y));
snake.addFirst(new Point(x+1,y));
}
//显示蛇--->实际上就是将蛇节点 的坐标信息反馈到地图上,在地图上画上对应的字符而已
public void showSnake(){
//画蛇身
for(int i =1; i<snake.size() ; i++ ){
Point body = snake.get(i);
background[body.y][body.x] = '#';
}
//取出蛇头
Point head = snake.getFirst();
background[head.y][head.x] = '$';
}
//初始化地图
public void initBackground(){
for(int rows = 0 ; rows<background.length ; rows++){
for(int cols = 0 ; cols<background[rows].length ; cols++ ){
if(rows==0||rows==(HEIGHT-1)){ //第一行、最后一行、 第一列与最后一列
background[rows][cols] = '*';
}else{
background[rows][cols] = ' ';
}
}
}
}
//显示地图的
public void showBackground() {
//打印二维数组
for(int rows = 0 ; rows<background.length ; rows++){ // rows =0
for(int cols = 0 ; cols<background[rows].length ; cols++ ){
System.out.print(background[rows][cols]);
}
System.out.println(); //换行
}
}
//刷新游戏 的状态
public void refrash(){
//清空游戏之前的所有状态信息
initBackground();
//把蛇最新的状态反馈到地图上
showSnake();
//把食物的信息反馈到地图婚丧。
showFood();
//显示当前地图的信息
showBackground();
}
//吃食物
public boolean eat(){
//获取到原来的蛇头
Point head = snake.getFirst();
if(head.equals(food)){
return true;
}
return false;
}
//游戏结束的方法
public void isGameOver(){
//撞墙死亡
Point head = snake.getFirst();
if(background[head.y][head.x]=='*'){
isGameOver = true;
}
//咬到自己 蛇身
for(int i = 1; i<snake.size() ; i++){
Point body = snake.get(i);
if(head.equals(body)){
isGameOver = true;
}
}
}
public static void main(String[] args) throws Exception {
final SnakeGame snake = new SnakeGame();
//初始化地图
snake.initBackground();
//初始化蛇
snake.initSnake();
//把蛇的信息反馈到地图上
snake.showSnake();
//初始化事物
snake.createFood();
//显示食物
snake.showFood();
snake.showBackground();
JFrame frame = new JFrame("方向盘");
frame.add(new JButton("↑"),BorderLayout.NORTH);
frame.add(new JButton("↓"),BorderLayout.SOUTH);
frame.add(new JButton("←"),BorderLayout.WEST);
frame.add(new JButton("→"),BorderLayout.EAST);
JButton button = new JButton("点击控制方向");
frame.add(button);
FrameUtil.initFrame(frame, 300, 300);
//给按钮添加事件监听器
button.addKeyListener(new KeyAdapter(){
@Override
public void keyPressed(KeyEvent e) {
int code = e.getKeyCode();
switch (code) {
case KeyEvent.VK_UP:
snake.changeDirection(UP_DIRECTION);
break;
case KeyEvent.VK_DOWN:
snake.changeDirection(DOWN_DIRECTION);
break;
case KeyEvent.VK_LEFT:
snake.changeDirection(LEFT_DIRECTION);
break;
case KeyEvent.VK_RIGHT:
snake.changeDirection(RIGHT_DIRECTION);
break;
default:
break;
}
snake.move();
snake.isGameOver();//判断是否游戏结束
snake.refrash();
if(isGameOver){
System.out.println("游戏结束了..");
System.exit(0);
}
}
});
}
}
package cn.itcast.util;
import java.awt.Dimension;
import java.awt.Toolkit;
import javax.swing.JFrame;
//初始化窗体的工具类
public class FrameUtil {
public static void initFrame(JFrame frame,int width , int height){
Toolkit toolkit = Toolkit.getDefaultToolkit(); //获取一个与系统相关工具类对象
//获取屏幕的分辨率
Dimension d = toolkit.getScreenSize();
int x = (int) d.getWidth();
int y = (int) d.getHeight();
frame.setBounds((x-width)/2, (y-height)/2, width, height);
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}
package cn.itcast.view;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Point;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.util.LinkedList;
import javax.swing.JFrame;
import javax.swing.JPanel;
import cn.itcast.util.FrameUtil;
public class SnakeView extends JPanel{
//地图的宽(列数)
public static final int WIDTH = 40;
//地图高(行数)
public static final int HEIGHT = 30;
//格子宽
public static final int CELLWIDTH = 20;
//格子高
public static final int CELLHEIGHT = 20;
//地图
private boolean[][] background = new boolean[HEIGHT][WIDTH];
//使用集合保存蛇节点的所有信息
LinkedList<Point> snake = new LinkedList<Point>();
//初始化蛇
public void initSnake(){
int x = WIDTH/2;
int y = HEIGHT/2;
snake.addFirst(new Point(x-1,y));
snake.addFirst(new Point(x,y));
snake.addFirst(new Point(x+1,y));
}
//向上移动
public void moveUp(){
//获取原来蛇头
Point head = snake.getFirst();
//添加新的蛇头
snake.addFirst(new Point(head.x,head.y-1));
//删除蛇尾
snake.removeLast();
}
//初始化地图
public void initBackground(){
for(int rows = 0 ; rows<background.length ; rows++){
for(int cols = 0 ; cols<background[rows].length ; cols++ ){
if(rows==0||rows==(HEIGHT-1)||cols==0||cols==(WIDTH-1)){ //第一行、最后一行、 第一列与最后一列
background[rows][cols] = true;
}
}
}
}
@Override
public void paint(Graphics g) {
//画地图
for(int rows = 0 ; rows<background.length ; rows++){ // rows =0
for(int cols = 0 ; cols<background[rows].length ; cols++ ){
if(background[rows][cols]){
//石头
g.setColor(Color.GRAY);
}else{
//空地
g.setColor(Color.WHITE);
}
//画矩形
g.fill3DRect(cols*CELLWIDTH, rows*CELLHEIGHT, CELLWIDTH, CELLHEIGHT, true);
}
}
//画蛇
//取出蛇头
Point head = snake.getFirst();
g.setColor(Color.RED);
g.fill3DRect(head.x*CELLWIDTH, head.y*CELLHEIGHT, CELLWIDTH, CELLHEIGHT, true);
//画蛇身
g.setColor(Color.GREEN);
for(int i =1; i<snake.size() ; i++ ){
Point body = snake.get(i);
g.fill3DRect(body.x*CELLWIDTH, body.y*CELLHEIGHT, CELLWIDTH, CELLHEIGHT, true);
}
}
public static void main(String[] args) {
JFrame frame = new JFrame("贪吃蛇");
final SnakeView snakeView = new SnakeView();
snakeView.initBackground();
snakeView.initSnake();
frame.add(snakeView);
FrameUtil.initFrame(frame, WIDTH*CELLWIDTH+20, HEIGHT*CELLHEIGHT+35);
//给窗口添加事件监听
frame.addKeyListener(new KeyAdapter() {
@Override
public void keyPressed(KeyEvent e) {
int code = e.getKeyCode();
switch (code) {
case KeyEvent.VK_UP:
snakeView.moveUp();
//重画游戏
snakeView.repaint(); //调用repaint方法的时候实际上就是调用了paint方法。
break;
default:
break;
}
}
});
}
}
package cn.itcast.view;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import javax.swing.JFrame;
import javax.swing.JPanel;
import cn.itcast.util.FrameUtil;
public class Demo1 extends JPanel { // Demo1 也是一个面板
@Override
public void paint(Graphics g) { // Graphics g 画笔 使用该画笔可以画任何的东西。
// 设置画笔的颜色
g.setColor(Color.GRAY);
// 画矩形
g.fill3DRect(0, 0, 20, 20, true);
g.fill3DRect(20, 0, 20, 20, true);
g.setColor(Color.GREEN);
g.fill3DRect(20, 20, 20, 20, true);
// 写字
g.setColor(Color.RED);
// 设置画笔 的字体
g.setFont(new Font("宋体", Font.BOLD, 30));
g.drawString("GAME OVER", 300, 200);
}
public static void main(String[] args) {
JFrame frame = new JFrame("测试");
Demo1 d = new Demo1();
frame.add(d);
FrameUtil.initFrame(frame, 700, 500);
}
}
分析里面的有几个事物:
1. 地图
2. 蛇
3. 食物
了解游戏规则:
1.蛇初始化的时候是三个节点,而且一开始蛇是出现在地图的中间位置。
2. 蛇吃到东西会长长一节。
3. 蛇咬到自己会死,蛇撞墙也会死。
4. 食物是随机生成的,食物不能长在石头上,食物可以长在蛇身上。
***********************************
* *
* @ *
* *
* ##$ *
* *
* *
* *
***********************************
char[][] 宽 高
把这个地图存储到一个二维数组中给我,
package cn.itcast.snake; import java.awt.Point; import java.util.LinkedList; import java.util.Random; public class SnakeGame { // 地图的宽(列数) public static final int WIDTH = 30; // 地图高(行数) public static final int HEIGHT = 10; // 地图 private char[][] background = new char[HEIGHT][WIDTH]; // 使用集合保存蛇节点的所有信息 LinkedList<Point> snake = new LinkedList<Point>(); // 食物 Point food; // 初始化地图 public void initBackground() { for (int rows = 0; rows < background.length; rows++) { for (int cols = 0; cols < background[rows].length; cols++) { if (rows == 0 || rows == (HEIGHT - 1) || cols == 0 || cols == (WIDTH - 1)) { // 第一行、最后一行、 第一列与最后一列 background[rows][cols] = '*'; } else { background[rows][cols] = ' '; } } } } // 显示地图的 public void showBackground() { // 打印二维数组 for (int rows = 0; rows < background.length; rows++) { // rows =0 for (int cols = 0; cols < background[rows].length; cols++) { System.out.print(background[rows][cols]); } System.out.println(); // 换行 } } // 3.蛇的初始化 public void initSnake() { int x = WIDTH / 2; int y = HEIGHT / 2; snake.addFirst(new Point(x - 1, y)); snake.addFirst(new Point(x, y)); snake.addFirst(new Point(x + 1, y)); } // 显示蛇--->实际上就是将蛇节点 的坐标信息反馈到地图上,在地图上画上对应的字符而已 public void showSnake() { // 取出蛇头 Point head = snake.getFirst(); background[head.y][head.x] = '$'; // 画蛇身 for (int i = 1; i < snake.size(); i++) { Point body = snake.get(i); background[body.y][body.x] = '#'; } } // 向上移动 public void moveUp() { // 获取原来蛇头 Point head = snake.getFirst(); // 添加新的蛇头 snake.addFirst(new Point(head.x, head.y - 1)); // 删除蛇尾 snake.removeLast(); } // 向下走 public void moveDown() { // 获取到原来的蛇头 Point head = snake.getFirst(); // 添加新的蛇头 snake.addFirst(new Point(head.x, head.y + 1)); // 删除蛇尾 snake.removeLast(); } // 向左走 public void moveLeft() { // 获取到原来的蛇头 Point head = snake.getFirst(); // 添加新的蛇头 snake.addFirst(new Point(head.x - 1, head.y)); // 删除蛇尾 snake.removeLast(); } // 向右走 public void moveRight() { // 获取到原来的蛇头 Point head = snake.getFirst(); // 添加新的蛇头 snake.addFirst(new Point(head.x + 1, head.y)); // 删除蛇尾 snake.removeLast(); } // 生成食物 public void createFood() { // 创建一个随机数对象 Random random = new Random(); while (true) { int x = random.nextInt(WIDTH); int y = random.nextInt(HEIGHT); if (background[y][x] != '*') { food = new Point(x, y); break; } } } // 显示食物 public void showFood() { background[food.y][food.x] = '@'; } // 刷新游戏 的状态 public void refrash() { // 清空游戏之前的所有状态信息 initBackground(); // 把蛇最新的状态反馈到地图上 showSnake(); // 把食物的信息反馈到地图婚丧。 showFood(); // 显示当前地图的信息 showBackground(); } public static void main(String[] args) throws Exception { SnakeGame snake = new SnakeGame(); // 初始化地图 snake.initBackground(); // 初始化蛇 snake.initSnake(); // 把蛇的信息反馈到地图上 snake.showSnake(); // 初始化事物 snake.createFood(); // 显示食物 snake.showFood(); snake.showBackground(); // 向上三步 for (int i = 0; i < 3; i++) { snake.moveUp(); snake.refrash(); Thread.sleep(500); } // 向下三步 for (int i = 0; i < 3; i++) { snake.moveDown(); snake.refrash(); Thread.sleep(500); } // 向右三步 for (int i = 0; i < 3; i++) { snake.moveRight(); snake.refrash(); Thread.sleep(500); } // 向左三步 for (int i = 0; i < 3; i++) { snake.moveLeft(); snake.refrash(); Thread.sleep(500); } } }
贪吃蛇版本2
package cn.itcast.snake;
import java.awt.BorderLayout;
import java.awt.Point;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.util.LinkedList;
import java.util.Random;
import javax.swing.JButton;
import javax.swing.JFrame;
import cn.itcast.util.FrameUtil;
public class SnakeGame {
//地图的宽(列数)
public static final int WIDTH = 35;
//地图高(行数)
public static final int HEIGHT = 9;
//地图
private char[][] background = new char[HEIGHT][WIDTH];
//使用集合保存蛇节点的所有信息
LinkedList<Point> snake = new LinkedList<Point>();
//食物
Point food;
//使用四个常量表示四个方向
public static final int UP_DIRECTION = 1; //上
public static final int DOWN_DIRECTION = -1; //下
public static final int LEFT_DIRECTION = 2; //左
public static final int RIGHT_DIRECTION =-2; //右
//蛇当前的方向
int currentDrection = -2; // 蛇默认是向右行走
//记录游戏是否结束
static boolean isGameOver = false; //默认游戏没有结束的。
//蛇移动的方法
public void move(){
Point head = snake.getFirst();
//蛇是根据当前的方向移动的
switch (currentDrection) {
case UP_DIRECTION:
//添加新的蛇头
snake.addFirst(new Point(head.x,head.y-1));
break;
case DOWN_DIRECTION:
//添加新的蛇头
snake.addFirst(new Point(head.x,head.y+1));
break;
case LEFT_DIRECTION:
if(head.x==0){
snake.addFirst(new Point(WIDTH-1,head.y));
}else{
//添加新的蛇头
snake.addFirst(new Point(head.x-1,head.y));
}
break;
case RIGHT_DIRECTION:
if(head.x==WIDTH-1){
snake.addFirst(new Point(0,head.y));
}else{
//添加新的蛇头
snake.addFirst(new Point(head.x+1,head.y));
}
break;
default:
break;
}
if(eat()){
//吃到了食物
createFood();
}else{
//删除蛇尾
snake.removeLast();
}
}
//改变当前方向的方法
public void changeDirection(int newDirection){
//判断新方向是否与当前方向是否是相反方向,才允许其改变
if(newDirection+currentDrection!=0){
this.currentDrection = newDirection;
}
}
//生成食物
public void createFood(){
//创建一个随机数对象
Random random = new Random();
while(true){
int x = random.nextInt(WIDTH);
int y = random.nextInt(HEIGHT);
if(background[y][x]!='*'){
food = new Point(x,y);
break;
}
}
}
//显示食物
public void showFood(){
background[food.y][food.x] ='@';
}
//初始化蛇
public void initSnake(){
int x = WIDTH/2;
int y = HEIGHT/2;
snake.addFirst(new Point(x-1,y));
snake.addFirst(new Point(x,y));
snake.addFirst(new Point(x+1,y));
}
//显示蛇--->实际上就是将蛇节点 的坐标信息反馈到地图上,在地图上画上对应的字符而已
public void showSnake(){
//画蛇身
for(int i =1; i<snake.size() ; i++ ){
Point body = snake.get(i);
background[body.y][body.x] = '#';
}
//取出蛇头
Point head = snake.getFirst();
background[head.y][head.x] = '$';
}
//初始化地图
public void initBackground(){
for(int rows = 0 ; rows<background.length ; rows++){
for(int cols = 0 ; cols<background[rows].length ; cols++ ){
if(rows==0||rows==(HEIGHT-1)){ //第一行、最后一行、 第一列与最后一列
background[rows][cols] = '*';
}else{
background[rows][cols] = ' ';
}
}
}
}
//显示地图的
public void showBackground() {
//打印二维数组
for(int rows = 0 ; rows<background.length ; rows++){ // rows =0
for(int cols = 0 ; cols<background[rows].length ; cols++ ){
System.out.print(background[rows][cols]);
}
System.out.println(); //换行
}
}
//刷新游戏 的状态
public void refrash(){
//清空游戏之前的所有状态信息
initBackground();
//把蛇最新的状态反馈到地图上
showSnake();
//把食物的信息反馈到地图婚丧。
showFood();
//显示当前地图的信息
showBackground();
}
//吃食物
public boolean eat(){
//获取到原来的蛇头
Point head = snake.getFirst();
if(head.equals(food)){
return true;
}
return false;
}
//游戏结束的方法
public void isGameOver(){
//撞墙死亡
Point head = snake.getFirst();
if(background[head.y][head.x]=='*'){
isGameOver = true;
}
//咬到自己 蛇身
for(int i = 1; i<snake.size() ; i++){
Point body = snake.get(i);
if(head.equals(body)){
isGameOver = true;
}
}
}
public static void main(String[] args) throws Exception {
final SnakeGame snake = new SnakeGame();
//初始化地图
snake.initBackground();
//初始化蛇
snake.initSnake();
//把蛇的信息反馈到地图上
snake.showSnake();
//初始化事物
snake.createFood();
//显示食物
snake.showFood();
snake.showBackground();
JFrame frame = new JFrame("方向盘");
frame.add(new JButton("↑"),BorderLayout.NORTH);
frame.add(new JButton("↓"),BorderLayout.SOUTH);
frame.add(new JButton("←"),BorderLayout.WEST);
frame.add(new JButton("→"),BorderLayout.EAST);
JButton button = new JButton("点击控制方向");
frame.add(button);
FrameUtil.initFrame(frame, 300, 300);
//给按钮添加事件监听器
button.addKeyListener(new KeyAdapter(){
@Override
public void keyPressed(KeyEvent e) {
int code = e.getKeyCode();
switch (code) {
case KeyEvent.VK_UP:
snake.changeDirection(UP_DIRECTION);
break;
case KeyEvent.VK_DOWN:
snake.changeDirection(DOWN_DIRECTION);
break;
case KeyEvent.VK_LEFT:
snake.changeDirection(LEFT_DIRECTION);
break;
case KeyEvent.VK_RIGHT:
snake.changeDirection(RIGHT_DIRECTION);
break;
default:
break;
}
snake.move();
snake.isGameOver();//判断是否游戏结束
snake.refrash();
if(isGameOver){
System.out.println("游戏结束了..");
System.exit(0);
}
}
});
}
}
package cn.itcast.util;
import java.awt.Dimension;
import java.awt.Toolkit;
import javax.swing.JFrame;
//初始化窗体的工具类
public class FrameUtil {
public static void initFrame(JFrame frame,int width , int height){
Toolkit toolkit = Toolkit.getDefaultToolkit(); //获取一个与系统相关工具类对象
//获取屏幕的分辨率
Dimension d = toolkit.getScreenSize();
int x = (int) d.getWidth();
int y = (int) d.getHeight();
frame.setBounds((x-width)/2, (y-height)/2, width, height);
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}
package cn.itcast.view;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Point;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.util.LinkedList;
import javax.swing.JFrame;
import javax.swing.JPanel;
import cn.itcast.util.FrameUtil;
public class SnakeView extends JPanel{
//地图的宽(列数)
public static final int WIDTH = 40;
//地图高(行数)
public static final int HEIGHT = 30;
//格子宽
public static final int CELLWIDTH = 20;
//格子高
public static final int CELLHEIGHT = 20;
//地图
private boolean[][] background = new boolean[HEIGHT][WIDTH];
//使用集合保存蛇节点的所有信息
LinkedList<Point> snake = new LinkedList<Point>();
//初始化蛇
public void initSnake(){
int x = WIDTH/2;
int y = HEIGHT/2;
snake.addFirst(new Point(x-1,y));
snake.addFirst(new Point(x,y));
snake.addFirst(new Point(x+1,y));
}
//向上移动
public void moveUp(){
//获取原来蛇头
Point head = snake.getFirst();
//添加新的蛇头
snake.addFirst(new Point(head.x,head.y-1));
//删除蛇尾
snake.removeLast();
}
//初始化地图
public void initBackground(){
for(int rows = 0 ; rows<background.length ; rows++){
for(int cols = 0 ; cols<background[rows].length ; cols++ ){
if(rows==0||rows==(HEIGHT-1)||cols==0||cols==(WIDTH-1)){ //第一行、最后一行、 第一列与最后一列
background[rows][cols] = true;
}
}
}
}
@Override
public void paint(Graphics g) {
//画地图
for(int rows = 0 ; rows<background.length ; rows++){ // rows =0
for(int cols = 0 ; cols<background[rows].length ; cols++ ){
if(background[rows][cols]){
//石头
g.setColor(Color.GRAY);
}else{
//空地
g.setColor(Color.WHITE);
}
//画矩形
g.fill3DRect(cols*CELLWIDTH, rows*CELLHEIGHT, CELLWIDTH, CELLHEIGHT, true);
}
}
//画蛇
//取出蛇头
Point head = snake.getFirst();
g.setColor(Color.RED);
g.fill3DRect(head.x*CELLWIDTH, head.y*CELLHEIGHT, CELLWIDTH, CELLHEIGHT, true);
//画蛇身
g.setColor(Color.GREEN);
for(int i =1; i<snake.size() ; i++ ){
Point body = snake.get(i);
g.fill3DRect(body.x*CELLWIDTH, body.y*CELLHEIGHT, CELLWIDTH, CELLHEIGHT, true);
}
}
public static void main(String[] args) {
JFrame frame = new JFrame("贪吃蛇");
final SnakeView snakeView = new SnakeView();
snakeView.initBackground();
snakeView.initSnake();
frame.add(snakeView);
FrameUtil.initFrame(frame, WIDTH*CELLWIDTH+20, HEIGHT*CELLHEIGHT+35);
//给窗口添加事件监听
frame.addKeyListener(new KeyAdapter() {
@Override
public void keyPressed(KeyEvent e) {
int code = e.getKeyCode();
switch (code) {
case KeyEvent.VK_UP:
snakeView.moveUp();
//重画游戏
snakeView.repaint(); //调用repaint方法的时候实际上就是调用了paint方法。
break;
default:
break;
}
}
});
}
}
package cn.itcast.view;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import javax.swing.JFrame;
import javax.swing.JPanel;
import cn.itcast.util.FrameUtil;
public class Demo1 extends JPanel { // Demo1 也是一个面板
@Override
public void paint(Graphics g) { // Graphics g 画笔 使用该画笔可以画任何的东西。
// 设置画笔的颜色
g.setColor(Color.GRAY);
// 画矩形
g.fill3DRect(0, 0, 20, 20, true);
g.fill3DRect(20, 0, 20, 20, true);
g.setColor(Color.GREEN);
g.fill3DRect(20, 20, 20, 20, true);
// 写字
g.setColor(Color.RED);
// 设置画笔 的字体
g.setFont(new Font("宋体", Font.BOLD, 30));
g.drawString("GAME OVER", 300, 200);
}
public static void main(String[] args) {
JFrame frame = new JFrame("测试");
Demo1 d = new Demo1();
frame.add(d);
FrameUtil.initFrame(frame, 700, 500);
}
}
相关文章推荐
- 贪吃蛇项目源码
- 原生JS实现贪吃蛇项目,附源码下载!
- 第26天(就业班) 餐馆王项目实战源码
- 示例项目Codematicdemo的Asp.net2.0版源码发布免费下载,代码生成器Codematic2.0bate版预览
- 贪吃蛇源码分析~
- 外包项目中源码的价值——CSDN外包实践(7)
- DbToCodeDemo示例项目源码DALFactory无法反射创建类实例的常见错误说明
- 贪吃蛇源码
- 自由源码项目管理
- Eclipse下实现软件项目的源码管理
- 项目开发技巧(四):使用JspSmartupload实现文件上传下载(一):JspSmart之upload组件源码及使用
- 企业应用开发和开放源码项目
- 示例项目Codematicdemo的Asp.net2.0版源码发布免费下载,代码生成器Codematic2.0bate版预览
- VOIP开源项目源码地址(一)
- VOIP开源项目源码地址
- 贪吃蛇源码
- VOIP开源项目源码地址(一)
- sip phone VOIP开源项目源码地址
- 示例项目Codematicdemo的Asp.net2.0版源码发布免费下载,代码生成器Codematic2.0bate版预览
- 在VS2005中打开受源码管理(VSS)项目的方法