Maison >développement back-end >Tutoriel Python >Écrire un mini-jeu 2048 sans interface en Python
Quand le jeu 2048 est devenu populaire, il m'est arrivé d'en écrire un dans une autre langue. Maintenant, j'apprends le python, et je viens de m'en souvenir, alors j'ai décidé d'écrire un 2048 en python puisque je n'ai jamais appris la programmation d'interface. python, j'ai écrit un no interface 2048 extrêmement simple. Le principe et la mise en œuvre du jeu 2048 ne sont pas difficiles. Il peut être utilisé pour s'entraîner. Si vous ne connaissez pas ce jeu, vous pouvez le consulter en ligne ou le télécharger sur votre téléphone portable pour y jouer. principe. Je sais que si vous ne mettez pas de photo, personne ne sera intéressé. Mettons d’abord une photo du jeu, puis nous expliquerons comment le mettre en œuvre étape par étape en utilisant les connaissances les plus élémentaires.
1. Générer une matrice 4*4
La première partie du jeu La première étape consiste à générer une matrice 4*4 comme interface principale de notre jeu. En fait, c'est relativement simple à dire. La méthode la plus primitive est utilisée ici, qui consiste à l'imprimer directement en utilisant
imprimer. Nous devons d'abord générer une liste bidimensionnelle 4*4 de tous les zéros, puis utiliser des caractères comme '┌ ├└,┤,┘┐│,─,┬,┴' pour former notre bordure. Implémentation du codematix=[[ for i in range()] for i in range()] # 用列表推导式初始化生成一个*的列表,列表元素全为 # notzero函数的作用:游戏界面上非零的时候才显示,当为的时候,让其显示空, def notzero(s): return s if s!= else '' # 非零的话返回本身,否则返回 '' def display(): # 显示界面函数,用┌ ├└,┤,┘┐│,─,┬,┴ 等显示边框,中间显示*矩阵里的的元素 print("\r\ ┌──┬──┬──┬──┐\n\ │%s│%s│%s│%s│\n\ ├──┬──┬──┬──┤\n\ │%s│%s│%s│%s│\n\ ├──┬──┬──┬──┤\n\ │%s│%s│%s│%s│\n\ ├──┬──┬──┬──┤\n\ │%s│%s│%s│%s│\n\ └──┴──┴──┴──┘"\ %(notzero(matix[][]),notzero(matix[][]),notzero(matix[][]),notzero(matix[][]),\ notzero(matix[][]),notzero(matix[][]),notzero(matix[][]),notzero(matix[][]),\ notzero(matix[][]),notzero(matix[][]),notzero(matix[][]),notzero(matix[][]), \ notzero(matix[][]),notzero(matix[][]),notzero(matix[][]),notzero(matix[][]),) ) display()Jetez un œil à l'effet du code ci-dessus Pensez-vous que le cadre d'un jeu a été. mis en place ?En raison de l'initialisation When , les éléments de la matrice sont tous nuls et l'image ci-dessous ne montre pas 0. N'est-ce pas très simple ? Nous avons mis en place une interface de jeu, mais après tout, nous n'avons jamais appris l'interface, alors ne vous plaignez pas de cette interface.
générera aléatoirement deux nombres aléatoires 2 ou 4 dans la matrice ci-dessus. Alors, comment générer un nombre aléatoire 2 ou 4 à une position aléatoire dans la matrice ci-dessus ? appris avant Le module random et pmod(), voyons comment utiliser le module random pour implémenter une fonction.
Jetons un coup d'œil à l'effet du code ci-dessus. Avez-vous généré deux nombres à deux positions aléatoires si vous avez Si ? vous l'essayez au fil du temps, vous pouvez voir qu'à chaque fois qu'il est exécuté, la position sur la matrice est différente, et le nombre d'occurrences est également différent à chaque fois Parce que j'ai défini la probabilité de 2:4 à 9:1. , c'est ce qui apparaît la plupart du temps 2. C'est aussi la nécessité du jeu. À ce stade, la matrice peut déjà être déplacée et les fonctions du jeu peuvent être considérées comme à moitié terminées.
def init(): # 初始化矩阵 initNumFlag = while : k = if random.randrange(, ) > else # 当生成随机数大于的时候k=否则k= 生成和的概率为: s = pmod(random.randrange(, ), ) # 生成矩阵初始化的下标 比如pmod(,)的话,s为(,)正好可以作为矩阵下标 if matix[s[]][s[]] == : # 只有当其值不为的时候才赋值,避免第二个值重复 matix[s[]][s[]] = k initNumFlag += if initNumFlag == : # 当initNumFlag== 的话表示矩阵里两个随机数都已经生成了,退出循环 break init() display( )3. Mise en place de la partie logique du jeu
Ce qui précède est un morceau de pseudo-code pour. Compréhension. Voyons comment implémenter la fonction de traitement des mouvements. Voici le code le plus courant dans tout le jeu. La partie difficile à gérer, une fois cette partie terminée, le jeu entier sera essentiellement réalisé. la fonction de traitement du mouvement vers le bas à titre d'exemple. Tout le reste est le même. Lorsque l'entrée de l'utilisateur se déplace vers le bas, tous les nombres seront déplacés vers le bas. Si vous rencontrez le même numéro et souhaitez fusionner, le carré avec le numéro se déplace vers le carré. sans le numéro. Cela doit être implémenté avec une boucle. Il y a 4 colonnes, donc la boucle la plus externe a 4 fois, et chaque colonne doit être bouclée. Voyons comment l'implémenter,
<.>
写完了向下移动的处理函数,那么向其他方向的移动函数也一样,照着写,就可以,到这里游戏中最难的部分就完成,可以说胜利就在眼前了,好了在这之前,我们还需要处理一下其他问题,那就是每次移动后都要检查,游戏是不是Game Over了,还有就是定义一个变量来纪录分数了,这些实现起来都比较简单。
四、游戏纪录分数和检查游戏是否结束
游戏结束的标志是矩阵中所有的数都不为0,而且所有相邻的数都不能合并,根据这个我们就可以来写一个函数来判断游戏是否GG,至于分数纪录,我们只需定义一个变量,然后每次有何并的时候,就加上一定的分数即可。下面我们来看检查函数的实现。
def check(): for i in range(4): #按每一排循环4 次 for j in range(3): # 如果矩阵中有0存在,或者有相邻的数就表示游戏还可以继续经行,否则就是GG if matix[i][j] == 0 or matix[i][j] == matix[i][j + 1] or matix[j][i] == matix[j + 1][i]: return True else: return False
五、完整游戏源码
完成了上面的部分,整个游戏的过程就实现了,下面附上整个游戏的源码。游戏还有很多不够完善的地方,比如说游戏中如果出现2048的话,就表示玩家胜利,游戏结束,但是我这里没有做处理,所以这个游戏可以一直玩到4096....没有结束,除非你游戏中GG了,要处理也很简单,还可以将矩阵存在文件中,完成一个游戏存档的功能。有兴趣的话大家去实现一下。
import random score = 0 # 纪录游戏的分数 matix = [[0 for i in range(4)] for i in range(4)] # 初始化生成一个4*4的列表 def notzero(s): return s if s != 0 else '' def display(): print("\r\ ┌──┬──┬──┬──┐\n\ │%4s│%4s│%4s│%4s│\n\ ├──┬──┬──┬──┤\n\ │%4s│%4s│%4s│%4s│\n\ ├──┬──┬──┬──┤\n\ │%4s│%4s│%4s│%4s│\n\ ├──┬──┬──┬──┤\n\ │%4s│%4s│%4s│%4s│\n\ └──┴──┴──┴──┘" \ % (notzero(matix[0][0]), notzero(matix[0][1]), notzero(matix[0][2]), notzero(matix[0][3]), \ notzero(matix[1][0]), notzero(matix[1][1]), notzero(matix[1][2]), notzero(matix[1][3]), \ notzero(matix[2][0]), notzero(matix[2][1]), notzero(matix[2][2]), notzero(matix[2][3]), \ notzero(matix[3][0]), notzero(matix[3][1]), notzero(matix[3][2]), notzero(matix[3][3]),) ) def init(): # 初始化矩阵 initNumFlag = 0 while 1: k = 2 if random.randrange(0, 10) > 1 else 4 # 随机生成 2 或 4 s = pmod(random.randrange(0, 16), 4) # 生成矩阵初始化的下标 if matix[s[0]][s[1]] == 0: # 只有当其值不为0的时候才赋值,避免第二个值重复 matix[s[0]][s[1]] = k initNumFlag += 1 if initNumFlag == 2: break display() def addRandomNum(): #处理完移动后添加一个新的随机数 while 1: k = 2 if random.randrange(0, 10) > 1 else 4 s = pmod(random.randrange(0, 16), 4) if matix[s[0]][s[1]] == 0: matix[s[0]][s[1]] = k break display() def check(): #检查游戏是否GG for i in range(4): for j in range(3): if matix[i][j] == 0 or matix[i][j] == matix[i][j + 1] or matix[j][i] == matix[j + 1][i]: return True else: return False def moveRight(): # 向右移动处理函数 global score for i in range(4): for j in range(3, 0, -1): for k in range(j - 1, -1, -1): if matix[i][k] > 0: if matix[i][j] == 0: matix[i][j] = matix[i][k] matix[i][k] = 0 elif matix[i][j] == matix[i][k]: matix[i][j] *= 2 score += matix[i][j] #将当前数作为score加上 matix[i][k] = 0 break addRandomNum() def moveUp(): global score for i in range(4): for j in range(3): for k in range(j + 1, 4): if matix[k][i] > 0: if matix[j][i] == 0: matix[j][i] = matix[k][i] matix[k][i] = 0 elif matix[k][i] == matix[j][i]: matix[j][i] *= 2 score += matix[j][i] matix[k][i] = 0 break addRandomNum() def moveDown(): global score for i in range(4): for j in range(3, 0, -1): for k in range(j - 1, -1, -1): if matix[k][i] > 0: if matix[j][i] == 0: matix[j][i] = matix[k][i] matix[k][i] = 0 elif matix[j][i] == matix[k][i]: matix[j][i] *= 2 score += matix[j][i] matix[k][i] = 0 break addRandomNum() def moveLeft(): global score for i in range(4): for j in range(3): for k in range(1 + j, 4): if matix[i][k] > 0: if matix[i][j] == 0: matix[i][j] = matix[i][k] matix[i][k] = 0 elif matix[i][j] == matix[i][k]: matix[i][j] *= 2 score += matix[i][j] matix[i][k] = 0 break addRandomNum() def main(): print(" \033[33;1mWelcome to the Game of 2048!\033[0m") flag = True init() while flag: #循环的标志 print(' \033[33;1m You Score:%s\033[0m' % (score)) d = input('\033[33;1m (↑:w) (↓:s) (←:a) (→:d),q(uit) :\033[0m') #不断处理用户输入 if d == 'a': moveLeft() if not check(): #检查游戏是否GG print('GG') flag = False #GG的话直接退出 elif d == 's': moveDown() if not check(): print('GG') flag = False elif d == 'w': moveUp() if not check(): print('GG') flag = False elif d == 'd': moveRight() if not check(): print('GG') flag = False elif d == 'q': # 退出 break else: # 对用户的其他输入不做处理 pass if __name__ == '__main__': main()
最后在附上一张图片最为结束
以上所述是小编给大家介绍的用Écrire un mini-jeu 2048 sans interface en Python,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对PHP中文网的支持!
更多Écrire un mini-jeu 2048 sans interface en Python相关文章请关注PHP中文网!