本文给大家分享了作者整理的五个python游戏开发的案例,通过具体设计思路,代码等方面详细了解python游戏开发的过程,非常的详细,希望大家能够喜欢

一、序列应用——猜单词游戏

1. 游戏介绍

猜单词游戏就是计筧机随机产生一个单词,打乱字母顺序,供玩家去猜测。此游戏采用控制字符界面,

2.  程序设计思路

游戏中,可使用序列中的元组存储所有待猜测的单词。因为猜单词游戏需要随机产生某个待猜测单词以及随机数字,所以引入random模块随机数函数。其中,random.choice()可以从序列中随机选取元素。

在游戏中,随机挑出一个单词word后,把单词word的字母顺序打乱的方法是随机单词字符串中选择一个位置position,把position位置的字母加入乱序后的单词jumble,同时将原单词word中position位置的那个字母删去(通过连接position位置前字符串和其后字符串实现)。通过多次循环就可以产生乱序后的新单词jumble。

3.  random模块

random模块可以产生一个随机数或者从序列中获取一个随机元素。

4.  程序设计步骤

(1)在猜单词游戏程序中导入相关模块。

(2)创建所有待猜测的单词序列元组WORDS。

(3)显示游戏欢迎界面。

(4)实现游戏的逻辑。

首先,从序列中随机挑出一个单词,如“easy”;然后打乱这个单词的字母顺序;接着,通过多次循环就可以产生新的乱序后的单词jumble;最后,将乱序后的单词显示给玩家。

(5)玩家输入猜测单词,程序判断对错。若玩家猜错,则可以继续猜。

游戏截图:

参考代码:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

import random

WORDS=("python","jumble","easy","difficult","answer","continue","phone","position","game")

print("欢迎参加猜单词游戏,把字母组合成一个正确的单词")

iscontinue="y"

while iscontinue=="y" or iscontinue=="Y":

  word=random.choice(WORDS)

  correct=word

  jumble=""

  while word:

    position=random.randrange(len(word))

    jumble+=word[position]

    word=word[:position]+word[(position+1):]

  print("乱序后单词:",jumble)

  guess=input("\n请你猜:")

  while guess !=correct and guess !="":

    print("对不起不正确")

    guess=input("继续猜:")

  if guess==correct:

    print("真棒,你猜对了!\n")

  iscontinue = input("\n\n是否继续(Y/N):")

二、面向对象设计应用——发牌游戏

1.  游戏介绍

四名牌手打牌,电脑随机將52张牌(不合大、小王)发给四名牌手,并在屏幕上显示每位牌手的牌。

2.  面向对象程序设计

3.  程序设计步骤

设计类,发牌程序设计出三个类: Card类、Hand类和Poke类。

Card类:Card类代表一张牌,其中,FaceNum字段指的是牌面数字1~13,Suit字段指的是花色,”梅”为梅花,”方”为方块,”红”为红桃,”黑”为黑桃。

Hand类:Hand类代表手牌(一个玩家手里拿的牌),可以认为是一位牌手手里的牌,其中,cards列表变量存储牌手手中的牌。可以增加牌、清空手里的牌、把一张牌给别的牌手等操作。

Poke类:Poke类代表一副牌,我们可以将一副牌看作是有52张牌的牌手,所以继承Hand类。由于其中cards列表变量要存储52张牌,而且要进行发牌、洗牌操作,所以增加如下的方法。

主程序:主程序比较简单,因为有四个牌手,所以生成players列表存储初始化的四位牌手。生成一副牌的对象实例poke1,调用populate()方法生成有52张牌的一副牌,调用huffle()方法洗牌打乱顺序,调用deal(players,13)方法分别给每位玩家发13张牌,最后示四位牌手所有的牌。

游戏截图:

参考代码:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

class Card():

  """ A playing card. """

  RANKS=["A","2","3","4","5","6","7","8","9","10","J","Q","K"] #牌面数字1-13

  SUITS=["梅","方","红","黑"]

#梅为梅花,方为方钻,红为红心,黑为黑桃

  def __init__(self,rank,suit,face_up=True):

    self.rank=rank       #指的是牌面数字1-13

    self.suit=suit       #suit指的是花色

    self.is_face_up=face_up  #是否显示牌正面,True为正面,False为牌背面

  def __str__(self): #print()

    if self.is_face_up:

      rep=self.suit+self.rank #+" "+str(self.pic_order())

    else:

      rep="XX"

    return rep

  def flip(self):        #翻牌方法

    self.is_face_up=not self.is_face_up

  def pic_order(self):      #牌的顺序号

    if self.rank=="A":

      FaceNum=1

    elif self.rank=="J":

      FaceNum=11

    elif self.rank=="Q":

      FaceNum=12

    elif self.rank=="K":

      FaceNum=13

    else:

      FaceNum=int(self.rank)

    if self.suit=="梅":

      Suit=1

    elif self.suit=="方":

      Suit=2

    elif self.suit=="红":

      Suit=3

    else:

      Suit=4

    return (Suit-1)*13+FaceNum

class Hand( ):

  """ A hand of playing cards. """

  def __init__(self):

    self.cards=[]

  def __str__(self):

    if self.cards:

      rep=""

      for card in self.cards:

        rep+=str(card)+"\t"

    else:

      rep="无牌"

    return rep

  def clear(self):

    self.cards=[]

  def add(self,card):

    self.cards.append(card)

  def give(self,card,other_hand):

    self.cards.remove(card)

    other_hand.add(card)

class Poke(Hand):

  """ A deck of playing cards. """

  def populate(self):     #生成一副牌

    for suit in Card.SUITS:

      for rank in Card.RANKS:

        self.add(Card(rank,suit))

  def shuffle(self):      #洗牌

    import random

    random.shuffle(self.cards) #打乱牌的顺序

  def deal(self,hands,per_hand=13):

    for rounds in range(per_hand):

      for hand in hands:

        top_card=self.cards[0]

        self.cards.remove(top_card)

        hand.add(top_card)

if __name__=="__main__":

  print("This is a module with classed for playing cards.")

  #四个玩家

  players=[Hand(),Hand(),Hand(),Hand()]

  poke1=Poke()

  poke1.populate()      #生成一副牌

  poke1.shuffle()       #洗牌

  poke1.deal(players,13)   #发给玩家每人13张

  #显示四位牌手的牌

  n=1

  for hand in players:

    print("牌手",n,end=":")

    print(hand)

    n=n+1

  input("\nPress the enter key to exit.")

三、图形界面设计——猜数字游戏

1游戏介绍

在游戏中,程序随机生成1024以内的数字,再让玩家去猜,如果猜的数字过大过小都会进行提示,程序还会统计玩家猜的次数。使用Tkinter开发猜数字游戏

2.  python图形界面设计

Python提供了多个图形开发界面的库

3.  程序设计步骤

在猜数字游戏程序中导入相关模块:

random.randint(0,1024)随机产生玩家要猜的数字。

猜按钮事件函数从单行文本框entry_a获取猜的数字并转换成数字val a,然后判断是否正确,并根据要猜的数字number判断数字是过大还是过小。

HumGuess()函数修改提示标签文字来显示猜的次数。

关闭按钮事件函数实现窗体关闭。

游戏截图:

参考代码:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

import tkinter as tk

import sys

import random

import re

number=random.randint(0,1024)

running=True

num=0

nmaxn=1024

nmin=0

def eBtnClose(event):

  root.destroy()

def eBtnGuess(event):

  global nmaxn

  global nmin

  global num

  global running

  if running:

    val_a=int(entry_a.get())

    if val_a==number:

      labelqval("恭喜答对了!")

      num+=1

      running=False

      numGuess()

    elif val_a<number:

      if val_a>nmin:

        nmin=val_a

        num+=1

        label_tip_min.config(label_tip_min,text=nmin)

      labelqval("小了哦")

    else:

      if val_a <nmaxn:

        nmaxn = val_a

        num += 1

        label_tip_max.config(label_tip_max, text=nmaxn)

      labelqval("大了哦")

  else:

    labelqval("你已经答对了")

def numGuess():

  if num==1:

    labelqval("你已经答对了!")

  elif num<10:

    labelqval("==十次以内就答对了。。。尝试次数:"+str(num))

  elif num<50:

    labelqval("还行哦尝试次数:"+str(num))

  else:

    labelqval("好吧。。。你都超过50次了。。。尝试次数:"+str(num))

def labelqval(vText):

  label_val_q.config(label_val_q,text=vText)

root=tk.Tk(className="猜数字游戏")

root.geometry("400x90+200+200")

line_a_tip=tk.Frame(root)

label_tip_max=tk.Label(line_a_tip,text=nmaxn)

label_tip_min=tk.Label(line_a_tip,text=nmin)

label_tip_max.pack(side="top",fill="x")

label_tip_min.pack(side="bottom",fill="y")

line_a_tip.pack(side="left",fill="y")

line_question=tk.Frame(root)

label_val_q=tk.Label(line_question,width="80")

label_val_q.pack(side="left")

line_question.pack(side="top",fill="x")

line_input=tk.Frame(root)

entry_a=tk.Entry(line_input,width="40")

btnguess=tk.Button(line_input,text="猜")

entry_a.pack(side="left")

entry_a.bind('<Return>',eBtnGuess)

btnguess.bind('<Button-1>',eBtnGuess)

btnguess.pack(side="left")

line_input.pack(side="top",fill="x")

line_btn=tk.Frame(root)

btnClose=tk.Button(line_btn,text="关闭")

btnClose.bind('<Button-1>',eBtnClose)

btnClose.pack(side="left")

line_btn.pack(side="top")

labelqval("请输入0-1024之间任意整数:")

entry_a.focus_set()

print(number)

root.mainloop()

四、Tkinter图形绘制——图形版发牌程序

1. 游戏介绍

机随机将52张牌(不含大王和小王)发给四位牌手,在屏幕上显示每位牌手的牌,程序的运行效果如图5-1所示。接下来,我们以使用Canvas绘制Tkinter模块图形为例,介绍建立简单GUI(图形用户界面)游戏界面的方法。

2.  程序设计思路

将要发的52张牌,按梅花0~12,方块13- 25,红桃26- 38,黑桃39- 51的顺序编号并存储在pocker列表c未洗牌之前l,列表元素存储的是某张牌c实际上是牌的编号)。同时,按此编号将扑克牌图片顺序存储在imgs列表中。也就是说,imgs[0]存储梅花A的图片,imgs[1]存储梅花2的图片,imgs[14]存储方块2的图片,依次类推。

发牌后,根据每位牌手(pl,p2,p3,p4)各自牌的编号列表,从imgs获取对应牌的图片,并使用create- image《x坐标,y坐标),image=图像文件)将牌显示在指定位置。

游戏截图:

参考代码:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

from tkinter import *

import random

n=52

def gen_pocker(n):

  x=100

  while(x>0):

    x=x-1

    p1=random.randint(0,n-1)

    p2=random.randint(0,n-1)

    t=pocker[p1]

    pocker[p1]=pocker[p2]

    pocker[p2]=t

  return pocker

pocker=[i for i in range(n)]

pocker=gen_pocker(n)

print(pocker)

(player1,player2,player3,player4)=([],[],[],[])

(p1,p2,p3,p4)=([],[],[],[])

root=Tk()

#创建一个Canvas,设置其背景为白色

cv=Canvas(root,bg='white',width=700,height=600)

imgs=[]

for i in range(1,5):

  for j in range(1,14):

    imgs.insert((i-1)*13+(j-1),PhotoImage(file='D:/images\\'+str(i)+'-'+str(j)

    +'.gif'))

for x in range(13):

  m=x*4

  p1.append(pocker[m])

  p2.append(pocker[m+1])

  p3.append(pocker[m+2])

  p4.append(pocker[m+3])

p1.sort()

p2.sort()

p3.sort()

p4.sort()

for x in range(0,13):

  img=imgs[p1[x]]

  player1.append(cv.create_image((200+20*x,80),image=img))

  img=imgs[p2[x]]

  player2.append(cv.create_image((100,150+20*x),image=img))

  img=imgs[p3[x]]

  player3.append(cv.create_image((200+20*x,500),image=img))

  img=imgs[p4[x]]

  player1.append(cv.create_image((560,150+20*x),image=img))

print("player1:",player1)

print("player2:",player2)

print("player3:",player3)

print("player4:",player4)

cv.pack()

root.mainloop()

五、Python图像处理——人物拼图游戏

1.  游戏介绍

拼图游戏将一幅图片分割咸若干拼块并将它们随机打乱顺序,当将所有拼块都放回原位置时,就完成了拼图(游戏结束)。本人物拼图游戏为3行3列,拼块以随机顺序排列,玩家用鼠标单击空白块四周的交换它们位置,直到所有拼块都回到原位置。拼图游戏运行界面

2.  程序设计思路

游戏程序首先将图片分割成相应3行3列的拼块,并按顺序编号。动态地生成一个\为3x3的列表board,用于存放数字0一8,其中,每个数字代表一个拼块,8号拼块不显示。

游戏开始时,随机打乱这个数组board,如board[0l[0]是5号拼块,则在左上角显示编号是5的拼块。根据玩家用鼠标单击的拼块和空白块所在位置,来交换该board数组对应的元素,最后通过元素排列顺序来判断是否已经完成游戏。

3.   程序设计步骤

Python处理图片切割

使用PIL中的crop()方法可以从一幅图像中裁剪指定区域。该区域使用四元组来指定,四元组的坐标依次是(左、上、右、下)。PIL中指定坐标系的左上角坐标为(0,0).

在本游戏中,需要把图片分割为3列图片块,在上面的基础上再指定不同的区域即可进行裁剪、保存。为了方便使用,可编写splitimage(src,rownum,colnum,dstpath)函数,实现将指定的src图片文件分隔成rownumxcolnum数量的小图片块。

4.  游戏逻辑的实现

(1)加载图片

(2)图像块(拼块)类

每个图像块(拼块)都是Square对象,具有draw功能,因此,可将本拼块图片绘制到Canvas上。orderID属性是每个图像块(拼块)对应的编号。

(3)初始化游戏

random.shuffle(board)只能按行打乱二维列表,所以使用一维列表来实现打乱图像块的功能,再根据编号生成对应的图像块(拼块)到board列表中。

(4)绘制游戏界面的各个元素

游戏界面中还存在着各个元素,如黑框等,

(5)鼠标事件

将单击位置换算成拼图板上的棋盘坐标,如果单击空位置,则所有图像块都不移动;否则依次检查被单击的当前图像块的上、下、左、右是否有空位置,如果有,就移动当前图像块。

(6)判断输赢

判断拼块的编号是否有序,如果不是有序的,则返回False。

(7)重置游戏

(8)“重新开始”按钮的单击事件

游戏截图:

参考代码:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

from tkinter import*

from tkinter.messagebox import *

import random

root=Tk('拼图游戏')

root.title('拼图')

Pics=[]

for i in range(9):

  filename="\\"+str(i)+".gif"

  Pics.append(PhotoImage(file=filename))

WIDTH=400

HEIGHT=315

IMAGE_WIDTH=WIDTH//3

IMAGE_HEIGHT=HEIGHT//3

ROWS=3

COLS=3

steps=0

board=[[0,1,2],[3,4,5],[6,7,8]]

class Square:

  def __init__(self,orderID):

    self.orderID=orderID

  def draw(self,canvas,board_pos):

    img=Pics[self.orderID]

    canvas.create_image(board_pos,image=img)

def init_board():

  L=list(range(8))

  L.append(None)

  random.shuffle(L)

  for i in range(ROWS):

    for j in range(COLS):

      idx=i*ROWS+j

      orderID=L[idx]

      if orderID is None:

        board[i][j]=None

      else:

        board[i][j]=Square(orderID)

def play_game():

  global steps

  steps=0

  init_board()

def drawBoard(canvas):

  canvas.create_polygon((0,0,WIDTH,0,WIDTH,HEIGHT,0,HEIGHT),width=1,outline='Black',fill='pink')

  for i in range(ROWS):

    for j in range(COLS):

      if board[i][j] is not None:

        board[i][j].draw(canvas,(IMAGE_WIDTH*(j+0.5),IMAGE_HEIGHT*(i+0.5)))

def mouseclick(pos):

  global steps

  r=int(pos.y//IMAGE_HEIGHT)

  c=int(pos.x//IMAGE_WIDTH)

  print(r,c)

  if r<3 and c<3:

    if board[r][c] is None:

      return

    else:

      current_square=board[r][c]

      if r-1>=0 and board[r-1][c] is None:

        board[r][c]=None

        board[r - 1][c]=current_square

        steps+=1

      elif c+1<=2 and board[r][c+1] is None:

        board[r][c]=None

        board[r][c+1]=current_square

        steps+=1

      elif r+1<=2 and board[r+1][c] is None:

        board[r][c]=None

        board[r+1][c]=current_square

        steps+=1

      elif c-1>=0 and board[r][c-1] is None:

        board[r][c]=None

        board[r][c-1]=current_square

        steps+=1

      label1["text"]=str(steps)

      cv.delete('all')

      drawBoard(cv)

    if win():

      showinfo(title="恭喜",message="拼图完成")

def win():

  for i in range(ROWS):

    for j in range(COLS):

      if board[i][j] is not None and board[i][j].orderID!=i*ROWS+j:

        return False

  return True

def callBack2():

  print("重新开始")

  play_game()

  cv.delete('all')

  drawBoard(cv)

cv=Canvas(root,bg='white',width=WIDTH,height=HEIGHT)

b1=Button(root,text="重新开始",command=callBack2,width=20)

label1=Label(root,text="0",fg="red",width=20)

label1.pack()

cv.bind("<Button-1>",mouseclick)

cv.pack()

b1.pack()

play_game()

drawBoard(cv)

root.mainloop()

来源:https://www.jb51.net/article/182211.htm

python游戏开发的五个案例分享相关推荐

  1. python游戏开发引擎_你的游戏开发第0课

    电子游戏是许多人喜爱甚至沉迷的事情.尤其对于程序员来说,开发游戏是不少人最初学习编程的动力.在之前,我发过一些游戏开发的教程和案例: 爆款游戏<贪吃蛇大作战>的 Python 实现 如何用 ...

  2. 师傅带徒弟学:Python游戏开发引擎cocos2d-python-关东升-专题视频课程

    师傅带徒弟学:Python游戏开发引擎cocos2d-python-299人已学习 课程介绍         Python语言之所以受欢迎,很大的原因是有很多可以使用的库,Python社区也有很多游戏 ...

  3. 32岁学python有前途吗_Python发展前景如何?学习Python游戏开发有前途吗?

    Python发展前景如何?学习Python游戏开发有前途吗? 时间:2018-04-02 15:48:31 | 来源:千锋教育 | 作者:alents 学习Python的人都知道一句话:人生苦短,我用 ...

  4. 适合python游戏开发的库你知道几个?

    python游戏开发的库 01 PyGame 官网: https://www.pygame.org/docs/ 概述: Pygame 是一组专为编写视频游戏而设计的 Python 模块. 它在优秀的 ...

  5. Python游戏开发

    Python游戏开发 目录 Python游戏开发 前言 画图库 导包画图 起别名 坐标 抬笔与落笔 画笔大小 设置背景颜色 小案例 前进 注意代码的优雅 变量 数据类型 type 字符串 三引号 双引 ...

  6. 小学生python游戏开发pygame5--title地图调用

    小学生python游戏开发pygame5--title地图调用 前言 文件夹目录 pytmx模块安装 实现效果 代码实现 前言 文件夹目录 pytmx模块安装 实现效果 代码实现 import log ...

  7. python 游戏开发_Python游戏开发入门

    spContent=--玩游戏的最高境界是什么? --当然是设计一款属于自己的游戏! --设计游戏不是目的,从游戏看道理,从道理看人生,人生何尝不是属于自己的游戏? --"弹指之间·享受创新 ...

  8. python游戏开发的第三方库有哪些_Python 游戏开发方向的第三方库是

    Python 游戏开发方向的第三方库是 答:Pygame 内分泌器官包括( ) 答:甲状腺 松果体 甲状旁腺 垂体 我国的社会保险制度体系主要包括.医疗保险.失业保险.工伤保险.生育保险等内容 答:养 ...

  9. 小学生python游戏开发pygame--初始及基础知识

    #1024程序员节|用代码,改变世界# 小学生python游戏开发pygame1--基础知识 前言 知识点 1.python知识点 1.1 RGB 颜色表示 1.2 类 2.3 pygame.disp ...

最新文章

  1. 无法启动MySQL数据库
  2. vc mysql utf8_C/C++ 连接 MySQL (VC 版)
  3. GPRS模块AT呼叫控制命令
  4. C++中log的底数理解
  5. 哈希表及处理冲突的方法
  6. 【Pix4d精品教程】安装Pix4Dmapper时提示“无法启动此程序,因为计算机中丢失api-ms-win-crt-runtime-l1-1-0.dll”完全解决办法
  7. AD13转oRCAD原理图的操作方式
  8. 飞凌小课堂-OK3399-C linux双千兆网口方案-RTL8153
  9. sap 服务器文件 暴露pdf地址,访问地址预览
  10. 【杂项】vmware fusion 流畅度设置
  11. Latex algorithm Input Output
  12. SAS 方差分析(复习4)
  13. 作为开发者你必须要知道的五大浏览器,记得收藏
  14. php微信生成微信公众号二维码扫描进入公众号带参数
  15. jni调用出现SIGABRT崩溃
  16. 2020找工作更难了?做好这4方面,找到高薪好工作
  17. 卡卡又一次双手举天,巴西涉险过关,克罗地亚虽败尤荣.
  18. Debian 下的五笔输入法 Rime
  19. pli测试50题题库_AI面试必备/深度学习100问1-50题答案解析
  20. 项目管理中的成本计算

热门文章

  1. c++二叉树编程实践
  2. php prism,漂亮的代码语法高亮库:Prism.js
  3. pandas.DataFrame.iloc的使用
  4. 关于计算机专业的作文800字,我的电脑作文800字范文
  5. 13.2.虚拟化工具--jstat
  6. 表的插入、更新、删除、合并操作_5_通过其它表插入
  7. JAVA里面main找不到符号_java – 带有NBAndroid的NetBeans – 找不到符号setContentView(R.layout.main);...
  8. Linux怎么查看设置系统语言包
  9. SQLI_LAB——Less7~15
  10. 万国数据联合阿里云发布混合云系列产品 助力企业落地云端