编写简单消消乐C,C#,java,都可以

编写简单消消乐C,C#,java,都可以,第1张

有一个我们老师编写的贪吃蛇程序 供你参考一下:

GreedSnake.java (也是程序入口):

import java.awt.BorderLayout

import java.awt.Canvas

import java.awt.Color

import java.awt.Container

import java.awt.Graphics

import java.awt.event.KeyEvent

import java.awt.event.KeyListener

import java.util.Iterator

import java.util.LinkedList

import javax.swing.JFrame

import javax.swing.JLabel

import javax.swing.JPanel

public class GreedSnake implements KeyListener {

JFrame mainFrame

Canvas paintCanvas

JLabel labelScore// 计分牌

SnakeModel snakeModel = null// 蛇

public static final int canvasWidth = 200

public static final int canvasHeight = 300

public static final int nodeWidth = 10

public static final int nodeHeight = 10

// ----------------------------------------------------------------------

// GreedSnake():初始化游戏界面

// ----------------------------------------------------------------------

public GreedSnake() {

// 设置界面元素

mainFrame = new JFrame("GreedSnake")

Container cp = mainFrame.getContentPane()

labelScore = new JLabel("Score:")

cp.add(labelScore, BorderLayout.NORTH)

paintCanvas = new Canvas()

paintCanvas.setSize(canvasWidth + 1, canvasHeight + 1)

paintCanvas.addKeyListener(this)

cp.add(paintCanvas, BorderLayout.CENTER)

JPanel panelButtom = new JPanel()

panelButtom.setLayout(new BorderLayout())

JLabel labelHelp// 帮助信息

labelHelp = new JLabel("PageUp, PageDown for speed", JLabel.CENTER)

panelButtom.add(labelHelp, BorderLayout.NORTH)

labelHelp = new JLabel("ENTER or R or S for start", JLabel.CENTER)

panelButtom.add(labelHelp, BorderLayout.CENTER)

labelHelp = new JLabel("SPACE or P for pause", JLabel.CENTER)

panelButtom.add(labelHelp, BorderLayout.SOUTH)

cp.add(panelButtom, BorderLayout.SOUTH)

mainFrame.addKeyListener(this)

mainFrame.pack()

mainFrame.setResizable(false)

mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE)

mainFrame.setVisible(true)

begin()

}

// ----------------------------------------------------------------------

// keyPressed():按键检测

// ----------------------------------------------------------------------

public void keyPressed(KeyEvent e) {

int keyCode = e.getKeyCode()

if (snakeModel.running)

switch (keyCode) {

case KeyEvent.VK_UP:

snakeModel.changeDirection(SnakeModel.UP)

break

case KeyEvent.VK_DOWN:

snakeModel.changeDirection(SnakeModel.DOWN)

break

case KeyEvent.VK_LEFT:

snakeModel.changeDirection(SnakeModel.LEFT)

break

case KeyEvent.VK_RIGHT:

snakeModel.changeDirection(SnakeModel.RIGHT)

break

case KeyEvent.VK_ADD:

case KeyEvent.VK_PAGE_UP:

snakeModel.speedUp()// 加速

break

case KeyEvent.VK_SUBTRACT:

case KeyEvent.VK_PAGE_DOWN:

snakeModel.speedDown()// 减速

break

case KeyEvent.VK_SPACE:

case KeyEvent.VK_P:

snakeModel.changePauseState()// 暂停或继续

break

default:

}

// 重新开始

if (keyCode == KeyEvent.VK_R || keyCode == KeyEvent.VK_S

|| keyCode == KeyEvent.VK_ENTER) {

snakeModel.running = false

begin()

}

}

// ----------------------------------------------------------------------

// keyReleased():空函数

// ----------------------------------------------------------------------

public void keyReleased(KeyEvent e) {

}

// ----------------------------------------------------------------------

// keyTyped():空函数

// ----------------------------------------------------------------------

public void keyTyped(KeyEvent e) {

}

// ----------------------------------------------------------------------

// repaint():绘制游戏界面(包括蛇和食物)

// ----------------------------------------------------------------------

void repaint() {

Graphics g = paintCanvas.getGraphics()

// draw background

g.setColor(Color.WHITE)

g.fillRect(0, 0, canvasWidth, canvasHeight)

// draw the snake

g.setColor(Color.BLACK)

LinkedList na = snakeModel.nodeArray

Iterator it = na.iterator()

while (it.hasNext()) {

Node n = (Node) it.next()

drawNode(g, n)

}

// draw the food

g.setColor(Color.RED)

Node n = snakeModel.food

drawNode(g, n)

updateScore()

}

// ----------------------------------------------------------------------

// drawNode():绘画某一结点(蛇身或食物)

// ----------------------------------------------------------------------

private void drawNode(Graphics g, Node n) {

g.fillRect(n.x * nodeWidth, n.y * nodeHeight, nodeWidth - 1,

nodeHeight - 1)

}

// ----------------------------------------------------------------------

// updateScore():改变计分牌

// ----------------------------------------------------------------------

public void updateScore() {

String s = "Score: " + snakeModel.score

labelScore.setText(s)

}

// ----------------------------------------------------------------------

// begin():游戏开始,放置贪吃蛇

你可以参考一下 每次遇到不会的都来求助是很不方便的

如果你想了解和学习更多的JAVA编程,成为一名真正的JAVA高手,你可以来这个裙,前面三个数是四二六 中间是三九六 后面是二八四

把这串数字连起来就可以了,这是一个高手的学习裙,在这里你可以学习到书上学不到的知识,还有大牛相互讨论并指导你解答哦!

// ----------------------------------------------------------------------

void begin() {

if (snakeModel == null || !snakeModel.running) {

snakeModel = new SnakeModel(this, canvasWidth / nodeWidth,

this.canvasHeight / nodeHeight)

(new Thread(snakeModel)).start()

}

}

// ----------------------------------------------------------------------

// main():主函数

// ----------------------------------------------------------------------

public static void main(String[] args) {

GreedSnake gs = new GreedSnake()

}

}

Node.java:

public class Node {

int x

int y

Node(int x, int y) {

this.x = x

this.y = y

}

}

SnakeModel.java:

import java.util.Arrays

import java.util.LinkedList

import java.util.Random

import javax.swing.JOptionPane

public class SnakeModel implements Runnable {

GreedSnake gs

boolean[][] matrix// 界面数据保存在数组里

LinkedList nodeArray = new LinkedList()

Node food

int maxX// 最大宽度

int maxY// 最大长度

int direction = 2// 方向

boolean running = false

int timeInterval = 200// 间隔时间(速度)

double speedChangeRate = 0.75// 速度改变程度

boolean paused = false// 游戏状态

int score = 0

int countMove = 0

// UP和DOWN是偶数,RIGHT和LEFT是奇数

public static final int UP = 2

public static final int DOWN = 4

public static final int LEFT = 1

public static final int RIGHT = 3

// ----------------------------------------------------------------------

// GreedModel():初始化界面

// ----------------------------------------------------------------------

public SnakeModel(GreedSnake gs, int maxX, int maxY) {

this.gs = gs

this.maxX = maxX

this.maxY = maxY

matrix = new boolean[maxX][]

for (int i = 0i <maxX++i) {

matrix[i] = new boolean[maxY]

Arrays.fill(matrix[i], false)// 没有蛇和食物的地区置false

}

// 初始化贪吃蛇

int initArrayLength = maxX >20 ? 10 : maxX / 2

for (int i = 0i <initArrayLength++i) {

int x = maxX / 2 + i

int y = maxY / 2

nodeArray.addLast(new Node(x, y))

matrix[x][y] = true// 蛇身处置true

}

food = createFood()

matrix[food.x][food.y] = true// 食物处置true

}

// ----------------------------------------------------------------------

// changeDirection():改变运动方向

// ----------------------------------------------------------------------

public void changeDirection(int newDirection) {

if (direction % 2 != newDirection % 2)// 避免冲突

{

direction = newDirection

}

}

// ----------------------------------------------------------------------

// moveOn():贪吃蛇运动函数

// ----------------------------------------------------------------------

public boolean moveOn() {

Node n = (Node) nodeArray.getFirst()

int x = n.x

int y = n.y

switch (direction) {

case UP:

y--

break

case DOWN:

y++

break

case LEFT:

x--

break

case RIGHT:

x++

break

}

if ((0 <= x &&x <maxX) &&(0 <= y &&y <maxY)) {

if (matrix[x][y])// 吃到食物或者撞到身体

{

if (x == food.x &&y == food.y)// 吃到食物

{

nodeArray.addFirst(food)// 在头部加上一结点

// 计分规则与移动长度和速度有关

int scoreGet = (10000 - 200 * countMove) / timeInterval

score += scoreGet >0 ? scoreGet : 10

countMove = 0

food = createFood()

matrix[food.x][food.y] = true

return true

} else

return false// 撞到身体

} else// 什么都没有碰到

{

nodeArray.addFirst(new Node(x, y))// 加上头部

matrix[x][y] = true

n = (Node) nodeArray.removeLast()// 去掉尾部

matrix[n.x][n.y] = false

countMove++

return true

}

}

return false// 越界(撞到墙壁)

}

// ----------------------------------------------------------------------

// run():贪吃蛇运动线程

// ----------------------------------------------------------------------

public void run() {

running = true

while (running) {

try {

Thread.sleep(timeInterval)

} catch (Exception e) {

break

}

if (!paused) {

if (moveOn())// 未结束

{

gs.repaint()

} else// 游戏结束

{

JOptionPane.showMessageDialog(null, "GAME OVER",

"Game Over", JOptionPane.INFORMATION_MESSAGE)

break

}

}

}

running = false

}

// ----------------------------------------------------------------------

// createFood():生成食物及放置地点

// ----------------------------------------------------------------------

private Node createFood() {

int x = 0

int y = 0

do {

Random r = new Random()

x = r.nextInt(maxX)

y = r.nextInt(maxY)

} while (matrix[x][y])

return new Node(x, y)

}

// ----------------------------------------------------------------------

// speedUp():加快蛇运动速度

// ----------------------------------------------------------------------

public void speedUp() {

timeInterval *= speedChangeRate

}

// ----------------------------------------------------------------------

// speedDown():放慢蛇运动速度

// ----------------------------------------------------------------------

public void speedDown() {

timeInterval /= speedChangeRate

}

// ----------------------------------------------------------------------

// changePauseState(): 改变游戏状态(暂停或继续)

// ----------------------------------------------------------------------

public void changePauseState() {

paused = !paused

}

}

满意请采纳

windows编程以事件驱动,鼠标点击会产生一个事件,而且在lParam会有坐标点,通过client坐标点的分割,就可以知道参数对应消消乐数组的哪一行哪一列,同样,第二次点击也可以知道。这样将对应的两个数组元素进行规则匹配,能否消除,消除种类得分等等,也可以实现你的交换位置功能。

pre{overflow-x: auto} 实现 消消乐的构成主要包括三部分:游戏主体、计分器、计时器,下面来看一下具体实现。

先来看一下游戏所需 Python 库。

import os import sys import time import pygame import random

定义一些常量,比如:窗口宽高、网格行列数等,代码如下:

WIDTH = 400 HEIGHT = 400 NUMGRID = 8 GRIDSIZE = 36 XMARGIN = (WIDTH - GRIDSIZE * NUMGRID) // 2 YMARGIN = (HEIGHT - GRIDSIZE * NUMGRID) // 2 ROOTDIR = os.getcwd() FPS = 30

接着创建一个主窗口,代码如下:

pygame.init() screen = pygame.display.set_mode((WIDTH, HEIGHT)) pygame.display.set_caption('消消乐')

看一下效果:

再接着在窗口中画一个 8 x 8 的网格,代码如下:

screen.fill((255, 255, 220)) # 游戏界面的网格绘制 def drawGrids(self): for x in range(NUMGRID):for y in range(NUMGRID): rect = pygame.Rect((XMARGIN+x*GRIDSIZE, YMARGIN+y*GRIDSIZE, GRIDSIZE, GRIDSIZE)) self.drawBlock(rect, color=(255, 165, 0), size=1 # 画矩形 block 框 def drawBlock(self, block, color=(255, 0, 0), size=2): pygame.draw.rect(self.screen, color, block, size)

看一下效果:

再接着在网格中随机放入各种拼图块,代码如下:

while True: self.all_gems = [] self.gems_group = pygame.sprite.Group() for x in range(NUMGRID):self.all_gems.append([])for y in range(NUMGRID): gem = Puzzle(img_path=random.choice(self.gem_imgs), size=(GRIDSIZE, GRIDSIZE), position=[XMARGIN+x*GRIDSIZE, YMARGIN+y*GRIDSIZE-NUMGRID*GRIDSIZE], downlen=NUMGRID*GRIDSIZE) self.all_gems[x].append(gem) self.gems_group.add(gem) if self.isMatch()[0] == 0:break

看一下效果:

再接着加入计分器和计时器,代码如下:

# 显示得分 def drawScore(self): score_render = self.font.render('分数:'+str(self.score), 1, (85, 65, 0)) rect = score_render.get_rect() rect.left, rect.top = (55, 15) self.screen.blit(score_render, rect) # 显示加分 def drawAddScore(self, add_score): score_render = self.font.render('+'+str(add_score), 1, (255, 100, 100)) rect = score_render.get_rect() rect.left, rect.top = (250, 250) self.screen.blit(score_render, rect) # 显示剩余时间 def showRemainingTime(self): remaining_time_render = self.font.render('倒计时: %ss' % str(self.remaining_time), 1, (85, 65, 0)) rect = remaining_time_render.get_rect() rect.left, rect.top = (WIDTH-190, 15) self.screen.blit(remaining_time_render, rect)

看一下效果:

当设置的游戏时间用尽时,我们可以生成一些提示信息,代码如下:

while True: for event in pygame.event.get():if event.type == pygame.QUIT: pygame.quit() sys.exit()if event.type == pygame.KEYUP and event.key == pygame.K_r: flag = True if flag:break screen.fill((255, 255, 220)) text0 = '最终得分: %s' % score text1 = '按 R 键重新开始' y = 140 for idx, text in enumerate([text0, text1]):text_render = font.render(text, 1, (85, 65, 0))rect = text_render.get_rect()if idx == 0: rect.left, rect.top = (100, y)elif idx == 1: rect.left, rect.top = (100, y)y += 60screen.blit(text_render, rect) pygame.display.update()

看一下效果:

说完了游戏图形化界面相关的部分,我们再看一下游戏的主要处理逻辑。

我们通过鼠标来 *** 纵拼图块,因此程序需要检查有无拼图块被选中,代码实现如下:

def checkSelected(self, position): for x in range(NUMGRID):for y in range(NUMGRID): if self.getGemByPos(x, y).rect.collidepoint(*position): return [x, y] return None

我们需要将鼠标连续选择的拼图块进行位置交换,代码实现如下:

def swapGem(self, gem1_pos, gem2_pos): margin = gem1_pos[0] - gem2_pos[0] + gem1_pos[1] - gem2_pos[1] if abs(margin) != 1:return False gem1 = self.getGemByPos(*gem1_pos) gem2 = self.getGemByPos(*gem2_pos) if gem1_pos[0] - gem2_pos[0] == 1:gem1.direction = 'left'gem2.direction = 'right' elif gem1_pos[0] - gem2_pos[0] == -1:gem2.direction = 'left'gem1.direction = 'right' elif gem1_pos[1] - gem2_pos[1] == 1:gem1.direction = 'up'gem2.direction = 'down' elif gem1_pos[1] - gem2_pos[1] == -1:gem2.direction = 'up'gem1.direction = 'down' gem1.target_x = gem2.rect.left gem1.target_y = gem2.rect.top gem1.fixed = False gem2.target_x = gem1.rect.left gem2.target_y = gem1.rect.top gem2.fixed = False self.all_gems[gem2_pos[0]][gem2_pos[1]] = gem1 self.all_gems[gem1_pos[0]][gem1_pos[1]] = gem2 return True

每一次交换拼图块时,我们需要判断是否有连续一样的三个及以上拼图块,代码实现如下:

def isMatch(self): for x in range(NUMGRID):for y in range(NUMGRID): if x + 2  -2: for each in [res_match[1], res_match[1]+1, res_match[1]+2]: gem = self.getGemByPos(*[each, start]) if start == res_match[2]: self.gems_group.remove(gem) self.all_gems[each][start] = None elif start >= 0: gem.target_y += GRIDSIZE gem.fixed = False gem.direction = 'down' self.all_gems[each][start+1] = gem else: gem = Puzzle(img_path=random.choice(self.gem_imgs), size=(GRIDSIZE, GRIDSIZE), position=[XMARGIN+each*GRIDSIZE, YMARGIN-GRIDSIZE], downlen=GRIDSIZE) self.gems_group.add(gem) self.all_gems[each][start+1] = gem start -= 1 elif res_match[0] == 2:start = res_match[2]while start > -4: if start == res_match[2]: for each in range(0, 3): gem = self.getGemByPos(*[res_match[1], start+each]) self.gems_group.remove(gem) self.all_gems[res_match[1]][start+each] = None elif start >= 0: gem = self.getGemByPos(*[res_match[1], start]) gem.target_y += GRIDSIZE * 3 gem.fixed = False gem.direction = 'down' self.all_gems[res_match[1]][start+3] = gem else: gem = Puzzle(img_path=random.choice(self.gem_imgs), size=(GRIDSIZE, GRIDSIZE), position=[XMARGIN+res_match[1]*GRIDSIZE, YMARGIN+start*GRIDSIZE], downlen=GRIDSIZE*3) self.gems_group.add(gem) self.all_gems[res_match[1]][start+3] = gem start -= 1

之后反复执行这个过程,直至耗尽游戏时间,游戏结束。

最后,我们动态看一下游戏效果。

总结

本文我们使用 Python 实现了一个简单的消消乐游戏,有兴趣的可以对游戏做进一步扩展,比如增加关卡等。

到此这篇关于Python实现消消乐小游戏的文章就介绍到这了,希望大家以后多多支持!


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/8157371.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-14
下一篇 2023-04-14

发表评论

登录后才能评论

评论列表(0条)

保存