鱼C论坛

 找回密码
 立即注册
查看: 2457|回复: 6

[技术交流] 一个简单的五子棋(完成度90%)

[复制链接]
发表于 2018-3-31 22:21:15 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 qwe1231069 于 2018-4-2 14:21 编辑

第一次更新
基本上能玩了,判断什么的都写好了(写的很烂,以后再改)
输赢会在终端上显示出来
文件已改
===================================================================
近来想写个象棋,发现有点难。于是决定先写个五子棋

我还没写完,花了大概两晚写了个界面。发出来让新手看看
肯定还有好多地方做的不好,希望大家帮我指出来
希望一个月之内能写个简单的带AI的五子棋

一共三个文件,图片是50像素的棋子
settings
class Settings():
        def __init__(self):
                #屏幕设置
                self.screen_width = 1200
                self.screen_height = 800
                self.bg_color = (230,230,230)

                #棋盘设置
                #行数
                self.row_num = 10
                #列数
                self.columns_num = 10

                self.row_width = 50
                self.qipan_color = (200,0,0)

chess.py
import pygame
from settings import Settings

class Chess():
        
        def __init__(self,screen):
                #flag 0 为黑棋
                self.flag = 0
                self.screen = screen
                self.set = Settings()
                #加载棋子图片
                self.white = pygame.image.load('baiqi1.png')
                self.black = pygame.image.load('heiqi1.png')

                self.white_rect = self.white.get_rect()
                self.black_rect = self.black.get_rect()
                #棋盘坐标列表
                self.chesslist = [[0 for i in range(self.set.columns_num + 1)]for i in range(self.set.row_num + 1)]

        def chessboard(self,screen):
                self.zerox = self.set.screen_width/2 - self.set.columns_num/2*self.set.row_width
                self.zeroy = self.set.screen_height/2 - self.set.row_num/2*self.set.row_width

                #画棋盘
                for i in range(0,self.set.row_num + 1):
                        a = i * self.set.row_width
                        pygame.draw.line(screen,self.set.qipan_color,(self.zerox,self.zeroy + a),(self.zerox + self.set.row_width * self.set.columns_num,self.zeroy + a),5)
                for i in range(0,self.set.columns_num + 1):
                        a = i * self.set.row_width
                        pygame.draw.line(screen,self.set.qipan_color,(self.zerox + a,self.zeroy),(self.zerox + a,self.zeroy + self.set.row_num * self.set.row_width),5)

        def blitme(self,flag):
                pass

        def save_chess(self):
                if self.newx < 0 or self.newy < 0 or self.newy > self.set.row_num or self.newx > self.set.columns_num or self.chesslist[self.newy][self.newx] != 0:
                        return 0
                if self.flag:
                        #bai qi  -1
                        self.chesslist[self.newy][self.newx] = -1
                else:                
                        self.chesslist[self.newy][self.newx] = 1
                #print(self.chesslist)

        def coordinate(self):
                #棋子坐标由鼠标决定
                x,y = pygame.mouse.get_pos()
                #鼠标点击地方的棋子坐标
                self.newx = int((x + 25 - self.zerox)//50)
                self.newy = int((y + 25 - self.zeroy)//50)
                
                #print(self.newx,self.newy)
                if self.newx < 0 or self.newy < 0 or self.newy > self.set.row_num or self.newx > self.set.columns_num or self.chesslist[self.newy][self.newx] != 0:
                        return 0
                self.white_rect.centerx = self.newx * 50 + self.zerox 
                self.white_rect.bottom = self.newy * 50 + self.zeroy + 25
                self.black_rect.centerx = self.newx * 50 + self.zerox
                self.black_rect.bottom = self.newy * 50 + self.zeroy + 25
                if self.flag:
                        #flag 1 为白色
                        self.screen.blit(self.white,self.white_rect)                
                else:
                        self.screen.blit(self.black,self.black_rect)                
                self.flag = ~self.flag
                return 1
        
        def win(self):
                #x,y是坐标        i,j是移动方向        num是此方向个数
                def a(x,y,i,j,num):
                        while(x >= 0 and y >= 0 and x <= self.set.columns_num and y <= self.set.row_num):
                                a = self.chesslist[y][x]
                                y = y + j
                                x = x + i
                                if x < 0 or y < 0 or x > self.set.columns_num or y > self.set.row_num:
                                        break
                                b = self.chesslist[y][x]
                                if a == b:
                                        num = num + 1        
                                else:
                                        break
                        return num


                #白棋赢了-1 没人获胜 0
                winflag = 0
                i = self.chesslist[self.newy][self.newx]

                x = self.newx
                y = self.newy
                numi = a(x,y,0,-1,0) + a(x,y,0,1,0) + 1
                nums = a(x,y,-1,0,0) + a(x,y,1,0,0) + 1
                num1 = a(x,y,-1,-1,0) + a(x,y,1,1,0) + 1
                num2 = a(x,y,-1,1,0) + a(x,y,1,-1,0) + 1

                if numi > 4 or nums > 4 or num1 > 4 or num2 > 4:
                        winflag = i
                        return winflag
                return 0

wuziqi.py
#五子棋
import pygame
import sys
from pygame.locals import *
from settings import Settings
from chess import Chess
def run_game():
        global flag
        
        #创建屏幕对象
        pygame.init()
        qiset = Settings()
        screen = pygame.display.set_mode((qiset.screen_width,qiset.screen_height))
        pygame.display.set_caption("五子棋")
        chess = Chess(screen) 
        a = 0
                
        #bg_color
        screen.fill(qiset.bg_color)
        #绘制棋盘
        chess.chessboard(screen)        
        #main()
        while True:
                for event in pygame.event.get():
                        if event.type == pygame.QUIT:
                                sys.exit()
                        elif event.type == MOUSEBUTTONDOWN:
                                pressed_array = pygame.mouse.get_pressed()
                                for i in range(len(pressed_array)):
                                        if pressed_array[i]:
                                                if i == 0:
                                                        #left button
                                                        #chess.blitme(flag)
                                                        a=chess.coordinate()
                                                        if a:
                                                                chess.save_chess()
                                                                b = chess.win()
                                                                if b == 1:
                                                                        print('白棋赢了')
                                                                elif b == -1:
                                                                        print('黑棋赢了')
                                                elif i == 1:
                                                        #mouse wheel
                                                        pass
                                                elif i == 2:
                                                        pass
                                                        #right button
                #让最近绘制的屏幕可见
                pygame.display.flip()
run_game()
2018-04-01 17-56-47屏幕截图.png

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2018-3-31 22:28:33 | 显示全部楼层
本帖最后由 qwe1231069 于 2018-3-31 22:32 编辑

其实我有git的
https://github.com/enotsGNU/python.git
只看五子棋就好了,其他的写的有点差。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-4-1 10:50:04 From FishC Mobile | 显示全部楼层
路过学习,写的很好
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-4-1 18:04:13 | 显示全部楼层
BngThea 发表于 2018-4-1 10:50
路过学习,写的很好

能不能帮我看看是什么问题
我一运行这东西cpu占用率直接到100%,我笔记本风扇就开始响
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-4-2 12:06:45 | 显示全部楼层
qwe1231069 发表于 2018-4-1 18:04
能不能帮我看看是什么问题
我一运行这东西cpu占用率直接到100%,我笔记本风扇就开始响

你这么配置,不会是0几年的老电脑了吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-4-2 12:08:06 | 显示全部楼层
qwe1231069 发表于 2018-4-1 18:04
能不能帮我看看是什么问题
我一运行这东西cpu占用率直接到100%,我笔记本风扇就开始响

你可以换个角度,优化你的代码。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 4 天前 | 显示全部楼层
学习了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-10 06:13

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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