鱼C论坛

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

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

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

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

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

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

import ctypes
import msvcrt
from time import sleep
from os import system
from random import randrange


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

def gotoXYPrint(coord, char):
    global MAINHANDLE
    global HEADICON
    global FOODICON
    ctypes.windll.kernel32.SetConsoleCursorPosition(
        MAINHANDLE, coord)
    if char == HEADICON:
        ctypes.windll.kernel32.SetConsoleTextAttribute(
        MAINHANDLE, 14)
    elif char == FOODICON:
        ctypes.windll.kernel32.SetConsoleTextAttribute(
        MAINHANDLE, 12)
    else:
        ctypes.windll.kernel32.SetConsoleTextAttribute(
        MAINHANDLE, 11)
    print(char, end='', flush=True)


# 边框
def side():
    for n in range(WIDTH-1):
        gotoXYPrint(point(n,0), '+')
        gotoXYPrint(point(n,HIGHT-1), '+')
    for n in range(HIGHT-1):
        gotoXYPrint(point(0,n), '+')
        gotoXYPrint(point(WIDTH-1,n), '+')

def createFood():
    global SNAKE
    global FOODPOINT
    off = False
    while True:
        x = randrange(1, WIDTH-1)
        y = randrange(1, HIGHT-1)
        for n in SNAKE:
            if n.x == x and n.y == y:
                continue
            else:
                FOODPOINT.x = x
                FOODPOINT.y = y
                gotoXYPrint(FOODPOINT, FOODICON)
                off = True
        if off: break

def createSnake():
    global SNAKE
    x, y = WIDTH//2, HIGHT//2
    for n in range(3):
        t = point(x+n, y)
        SNAKE.append(t)
        gotoXYPrint(t, HEADICON)

def update():
    for i in SNAKE:
        gotoXYPrint(i, HEADICON)

def _exit(info):
    input(info)
    exit()
    
def collision():
    global SNAKE
    head = SNAKE[0]
    count = 0
    for n in SNAKE:
        count += 1
        if count == 1: continue
        if n.x == head.x and n.y == head.y:
            _exit('游戏结束!')
            
    if head.x == 0 or head.y == 0 or \
       head.x == WIDTH-1 or head.y == HIGHT-1:
       _exit('游戏结束!')

def moveSnake():
    '''
    K == ←
    M == →
    H == ↑
    P == ↓
    '''
    global DIRECTION
    global SNAKE
    global FOODPOINT
    
    if DIRECTION == 'K':
        SNAKE.insert(0, point(SNAKE[0].x-1, SNAKE[0].y))
    elif DIRECTION == 'M':
        SNAKE.insert(0, point(SNAKE[0].x+1, SNAKE[0].y))
    elif DIRECTION == 'H':
        SNAKE.insert(0, point(SNAKE[0].x, SNAKE[0].y-1))
    elif DIRECTION == 'P':
        SNAKE.insert(0, point(SNAKE[0].x, SNAKE[0].y+1))
    # 其他按键不做任何动作
    else: return None
    collision()
    # 是否吃到食物
    if SNAKE[0].x != FOODPOINT.x or SNAKE[0].y != FOODPOINT.y:
        gotoXYPrint(SNAKE.pop(), ' ')
    else:
        createFood()
    
    update()
    
HIGHT = 26
WIDTH = 60
MAINHANDLE = ctypes.windll.kernel32.GetStdHandle(-11)
SNAKE = []
HEADICON = 'O'
FOODICON = "$"
FOODPOINT = point()

DIRECTION = 'K'

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

def main():
    global DIRECTION
    side()
    createSnake()
    createFood()
    while True:
        moveSnake()
        sleep(0.1)
        if msvcrt.kbhit():
            inputKey = msvcrt.getwch()
            # 特殊按键
            if inputKey == '\000' or inputKey == '\xe0':
                inputKey = msvcrt.getwch()
                if DIRECTION == 'K' and inputKey == 'M': continue
                elif DIRECTION == 'M' and inputKey == 'K': continue
                elif DIRECTION == 'H' and inputKey == 'P': continue
                elif DIRECTION == 'P' and inputKey == 'H': continue
            DIRECTION = inputKey
            

if __name__ == '__main__':
    main()
换汤不换药!
游客,如果您要查看本帖隐藏内容请回复

评分

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

查看全部评分

本帖被以下淘专辑推荐:

  • · python|主题: 62, 订阅: 4
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-12-18 20:51:05 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

125行
FOODICON = '
报错
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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


好了,排版失误!
不是排版失误, 代码内容包含< '$' > 好像会调用后面的隐藏内容!像是个BUG
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-12-21 08:18:12 From FishC Mobile | 显示全部楼层
优秀
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

还是python写着舒服!C好久都没有用了!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-12-21 19:01:03 | 显示全部楼层
from collections import deque
这里使用比列表快很多
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-1-2 15:29:20 | 显示全部楼层
666
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-3-30 11:20:12 | 显示全部楼层
nbbnb
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-3-30 21:22:28 | 显示全部楼层
666 大神
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-5-17 15:46:00 | 显示全部楼层
1
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-5-17 20:56:26 | 显示全部楼层
厉害的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-5-18 05:52:02 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-5-18 09:27:11 | 显示全部楼层
查看
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-2-16 15:43:19 | 显示全部楼层
学习一下下
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-2-16 16:07:30 | 显示全部楼层
来学习一下
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-7-28 09:04:52 | 显示全部楼层
1
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-5-2 14:05:52 | 显示全部楼层
1
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-5-3 15:59:17 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-5-15 19:45:03 | 显示全部楼层
1
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-9-23 05:24

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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