鱼C论坛

 找回密码
 立即注册
查看: 7227|回复: 19

[作品展示] python 简易贪吃蛇

[复制链接]
发表于 2020-12-18 20:17:54 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 Cool_Breeze 于 2020-12-21 08:36 编辑
  1. # coding=utf-8
  2. # author Cool_Breeze

  3. import ctypes
  4. import msvcrt
  5. from time import sleep
  6. from os import system
  7. from random import randrange


  8. # 位置信息结构体
  9. class point(ctypes.Structure):
  10.     _fields_ = [('x', ctypes.c_short),
  11.                 ('y', ctypes.c_short)]

  12. def gotoXYPrint(coord, char):
  13.     global MAINHANDLE
  14.     global HEADICON
  15.     global FOODICON
  16.     ctypes.windll.kernel32.SetConsoleCursorPosition(
  17.         MAINHANDLE, coord)
  18.     if char == HEADICON:
  19.         ctypes.windll.kernel32.SetConsoleTextAttribute(
  20.         MAINHANDLE, 14)
  21.     elif char == FOODICON:
  22.         ctypes.windll.kernel32.SetConsoleTextAttribute(
  23.         MAINHANDLE, 12)
  24.     else:
  25.         ctypes.windll.kernel32.SetConsoleTextAttribute(
  26.         MAINHANDLE, 11)
  27.     print(char, end='', flush=True)


  28. # 边框
  29. def side():
  30.     for n in range(WIDTH-1):
  31.         gotoXYPrint(point(n,0), '+')
  32.         gotoXYPrint(point(n,HIGHT-1), '+')
  33.     for n in range(HIGHT-1):
  34.         gotoXYPrint(point(0,n), '+')
  35.         gotoXYPrint(point(WIDTH-1,n), '+')

  36. def createFood():
  37.     global SNAKE
  38.     global FOODPOINT
  39.     off = False
  40.     while True:
  41.         x = randrange(1, WIDTH-1)
  42.         y = randrange(1, HIGHT-1)
  43.         for n in SNAKE:
  44.             if n.x == x and n.y == y:
  45.                 continue
  46.             else:
  47.                 FOODPOINT.x = x
  48.                 FOODPOINT.y = y
  49.                 gotoXYPrint(FOODPOINT, FOODICON)
  50.                 off = True
  51.         if off: break

  52. def createSnake():
  53.     global SNAKE
  54.     x, y = WIDTH//2, HIGHT//2
  55.     for n in range(3):
  56.         t = point(x+n, y)
  57.         SNAKE.append(t)
  58.         gotoXYPrint(t, HEADICON)

  59. def update():
  60.     for i in SNAKE:
  61.         gotoXYPrint(i, HEADICON)

  62. def _exit(info):
  63.     input(info)
  64.     exit()
  65.    
  66. def collision():
  67.     global SNAKE
  68.     head = SNAKE[0]
  69.     count = 0
  70.     for n in SNAKE:
  71.         count += 1
  72.         if count == 1: continue
  73.         if n.x == head.x and n.y == head.y:
  74.             _exit('游戏结束!')
  75.             
  76.     if head.x == 0 or head.y == 0 or \
  77.        head.x == WIDTH-1 or head.y == HIGHT-1:
  78.        _exit('游戏结束!')

  79. def moveSnake():
  80.     '''
  81.     K == ←
  82.     M == →
  83.     H == ↑
  84.     P == ↓
  85.     '''
  86.     global DIRECTION
  87.     global SNAKE
  88.     global FOODPOINT
  89.    
  90.     if DIRECTION == 'K':
  91.         SNAKE.insert(0, point(SNAKE[0].x-1, SNAKE[0].y))
  92.     elif DIRECTION == 'M':
  93.         SNAKE.insert(0, point(SNAKE[0].x+1, SNAKE[0].y))
  94.     elif DIRECTION == 'H':
  95.         SNAKE.insert(0, point(SNAKE[0].x, SNAKE[0].y-1))
  96.     elif DIRECTION == 'P':
  97.         SNAKE.insert(0, point(SNAKE[0].x, SNAKE[0].y+1))
  98.     # 其他按键不做任何动作
  99.     else: return None
  100.     collision()
  101.     # 是否吃到食物
  102.     if SNAKE[0].x != FOODPOINT.x or SNAKE[0].y != FOODPOINT.y:
  103.         gotoXYPrint(SNAKE.pop(), ' ')
  104.     else:
  105.         createFood()
  106.    
  107.     update()
  108.    
  109. HIGHT = 26
  110. WIDTH = 60
  111. MAINHANDLE = ctypes.windll.kernel32.GetStdHandle(-11)
  112. SNAKE = []
  113. HEADICON = 'O'
  114. FOODICON = "$"
  115. FOODPOINT = point()

  116. DIRECTION = 'K'

  117. system(f'mode con cols={WIDTH} lines={HIGHT}')
  118. system("title 贪吃蛇游戏")
  119. # 隐藏光标
  120. ctypes.windll.kernel32.SetConsoleCursorInfo(
  121.     MAINHANDLE, ctypes.byref(point(1,0)))

  122. def main():
  123.     global DIRECTION
  124.     side()
  125.     createSnake()
  126.     createFood()
  127.     while True:
  128.         moveSnake()
  129.         sleep(0.1)
  130.         if msvcrt.kbhit():
  131.             inputKey = msvcrt.getwch()
  132.             # 特殊按键
  133.             if inputKey == '\000' or inputKey == '\xe0':
  134.                 inputKey = msvcrt.getwch()
  135.                 if DIRECTION == 'K' and inputKey == 'M': continue
  136.                 elif DIRECTION == 'M' and inputKey == 'K': continue
  137.                 elif DIRECTION == 'H' and inputKey == 'P': continue
  138.                 elif DIRECTION == 'P' and inputKey == 'H': continue
  139.             DIRECTION = inputKey
  140.             

  141. if __name__ == '__main__':
  142.     main()
复制代码

换汤不换药!
游客,如果您要查看本帖隐藏内容请回复

评分

参与人数 1荣誉 +2 鱼币 +2 收起 理由
hrp + 2 + 2

查看全部评分

本帖被以下淘专辑推荐:

  • · python|主题: 62, 订阅: 4
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-12-18 20:51:05 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-12-20 22:41:50 | 显示全部楼层
本帖最后由 tryhi 于 2020-12-20 22:43 编辑

125行
FOODICON = '
报错
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-12-21 07:55:49 | 显示全部楼层
本帖最后由 Cool_Breeze 于 2020-12-21 08:38 编辑
tryhi 发表于 2020-12-20 22:41
125行
FOODICON = '
报错


好了,排版失误!
不是排版失误, 代码内容包含< '$' > 好像会调用后面的隐藏内容!像是个BUG
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-12-21 08:18:12 From FishC Mobile | 显示全部楼层
优秀
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-12-21 09:20:43 | 显示全部楼层

还是python写着舒服!C好久都没有用了!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-12-21 19:01:03 | 显示全部楼层
from collections import deque
这里使用比列表快很多
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-1-2 15:29:20 | 显示全部楼层
666
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2021-3-30 11:20:12 | 显示全部楼层
nbbnb
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-3-30 21:22:28 | 显示全部楼层
666 大神
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-5-17 15:46:00 | 显示全部楼层
1
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2021-5-17 20:56:26 | 显示全部楼层
厉害的
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-5-18 05:52:02 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2021-5-18 09:27:11 | 显示全部楼层
查看
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2022-2-16 15:43:19 | 显示全部楼层
学习一下下
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-2-16 16:07:30 | 显示全部楼层
来学习一下
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-7-28 09:04:52 | 显示全部楼层
1
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2023-5-2 14:05:52 | 显示全部楼层
1
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2023-5-3 15:59:17 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2023-5-15 19:45:03 | 显示全部楼层
1
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-5-19 14:54

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表