新普京网站-澳门新普京 > 前端 > 让繁琐工作自动化,编写的一个完整字谜游戏

让繁琐工作自动化,编写的一个完整字谜游戏

2019/12/30 01:41

本文由码农网 – 小峰原创翻译,转发请看清文末的转发供给,迎接参加大家的付费投稿安插!

  《Python编制程序急忙上手—让繁缛工作自动化》是抢手Python编制程序图书,协理您通过编制程序急忙完毕工作自动化。在本书中,你将学习运用Python 编制程序,在几分钟内产生手工业要求几小时的专门的学业,而优先却不要求具有编制程序经验。风度翩翩旦精晓了编制程序的根基知识,你就能够毫不费事地创制Python 程序,实现高效的自动化职业,包含:
  ● 在叁个文本或八个文件中探寻文本;
  ● 创立、更新、移动和重命名文件和文件夹;
  ● 寻觅网页和下载的在线内容;
  ● 在大肆大小的Excel石英钟格中立异和格式化数据;
  ● 拆分、合并PDF文件,以致怎么着加水印和加密;
  ● 发送提示邮件和文书文告;
  ● 填写在线表格。
  本书的审核人Al Sweigart是一人优良Python程序猿,他照旧《Python 密码学编制程序》、《Python 游戏编制程序火速上手》和《Python 和Pygame 游戏开拓指南》的审核人。

介绍

字谜游戏,也许你在无数益智书中都曾见到过。试着在计算机上用不一样类其余剧情写字谜游戏,而且有自定义字词去玩也是很有趣的。

澳门新普京 1

背景

本人很早此前使用Turbo C编码游戏,但笔者错失了代码。小编觉着用C#.NET让它复活将是豆蔻梢头件很伟大的事体。该语言在内存、GC、图形方面提供了广大借坡下驴,而那些是俺在选取C语言的时候必需小心管理的。可是在C语言中的明显关心,会让我们学到相当多(那就是为啥C语言被称为“天公的编制程序语言”的由来)。其他方面,因为C#.NET料理到了那个,所以小编得以小心于别的地点的增长,举例字的取向,重叠,作弊码,计分,加密等。所以在赏鉴二种语言的时候须要有贰个平衡。

澳门新普京 2

在主题材料中我为此说它是“完整的”,原因如下:

1)它有大器晚成都部队分类型的预设词。

2)它在加密文书中保留单词和分数,那样就未有人可以窜改文件。尽管要窜改,那么它将还原到预设并从头初阶计分。

3)它有作弊码,但作弊会不实惠得分,且分明作弊生龙活虎旦接纳会使分数归零。

4)它有两个计分机制。

内容简单介绍

运用代码

娱乐提供以下职能,具体作者就要紧接着的章节中切磋:

1)载入体系和单词:从程序中硬编码的预设中加载单词。然则,借使游戏发烧友提供自定义的单词,那么游戏将自行把持有这一个(连同预设)存储在文书中并从这边读取。

2)放在网格上:游戏将具备的单词随机地放在18×18的矩阵中。方向能够是水平,垂直,左下和右下,如上海教室中所示。

3)计分:对于差异门类,分数单独存款和储蓄。分数的简政放权方法是单词的尺寸乘以乘法因子(这里为10)。与此同期,在找到全体的单词之后,剩余时间(乘以乘法因子)也会加到分数中。

4)显示掩盖的单词:倘若时光用完事后,游戏者依旧找不到具备的单词,那么游戏会用分裂的颜料显示没找到的单词。

5)作弊码:游戏在游戏板上提作弊码(mambazamba)。作弊码只简轻巧单地安装了一全日的光阴(86,400秒)。不过,应用作弊码也会使用让本次运行的计分为零的治罪。

  近日,大家面临的半数以上职分都能够通过编写制定应用程式来达成。Python是生龙活虎种解释型、面向对象、动态数据类型的尖端程序设计语言。通过Python编制程序,大家能够解决现实生活中的非常多任务。
  本书是一本面向实施的Python编制程序实用指南。本书的指标,不独有是介绍Python语言的底蕴知识,何况还透过项目实践教会读者怎样运用这几个文化和技艺。本书的首有的介绍了基本Python编制程序概念,第三盘部介绍了一些不等的职责,通过编写制定Python程序,能够让计算机自动达成它们。第二有个其他每风流罗曼蒂克章都有局地档期的顺序前后相继,供读者学习。每章的末尾还提供了生机勃勃部分练习和深切的实践项目,扶植读者巩固所学的学识。附录部分提供了颇负习题的解答。
  本书相符任何想要通过Python学习编程的读者,越发切合贫乏编制程序底蕴的初读书人。通过阅读本书,读者将能动用刚劲的编制程序语言和工具,何况会体会到Python编制程序的开心。

1)载入连串和单词:

载入预设

大家有二个简易的用来全数种类和单词的类:

class WordEntity
{
    public string Category { get; set; }
    public string Word { get; set; }
}

我们有大器晚成都部队分预设的门类和单词如下。预设都以管道相隔的,个中每第拾四个单词是项目称号,前边的单词是该类型中的单词。

private string PRESET_WORDS =
"COUNTRIES|BANGLADESH|GAMBIA|AUSTRALIA|ENGLAND|NEPAL|INDIA|PAKISTAN|TANZANIA|SRILANKA|CHINA|CANADA|JAPAN|BRAZIL|ARGENTINA|" +
"MUSIC|PINKFLOYD|METALLICA|IRONMAIDEN|NOVA|ARTCELL|FEEDBACK|ORTHOHIN|DEFLEPPARD|BEATLES|ADAMS|JACKSON|PARTON|HOUSTON|SHAKIRA|" +
...

我们采纳加密在文件中写这几个单词。所以没有人得以点窜文件。对于加密小编利用了四个从这里借鉴的类。使用简便——你须要传递字符串和用来加密的加密密码。对于解密,你需求传递加密的字符串和密码。

要是文件存在,那么大家从这边读取种类和单词,不然大家保留预设(以及游戏的使用者自定义的单词)并从预设这里读取。那在上面包车型客车代码中达成:

if (File.Exists(FILE_NAME_FOR_STORING_WORDS))   // If words file exists, then read it.
    ReadFromFile();
else
{   // Otherwise create the file and populate from there.
    string EncryptedWords = StringCipher.Encrypt(PRESET_WORDS, ENCRYPTION_PASSWORD);
    using (StreamWriter OutputFile = new StreamWriter(FILE_NAME_FOR_STORING_WORDS))
        OutputFile.Write(EncryptedWords);
    ReadFromFile();
}

ReadFromFile(卡塔尔(قطر‎方法轻便地从存款和储蓄单词的文书中读取。它首先尝试解密从文件读取的字符串。假如失利(由再次回到的空白字符串显著),它将显示关于难题的一条信息,然后从停放预设重新加载。不然它从字符串读取并将它们分成连串和单词,并把它们坐落于单词列表中。每第15个词是项目,后续词是此连串下的单词。

string Str = File.ReadAllText(FILE_NAME_FOR_STORING_WORDS);
string[] DecryptedWords = StringCipher.Decrypt(Str, ENCRYPTION_PASSWORD).Split('|');
if (DecryptedWords[0].Equals(""))  // This means the file was tampered.
{
    MessageBox.Show("The words file was tampered. Any Categories/Words saved by the player will be lost.");
    File.Delete(FILE_NAME_FOR_STORING_WORDS);
    PopulateCategoriesAndWords();   // Circular reference.
    return;
}

string Category = "";

for (int i = 0; i <= DecryptedWords.GetUpperBound(0); i++)
{
    if (i % (MAX_WORDS + 1) == 0)   // Every 15th word is the category name.
    {
        Category = DecryptedWords[i];
        Categories.Add(Category);
    }
    else
    {
        WordEntity Word = new WordEntity();
        Word.Category = Category;
        Word.Word = DecryptedWords[i];
        WordsList.Add(Word);
    }
}

保留游戏用户的自定义词

三11日游可供应由玩家提供的自定义词。设备放在同风流倜傥的加载窗口。单词应该起码3个字符长,最多11个字符长,何况必要17个单词——非常的少也亟须少。提醒在标签中。其它单词不能够是其他其余词的子部分。比如:不可能有如’JAPAN’和’JAPANESE’那样多个词,因为前面贰个带有在后世中。

澳门新普京 3

自己将简介一下实用检查。有3个关于最大尺寸、最小长度和SPACE输入(不容许空格)的即时检查。那通过将大家自定义的管理程序Control_KeyPress增加到单词条约网格的EditingControlShowingevent中来达成。

private void WordsDataGridView_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)
{    
    e.Control.KeyPress -= new KeyPressEventHandler(Control_KeyPress);
    e.Control.KeyPress += new KeyPressEventHandler(Control_KeyPress);
}

每当客户输入东西时,管理程序就被调用并检讨有效性。实现如下:

TextBox tb = sender as TextBox;
if (e.KeyChar == (char)Keys.Enter)
{
    if (tb.Text.Length <= MIN_LENGTH)   // Checking length
    {
        MessageBox.Show("Words should be at least " + MAX_LENGTH + " characters long.");
        e.Handled = true;
        return;
    }
}
if (tb.Text.Length >= MAX_LENGTH)   // Checking length
{
    MessageBox.Show("Word length cannot be more than " + MAX_LENGTH + ".");
    e.Handled = true;
    return;
}
if (e.KeyChar.Equals(' '))  // Checking space; no space allowed. Other invalid characters check can be put here instead of the final check on save button click.
{
    MessageBox.Show("No space, please.");
    e.Handled = true;
    return;
}
e.KeyChar = char.ToUpper(e.KeyChar);

最后,在输入全体单词並且客商筛选保存和行使自定义单词之后存在有效性检查。首先它检查是或不是输入了十四个单词。然后它遍历全体的十多个单词,并检查它们是或不是有不行字符。同一时间它也检查重复的单词。检查成功就把单词加多到列表中。最后,提交另叁回迭代,以检讨单词是或不是带有在另二个单词中(比方,不可能犹如’JAPAN’和’JAPANESE’那样的八个单词,因为后边四个带有在后人中)。通过上边包车型大巴代码完结:

public bool CheckUserInputValidity(DataGridView WordsDataGridView, List<string> WordsByThePlayer)
{
    if (WordsDataGridView.Rows.Count != MAX_WORDS + 1)
    {
        MessageBox.Show("You need to have " + MAX_WORDS + " words in the list. Please add more.");
        return false;
    }

    char[] NoLettersList = { ':', ';', '@', ''', '"', '{', '}', '[', ']', '|', '\', '<', '>', '?', ',', '.', '/',
                            '`', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '-', '=', '~', '!', '#', '$',
                            '%', '^', '&', '*', '(', ')', '_', '+'};   //'
    foreach (DataGridViewRow Itm in WordsDataGridView.Rows)
    {
        if (Itm.Cells[0].Value == null) continue;
        if (Itm.Cells[0].Value.ToString().IndexOfAny(NoLettersList) >= 0)
        {
            MessageBox.Show("Should only contain letters. The word that contains something else other than letters is: '" + Itm.Cells[0].Value.ToString() + "'");
            return false;
        }
        if (WordsByThePlayer.IndexOf(Itm.Cells[0].Value.ToString()) != -1)
        {
            MessageBox.Show("Can't have duplicate word in the list. The duplicate word is: '" + Itm.Cells[0].Value.ToString() + "'");
            return false;
        }
        WordsByThePlayer.Add(Itm.Cells[0].Value.ToString());
    }
    for (int i = 0; i < WordsByThePlayer.Count - 1; i++)    // For every word in the list.
    {
        string str = WordsByThePlayer[i];
        for (int j = i + 1; j < WordsByThePlayer.Count; j++)    // Check existence with every other word starting from the next word
            if (str.IndexOf(WordsByThePlayer[j]) != -1)
            {
                MessageBox.Show("Can't have a word as a sub-part of another word. Such words are: '" + WordsByThePlayer[i] + "' and '" + WordsByThePlayer[j] + "'");
                return false;
            }
    }
    return true;
}

游戏发烧友的列表与存活单词一齐保存,然后游戏板与该品种中的这一个单词一齐被张开。

小编简单介绍

2)放在网格上:

在网格上放置单词

单词通过InitializeBoard(State of Qatar方法被停放在网格上。大家在字符矩阵(二维字符数组)WOTiguanDS_IN_BOACR-VD中先放置单词。然后大家在网格中映射这么些矩阵。遍历全部的单词。每一种单词获取随机方向(水平/垂直/左下/右下)下的放肆地方。此时,如果大家可视化的话,单词矩阵看起来会有一些像上面这样。

澳门新普京 4

停放通过PlaceTheWords(State of Qatar方法成功,得到4个参数——单词方向,单词本人,X坐标和Y坐标。那是叁个第意气风发措施,所以笔者要每个表达那多少个样子。

水平方向

对于任何单词,每种字符地运维循环。首先它检查这一个词是还是不是落在网格之外。假诺那是真的,那么它回到到调用进程以生成新的随飞机地点置和可行性。

然后,它检查当前字符是还是不是恐怕与网格上的幸存字符重叠。假设产生这种情状,那么检查它是不是是相像的字符。借使不是同后生可畏的字符,那就回到到调用方法,要求另三个Infiniti定地点和可行性。

在此八个检查之后,倘若放置是生龙活虎种只怕,那么就把单词放置在矩阵中,何况通过措施StoreWordPosition(卡塔尔将列表中的地点和样子存款和储蓄在WordPositions中。

for (int i = 0, j = PlacementIndex_X; i < Word.Length; i++, j++)               // First we check if the word can be placed in the array. For this it needs blanks there.
{
    if (j >= GridSize) return false; // Falling outside the grid. Hence placement unavailable.
    if (WORDS_IN_BOARD[j, PlacementIndex_Y] != '')
        if (WORDS_IN_BOARD[j, PlacementIndex_Y] != Word[i])   // If there is an overlap, then we see if the characters match. If matches, then it can still go there.
        {
            PlaceAvailable = false;
            break;
        }
}
if (PlaceAvailable)
{   // If all the cells are blank, or a non-conflicting overlap is available, then this word can be placed there. So place it.
    for (int i = 0, j = PlacementIndex_X; i < Word.Length; i++, j++)
        WORDS_IN_BOARD[j, PlacementIndex_Y] = Word[i];
    StoreWordPosition(Word, PlacementIndex_X, PlacementIndex_Y, OrientationDecision);
    return true;
}
break;

笔直/左下/右下方向

相符的逻辑适用于为那3个方向找到单词的美妙布局。它们在矩阵地点和边际检查的增量/减少数量方面不如。

在具有的单词被停放在矩阵中然后,FillInTheGaps(卡塔尔(قطر‎方法用随机字母填充矩阵的别的部分。当时窗体张开并触发Paint(卡塔尔国事件。在这里个事件上,大家绘制最后呈现为40×40像素矩形的线。然后大家将大家的字符矩阵映射到board上。

Pen pen = new Pen(Color.FromArgb(255, 0, 0, 0));

ColourCells(ColouredRectangles, Color.LightBlue);
if (FailedRectangles.Count > 0) ColourCells(FailedRectangles, Color.ForestGreen);

// Draw horizontal lines.
for (int i = 0; i <= GridSize; i++)
    e.Graphics.DrawLine(pen, 40, (i + 1) * 40, GridSize * 40 + 40, (i + 1) * 40);

// Draw vertical lines.
for (int i = 0; i <= GridSize; i++)
    e.Graphics.DrawLine(pen, (i + 1) * 40, 40, (i + 1) * 40, GridSize * 40 + 40);

MapArrayToGameBoard();

MapArrayToGameBoard(卡塔尔(قطر‎方法轻松地把大家的字符矩阵放在board上。大家应用来源MSDN的绘图代码。那遍历矩阵中的全体字符,将它们放置在40×40矩形的中游,边距调治为10像素。

Graphics formGraphics = CreateGraphics();
Font drawFont = new Font("Arial", 16);
SolidBrush drawBrush = new SolidBrush(Color.Black);
string CharacterToMap;

for (int i = 0; i < GridSize; i++)
    for (int j = 0; j < GridSize; j++)
    {
        if (WORDS_IN_BOARD[i, j] != '')
        {
            CharacterToMap = "" + WORDS_IN_BOARD[i, j]; // "" is needed as a means for conversion of character to string.
            formGraphics.DrawString(CharacterToMap, drawFont, drawBrush, (i + 1) * 40 + 10, (j + 1) * 40 + 10);
        }
    }

单词开掘和有效性检查

鼠标点击地方和自由地方存款和储蓄在点列表中。对鼠标开关释放事件(GameBoard_MouseUp(卡塔尔国)调用CheckValidity(卡塔尔(قطر‎方法。同期,当顾客在左键按下的还要拖动鼠标时,大家从开场地方绘制一条线到鼠标指针。那在GameBoard_MouseMove(卡塔尔国事件中实现。

if (Points.Count > 1)
    Points.Pop();
if (Points.Count > 0)
    Points.Push(e.Location);

// Form top = X = Distance from top, left = Y = Distance from left.
// However mouse location X = Distance from left, Y = Distance from top.

// Need an adjustment to exact the location.
Point TopLeft = new Point(Top, Left);
Point DrawFrom = new Point(TopLeft.Y + Points.ToArray()[0].X + 10, TopLeft.X + Points.ToArray()[0].Y + 80);
Point DrawTo = new Point(TopLeft.Y + Points.ToArray()[1].X + 10, TopLeft.X + Points.ToArray()[1].Y + 80);

ControlPaint.DrawReversibleLine(DrawFrom, DrawTo, Color.Black); // draw new line

单词的有用在CheckValidity(卡塔尔(قطر‎方法中检查。它经过抓取全体的假名来拟订单词,字母通过动用鼠标查占星应的字符矩阵来绘制。然后检查是还是不是确实相配单词列表中的单词。假使匹配,则经过将单元格着色为水泥灰色并使单词列表中的单词变灰来更新单元格。

以下是抓取行在此之前和截至地点的代码片段。首先它检查行是不是落在边界之外。然后它制订单词况且存款和储蓄矩阵的坐标。形似地,它检查垂直,左下和右下单词,并尝试相应地协作。即便那诚然相称,那么大家经过AddCoordinates(卡塔尔国方法将一时半刻矩形存款和储蓄在我们的ColouredRectangles点列表中。

if (Points.Count == 1) return; // This was a doble click, no dragging, hence return.
int StartX = Points.ToArray()[1].X / 40;    // Retrieve the starting position of the line.
int StartY = Points.ToArray()[1].Y / 40;

int EndX = Points.ToArray()[0].X / 40;      // Retrieve the ending position of the line.
int EndY = Points.ToArray()[0].Y / 40;

if (StartX > GridSize || EndX > GridSize || StartY > GridSize || EndY > GridSize || // Boundary checks.
    StartX <= 0 || EndX <= 0 || StartY <= 0 || EndY <= 0)
{
    StatusLabel.Text = "Nope!";
    StatusTimer.Start();
    return;
}

StringBuilder TheWordIntended = new StringBuilder();
List<Point> TempRectangles = new List<Point>();
TheWordIntended.Clear();
if (StartY == EndY) // Horizontal line drawn.
    for (int i = StartX; i <= EndX; i++)
    {
        TheWordIntended.Append(WORDS_IN_BOARD[i - 1, StartY - 1].ToString());
        TempRectangles.Add(new Point(i * 40, StartY * 40));
    }

  Al Sweigart,是一名软件开垦者,还教孩子和成长编制程序。他为初读书人写了几本Python 书籍,包蕴《Python 密码学编制程序》、《Python 游戏编制程序火速上手》和《Python 和Pygame 游戏开垦指南》。

3)计分:

对于计分,大家有计分文件。如若缺少,则应用当前分数和类型创造一个。这里,再度,全部的分数被重新整合在三个大的管道相隔的字符串中,然后该字符串被加密并放入文件。我们有多个实体。

class ScoreEntity
{
    public string Category { get; set; }
    public string Scorer { get; set; }
    public int Score { get; set; }
    public DateTime ScoreTime { get; set; }
..............
..............

最多允许二个体系16个分数。首先加载分数列表中的全部分数,然后拿走当前分门别类分数的排序子集。在该子聚焦,检查当前分数是不是超越别的可用的分数。假设是,则插入当前分数。之后,检查子集数是或不是超越14,假诺胜过了,就裁撤最后三个。所以最后的得分未有了,列表总是有16个分数。这在CheckAndSaveIfTopScore(卡塔尔方法中成功。

此地,再一次,假诺有人歪曲得分文件,那么它只会初步一个新的得分。不许点窜。

目录

4)呈现掩瞒的单词:

假使时光用完了,那么游戏用驼灰展现单词。首先,获取游戏发烧友找不到的单词。能够是如此的

List<string> FailedWords = new List<string>();
foreach (string Word in WORD_ARRAY)
    if (WORDS_FOUND.IndexOf(Word) == -1)
        FailedWords.Add(Word);

下一场,遍历那些战败的单词地方并制订相应的破产的矩阵。最终,它经过无效来调用窗体的paint方法。

foreach (string Word in FailedWords)
{
    WordPosition Pos = WordPositions.Find(p => p.Word.Equals(Word));

    if (Pos.Direction == Direction.Horizontal) // Horizontal word.
        for (int i = Pos.PlacementIndex_X + 1, j = Pos.PlacementIndex_Y + 1, k = 0; k < Pos.Word.Length; i++, k++)
            FailedRectangles.Add(new Point(i * 40, j * 40));
    else if (Pos.Direction == Direction.Vertical) // Vertical word.
        for (int i = Pos.PlacementIndex_X + 1, j = Pos.PlacementIndex_Y + 1, k = 0; k < Pos.Word.Length; j++, k++)
            FailedRectangles.Add(new Point(i * 40, j * 40));
    else if (Pos.Direction == Direction.DownLeft) // Down left word.
        for (int i = Pos.PlacementIndex_Y + 1, j = Pos.PlacementIndex_X + 1, k = 0; k < Pos.Word.Length; i--, j++, k++)
            FailedRectangles.Add(new Point(i * 40, j * 40));
    else if (Pos.Direction == Direction.DownRight) // Down right word.
        for (int i = Pos.PlacementIndex_X + 1, j = Pos.PlacementIndex_Y + 1, k = 0; k < Pos.Word.Length; i++, j++, k++)
            FailedRectangles.Add(new Point(i * 40, j * 40));
}
Invalidate();

第大器晚成某些 Python编制程序基本功
第1章 Python基础 3
1.1 在人机联作式情状中输入表达式 3
1.2 整型、浮点型和字符串数据类型 6
1.3 字符串连接和复制 6
1.4 在变量中保存值 7
1.4.1 赋值语句 7
1.4.2 变量名 9
1.5 第三个程序 9
1.6 程序解析 11
1.6.1 注释 11
1.6.2 print()函数 11
1.6.3 input()函数 11
1.6.4 打字与印刷客商的名字 12
1.6.5 len()函数 12
1.6.6 str()、int()和float()函数 13
1.7 小结 15
1.8 习题 15
第2章 控制流 17
2.1 布尔值 18
2.2 比较操作符 19
2.3 布尔操作符 20
2.3.1 二元布尔操作符 20
2.3.2 not操作符 21
2.4 混合布尔和比较操作符 21
2.5 调整流的要素 22
澳门新普京 ,2.5.1 条件 22
2.5.2 代码块 22
2.6 程序施行 23
2.7 调控流语句 23
2.7.1 if语句 23
2.7.2 else语句 24
2.7.3 elif语句 25
2.7.4 while循环语句 30
2.7.5 恼人的循环 31
2.7.6 break语句 33
2.7.7 continue语句 34
2.7.8 for循环和range()函数 37
2.7.9 等价的while循环 39
2.7.10 range()的开始、停止和
步长参数 39
2.8 导入模块 40
from import语句 41
2.9 用sys.exit(卡塔尔国提前甘休程序 41
2.10 小结 41
2.11 习题 41
第3章 函数 43
3.1 def语句和参数 44
3.2 再次回到值和return语句 45
3.3 None值 46
3.4 关键字参数和print(卡塔尔(قطر‎ 47
3.5 局部和全局意义域 48
3.5.1 局地变量不能够在大局意义
域内使用 48
3.5.2 局部作用域不可能接纳其余
风华正茂对成效域内的变量 49
3.5.3 全局变量能够在部分成效
域中读取 49
3.5.4 名称相通的有的变量和大局
变量 50
3.6 global语句 50
3.7 万分管理 52
3.8 几个小程序:猜数字 54
3.9 小结 55
3.10 习题 56
3.11 试行项目 56
3.11.1 Collatz序列 56
3.11.2 输入验证 57
第4章 列表 59
4.1 列表数据类型 59
4.1.1 用下标获得列表中的
单个值 60
4.1.2 负数下标 61
4.1.3 利用切成片拿到子列表 61
4.1.4 用len(卡塔尔得到列表的尺寸 62
4.1.5 用下标改换列表中的值 62
4.1.6 列表连接和列表复制 62
4.1.7 用del语句从列表中
删除值 63
4.2 使用列表 63
4.2.1 列表用于循环 64
4.2.2 in和not in操作符 65
4.2.3 多重赋值手艺 66
4.3 加强的赋值操作 66
4.4 方法 67
4.4.1 用index(卡塔尔方法在列表中
查找值 67
4.4.2 用append()和insert()方法在
列表中增添值 68
4.4.3 用remove(卡塔尔方法从列表中
删除值 69
4.4.4 用sort(State of Qatar方法将列表中的值
排序 69
4.5 例子程序:奇妙8球和列表 70
4.6 肖似列表的门类:字符串和
元组 71
4.6.1 可变和不可变数据类型 72
4.6.2 元组数据类型 73
4.6.3 用list()和tuple()函数来
转移类型 74
4.7 引用 75
4.7.1 传递援引 76
4.7.2 copy模块的copy()和
deepcopy()函数 77
4.8 小结 78
4.9 习题 78
4.10 奉行项目 79
4.10.1 逗号代码 79
4.10.2 字符图网格 79
第5章 词典和布局化数据 81
5.1 辞典数据类型 81
5.1.1 词典与列表 82
5.1.2 keys()、values()和items()
方法 83
5.1.3 检查字典中是不是存在键
或值 84
5.1.4 get()方法 84
5.1.5 setdefault()方法 85
5.2 美丽打印 86
5.3 使用数据构造对实在世界建立模型 87
5.3.1 井字棋盘 88
5.3.2 嵌套的词典和列表 91
5.4 小结 92
5.5 习题 93
5.6 施行项目 93
5.6.1 风趣游戏的物料项目清单 93
5.6.2 列表到辞书的函数,针对
有趣游戏物品清单 94
第6章 字符串操作 95
6.1 管理字符串 95
6.1.1 字符串字面量 95
6.1.2 双引号 96
6.1.3 转义字符 96
6.1.4 原始字符串 96
6.1.5 用三重引号的多行字符串 97
6.1.6 多行注释 97
6.1.7 字符串下标和切成片 98
6.1.8 字符串的in和not in
操作符 98
6.2 有用的字符串方法 99
6.2.1 字符串方法upper(卡塔尔、lower(卡塔尔国、
isupper()和islower() 99
6.2.2 isX字符串方法 100
6.2.3 字符串方法startswith(State of Qatar和
新普京网站 ,endswith() 102
6.2.4 字符串方法join(卡塔尔国和
split() 102
6.2.5 用rjust()、ljust()和center()
方法对齐文本 103
6.2.6 用strip()、rstrip()和lstrip()
除去空白字符 104
6.2.7 用pyperclip模块拷贝粘贴字
符串 105
6.3 项目:口令保管箱 106
第1步:程序设计和数据构造 106
第2步:管理命令行参数 106
第3步:复制正确的口令 107
6.4 项目:在Wiki标识中增加冬辰
列表 108
第1步:从剪贴板中复制和
粘贴 108
第2步:分离文本中的行,并丰盛
星号 109
第3步:连接改进过的行 109
6.5 小结 110
6.6 习题 110
6.7 推行项目 111
报表打字与印刷 111
其次部分 自动化任务

5)作弊码:

那是生龙活虎件麻烦事了。那职业在keyup事件上,那个事件抓取全数的击键到CheatCode变量。实际上,大家联合游戏的使用者在打闹窗口上输入的击键,并探访代码是或不是与我们的CHEAT_CODE(mambazamba)相称。比如,要是游戏用户按下“m”和“a”,那么大家在CheatCode变量团长它们保持为’ma’(因为,ma仍旧相称cheatcode格局)。相近地,倘若它相配CHEAT_CODE的格局,则拉长一而再变量。可是,风华正茂旦它不可能合营方式(比如,’mambi’),则重复开始。

聊到底,借使相配,则激活作弊码(将剩余时间提升到总体一天,即86,400秒),并接受惩办。

CheatCode += e.KeyCode.ToString().ToUpper();
if (CHEAT_CODE.IndexOf(CheatCode) == -1)    // Cheat code didn't match with any part of the cheat code.
    CheatCode = ("" + e.KeyCode).ToUpper();                         // Hence erase it to start over.
else if (CheatCode.Equals(CHEAT_CODE) && WORDS_FOUND.Count != MAX_WORDS)
{
    Clock.TimeLeft = 86400;                 // Cheat code applied, literally unlimited time. 86400 seconds equal 1 day.
    ScoreLabel.Text = "Score: 0";
    StatusLabel.Text = "Cheated! Penalty applied!!";
    StatusTimer.Start();
    CurrentScore = 0;
    Invalidate();

这里有意思的是,我们亟须利用WordsListView的KeyUp事件并非窗体。那是因为在加载游戏窗口后,列表框有一点点子,实际不是窗体。

第7章 形式相配与正则表明式 115
7.1 不用正则表达式来查找文本
模式 116
7.2 用正则表达式查找文本方式 117
7.2.1 创制正则表明式对象 118
7.2.2 匹配Regex对象 118
7.2.3 正则表达式相配复习 119
7.3 用正则表明式相配愈来愈多格局 119
7.3.1 利用括号分组 119
7.3.2 用管道匹配七个分组 120
7.3.3 用问号达成可选相称 121
7.3.4 用星号相配零次或频仍 121
7.3.5 用加号相称一遍或频仍 122
7.3.6 用花括号相称特定次数 122
7.4 贪心和非贪心相配 123
7.5 findall()方法 124
7.6 字符分类 124
7.7 组建和谐的字符分类 125
7.8 插入字符和法郎字符 126
7.9 通配字符 126
7.9.1 用点-星相配全部字符 127
7.9.2 用句点字符匹配换行 127
7.10 正则表达式符号复习 128
7.11 不区分朗朗上口写的相配 128
7.12 用sub(卡塔尔(قطر‎方法替换字符串 129
7.13 管理复杂的正则表明式 129
7.14 组合使用re.IGNOREC ASE、
re.DOTALL和re.VERBOSE 130
7.15 项目:电话号码和Email地址
领到程序 130
第1步:为电话号码创设三个正则
表达式 131
第2步:为email地址创制七个正则
表达式 132
第3步:在剪贴板文本中找到全部
匹配 132
第4步:全体相配连接成三个
字符串,复制到剪贴板 133
第5步:运路程序 133
第6步:相仿程序的构想 134
7.16 小结 134
7.17 习题 134
7.18 执行项目 136
7.18.1 强口令检验 136
7.18.2 strip(State of Qatar的正则表明式
版本 136
第8章 读写文件 137
8.1 文件与公事路线 137
8.1.1 Windows上的倒斜杠以至
OS X和Linux上的
正斜杠 138
8.1.2 当前职业目录 139
8.1.3 相对路线与相对路线 139
8.1.4 用os.makedirs()创建新
文件夹 140
8.1.5 os.path模块 140
8.1.6 管理相对路线和相对
路径 141
8.1.7 查看文件大小和文件夹
内容 142
8.1.8 检查路线有效性 143
8.2 文件读写进程 144
8.2.1 用open(卡塔尔(قطر‎函数展开文件 145
8.2.2 读取文件内容 145
8.2.3 写入文件 146
8.3 用shelve模��保存变量 147
8.4 用pprint.pformat(卡塔尔函数保存
变量 148
8.5 项目:生成随机的考试试卷
文件 149
第1步:将试验数据保存在一个
字典中 149
第2步:创造检验文件,并打乱
标题标次序 150
第3步:创造答案选项 151
第4步:将内容写入检验试卷和
答案文件 151
8.6 项目:多重剪贴板 153
第1步:注释和shelf设置 153
第2步:用贰个根本字保存剪贴板
内容 154
第3步:列出重要字和加载关键字的
内容 154
8.7 小结 155
8.8 习题 155
8.9 施行项目 156
8.9.1 增添多重剪贴板 156
8.9.2 疯狂填词 156
8.9.3 正则表明式查找 156
第9章 组织文件 157
9.1 shutil模块 158
9.1.1 复制文件和文书夹 158
9.1.2 文件和文书夹的移动与
改名 158
9.1.3 长久删除文件和文件夹 160
9.1.4 用send2trash模块安全地
删除 160
9.2 遍历目录树 161
9.7 用zipfile模块压缩文件 162
9.3.1 读取ZIP文件 163
9.3.2 从ZIP文件中解压缩 164
9.3.3 成立和增加到ZIP文件 164
9.4 项目:将富含美利哥作风日期的
文件改名称叫南美洲作风日期 165
第1步:为美利坚联邦合众国作风的日期成立八个
正则表达式 165
第2步:识别文件名中的日期
部分 166
第3步:构成新文件名,并对文本
改名 167
第4步:近似程序的主张 168
9.5 项目:将贰个文本夹备份到叁个
ZIP文件 168
第1步:弄清楚ZIP文件的
名称 168
第2步:创建新ZIP文件 169
第3步:遍历目录树并增多到
ZIP文件。 170
第4步:相同程序的想法 170
9.6 小结 171
9.7 习题 171
9.8 实行项目 171
9.8.1 采取性拷贝 171
9.8.2 删除无需的公文 172
9.8.3 清除缺失的数码 172
第10章 调试 173
10.1 抛出极度 174
10.2 获得反向追踪的字符串 175
10.3 断言 176
10.3.1 在交通灯模拟中应用
断言 177
10.3.2 禁止使用断言 178
10.4 日志 178
10.4.1 使用日志模块 178
10.4.2 不要用print()调试 180
10.4.3 日志等第 180
10.4.4 禁止使用日志 181
10.4.5 将日志记录到文件 182
10.5 IDLE的调节和测量试验器 182
10.5.1 Go 183
10.5.2 Step 183
10.5.3 Over 183
10.5.4 Out 183
10.5.5 Quit 183
10.5.6 调节和测量检验一个数字相加的
程序 184
10.5.7 断点 185
10.6 小结 187
10.7 习题 187
10.7 实行项目 188
调治将养硬币抛掷 188
第11章 从Web抓取新闻 189
11.1 项目:利用webbrowser模块的
mapIt.py 190
第1步:弄清楚URL 190
第2步:处理命令行参数 191
第3步:管理剪贴板内容,加载
浏览器 191
第4步:近似程序的主张 192
11.2 用requests模块从Web下载
文件 192
11.2.1 用requests.get(卡塔尔国函数下载
两个网页 193
11.2.2 检查错误 193
10.3 将下载的文本保留到硬盘 194
10.4 HTML 195
10.4.1 学习HTML的资源 195
10.4.2 急忙复习 195
10.4.3 查看网页的HTML
源代码 196
10.4.4 张开浏览器的开采者
工具 197
10.4.5 使用开拓者工具来寻觅
HTML元素 198
10.5 用BeautifulSoup模块解析
HTML 199
10.5.1 从HTML创造三个
BeautifulSoup对象 200
10.5.2 用select(卡塔尔国方法搜索成分 200
10.5.3 通过成分的性质获取
数据 202
10.6 项目:“I’m Feeling Lucky”
Google查找 202
第1步:获取命令行参数,并恳请
搜寻页面 203
第2步:找到全数的结果 203
第3步:针对每一个结果展开Web
浏览器 204
第4步:雷同程序的主见 205
10.7 项目:下载全部XKCD
漫画 205
第1步:设计程序 206
第2步:下载网页 207
第3步:搜索和下载漫画图像 207
第4步:保存图像,找到前一张
漫画 208
第4步:肖似程序的主见 209
10.8 用selenium模块调控浏览器 210
10.8.1 启动selenium控制的
浏览器 210
10.8.2 在页面中寻找成分 211
10.8.3 点击页面 212
10.8.4 填写并交由表单 212
10.8.5 发送特殊键 213
10.8.6 点击浏览器按钮 213
10.8.7 关于selenium的更多
信息 214
10.9 小结 214
10.10 习题 214
10.11 实行项目 215
10.11.1 命令行邮件程序 215
10.11.2 图像网址下载 215
10.11.3 2048 215
10.11.4 链接验证 215
第12章 管理Excel手表格 217
12.1 Excel文档 217
12.2 安装openpyxl模块 218
12.3 读取Excel文档 218
12.3.1 用openpyxl模块张开Excel
文档 219
12.3.2 从专门的学问簿中获得事业表 219
12.3.3 从表中拿到单元格 220
12.3.4 列字母和数字之间的
转换 221
12.3.5 从表中拿到行和列 222
12.3.6 工作薄、工作表、
单元格 223
12.4 项目:从手表格中读取
数据 223
第1步:读取电子手表格数据 224
第2步:填充数据构造 225
第3步:将结果写入文件 226
第4步:近似程序的思考 227
12.5 写入Excel文档 227
12.5.1 创造并保存Excel文书档案 227
12.5.2 制造和删除工作表 228
12.5.3 将值写入单元格 229
12.6 项目:更新二个电子手表格 229
第1步:利用修改新闻创设数量
结构 230
第2步:检查有着行,更新不许确的
价格 231
第4步:相通程序的合计 231
12.7 设置单元格的字体风格 232
12.8 Font对象 232
12.9 公式 234
12.10 调度行和列 235
12.10.1 设置行高和列宽 235
12.10.2 合并和拆分单元格 236
12.10.3 冻结窗格 237
12.10.4 图表 238
12.11 小结 240
12.11 习题 240
12.12 实践项目 241
12.12.1 乘法表 241
12.12.2 空行插入程序 241
12.12.3 电子钟格单元格翻转
程序 242
12.12.4 文本文件到电子手表格 242
12.12.5 石英钟格到文本文件 242
第13章 处理PDF和Word文档 243
13.1 PDF文档 243
13.1.1 从PDF提取文本 244
13.1.2 解密PDF 245
13.1.3 创建PDF 246
13.1.4 拷贝页面 246
13.1.5 旋转页面 247
13.1.6 叠合页面 248
13.1.7 加密PDF 249
13.2 项目:从多个PDF中合并
筛选的页面 250
第1步:找到全部PDF文件 250
第2步:展开各种PDF文件 251
第3步:增多每生机勃勃页 252
第4步:保存结果 252
第5步:相符程序的主见 253
13.3 Word文档 253
13.3.1 读取Word文档 254
13.3.2 从.docx文件中赢得完整的
文本 254
13.3.3 设置Paragraph和Run对象
的样式 255
13.3.4 制造带有非私下认可样式的
Word文档 257
13.3.5 Run属性 257
13.3.6 写入Word文档 258
13.3.7 增加标题 260
13.3.8 增加换行符和换页符 261
13.3.9 增加图像 261
13.4 小结 262
13.5 习题 262
13.6 实施项目 263
13.6.1 PDF偏执狂 263
13.6.2 定制邀请信,保存为Word
文档 263
13.6.3 暴力PDF口令破解
程序 264
第14章 处理CSV文件和JSON数据 265
14.1 csv模块 265
14.2.1 Reader对象 266
14.2.2 在for循环中,从Reader
对象读取数据 267
14.2.3 Writer对象 268
14.2.4 delimiter和lineterminator
主要字参数 269
14.3 项目:从CSV文件中剔除
表头 269
第1步:循环遍历每一种CSV
文件 270
第2步:读入CSV文件 270
第3步:写入CSV文件,没有
第一行 271
第4步:近似程序的主张 272
14.4 JSON和API 272
14.5 json模块 273
14.5.1 用loads(卡塔尔国函数读取
JSON 273
14.5.2 用dumps函数写出
JSON 273
14.6 项目:取伏贴前的气象数据 274
第1步:从命令行参数获取
位置 274
第2步:下载JSON数据 275
第3步:加载JSON数据并打字与印刷
天气 275
第4步:相像程序的主张 277
14.7 小结 277
14.8 习题 277
14.9 试行项目 277
Excel到CSV的转移程序 277
第15章 保持时间、安插职责和开发银行
程序 279
15.1 time模块 279
15.1.1 time.time()函数 279
15.1.2 time.sleep()函数 280
15.2 数字四舍五入 281
15.3 项目:顶级秒表 282
第1步:设置程序来记录时间 282
第2步:记录并打字与印刷单圈时间 283
第4步:相通程序的主张 283
15.4 datetime模块 284
15.4.1 timedelta数据类型 285
15.4.2 暂停直至特定日期 286
15.4.3 将datetime对象调换为
字符串 287
15.4.4 将字符串转变来datetime
对象 288
15.5 回看Python的日子函数 288
15.6 多线程 289
15.6.1 向线程的目的函数字传送递
参数 290
15.6.2 并咨询题 291
15.7 项目:多线程XKCD下载
程序 291
第1步:订正程序以利用函数 292
第2步:制造并运行线程 293
第3步:等待所无线程甘休 293
15.8 从Python运营别的程序 294
15.8.1 向波普n(卡塔尔传递命令行
参数 295
15.8.2 Task Scheduler、launchd和
cron 296
15.8.3 用Python展开网址 296
15.8.4 运营其余Python脚本 296
15.8.5 用暗中同意的应用程序张开
文件 297
15.9 项目:轻便的倒计时程序 298
第1步:倒计时 298
第2步:播放声音文件 298
第3步:形似程序的主张 299
15.10 小结 299
15.11 习题 300
15.12 实施项目 300
15.12.1 美化的秒表 300
15.12.2 铺排的Web漫画下载 301
第16章 发送电子邮件和短信 303
16.1 SMTP 303
16.2 发送电子邮件 304
16.2.1 连接到SMTP服务器 304
16.2.2 发送SMTP的“Hello”
消息 305
16.2.3 开始TLS加密 306
16.2.4 登录到SMTP服务器 306
16.2.5 发送电子邮件 306
16.2.6 从SMTP服务器断开 307
16.3 IMAP 307
16.4 用IMAP获取和删除电子
邮件 307
16.4.1 连接到IMAP服务器 308
16.4.2 登录到IMAP服务器 309
16.4.3 寻找电子邮件 309
16.4.4 选择文件夹 309
16.4.5 实行寻找 310
16.4.6 大小节制 312
16.4.7 取邮件并标识为已读 312
16.4.8 从原来新闻中拿走电子
邮件地址 313
16.4.9 从原来音讯中赢得正文 314
16.4.10 删除电子邮件 315
16.4.11 从IMAP服务器断开 315
16.5 项目:向会员发送会费提醒
电子邮件 316
第1步:打开Excel文件 316
第2步:查找全体未付成员 317
第3步:发送定制的电子邮件
提醒 318
16.6 用Twilio发送短信 319
16.6.1 注册Twilio账号 319
16.6.2 发送短信 320
16.7 项目:“只给笔者发短信”
模块 321
16.8 小结 322
16.9 习题 323
16.10 实施项目 323
16.10.1 随机分配家务活的电子
邮件程序 323
16.10.2 伞提示程序 324
16.10.3 自动退订 324
16.10.4 通过电子邮件调控你的
电脑 324
第17章 操作图像 327
17.1 Computer图像功底 327
17.1.1 颜色和RGBA值 328
17.1.2 坐标和Box元组 329
17.2 用Pillow操作图像 330
17.2.1 管理Image数据类型 331
17.2.2 裁剪图片 332
17.2.3 复制和粘贴图像到任何
图像 333
17.2.4 调度图像大小 335
17.2.5 旋转和扭转图像 336
17.2.6 纠正单个像素 338
17.3 项目:增多徽标 339
第1步:张开徽标图像 340
第2步:遍历全部文件并展开
图像 341
第3步:调解图像的大大小小 341
第4步:增添徽标,并保存
更改 342
第5步:相近程序的主见 343
17.4 在图像上壁画 344
17.4.1 绘制形状 344
17.4.2 绘制文本 346
17.5 小结 347
17.6 习题 348
17.7 实施项目 348
17.7.1 扩大和纠正本章项目标
程序 348
17.7.2 在硬盘上识别照片
文件夹 349
17.7.3 定制的座位卡 350
第18章 用GUI自动化调控键盘和
鼠标 351
18.1 安装pyautogui模块 351
18.2 走对路 352
18.2.1 通过撤消关闭全部程序 352
18.2.2 暂停和机关防故障装置 352
18.3 调控鼠标移动 353
18.3.1 移动鼠标 354
18.3.2 获取鼠标地点 354
18.4 项目:“现在鼠标在
哪里?” 355
第1步:导入模块 355
第2步:编写退出代码和极端
循环 355
第3步:获取并打字与印刷鼠标坐标。 356
18.5 调节鼠标人机联作 357
18.5.1 点击鼠标 357
18.5.2 拖动鼠标 357
18.5.3 滚动鼠标 359
18.6 管理荧屏 360
18.6.1 获取荧屏快速照相 360
18.6.2 深入分析显示器快速照相 360
18.7 项目:扩展mouseNow程序 361
18.8 图像识别 362
18.9 调整键盘 363
18.9.1 通过键盘发送多个
字符串 363
18.9.2 键名 364
18.9.3 按下和假释键盘 365
18.9.4 热键组合 365
18.10 复习PyAutoGUI的函数 366
18.11 项目:自动填表程序 367
第1步:弄清楚步骤 368
第2步:创设坐标 368
第3步:早先键入数据 370
第4步:管理选取列表和单选
按钮 371
第5步:提交表单并等待 372
18.12 小结 372
18.13 习题 373
18.14 试行项目 373
18.14.1 看起来很忙 373
18.14.2 即时通讯机器人 373
18.14.3 玩游戏机器人指南 374
附录A 安装第三方模块 375
附录B 运路程序 377
附录C 习题答案 381

环境

使用Visual Studio 2015 IDE编码。那不是贰个平移版本——需求PC计算机来玩那一个游乐。

Python编制程序神速上手—让繁缛职业自动化 PDF中文高清晰完整版可从以下新闻的获取下载:

豁免义务注解

那不是多少个OOP项目,它坚决守住程序性编程,固然有一些地方接收了OOP并且将经过委托给类对象。项目是用RAD方法成功的,以便使专门的工作进展。它供给重构。别的,笔者并未有信守任何命名约定。小编个人的溺爱是名字能够表达来意,在将鼠标悬停在名字上边的时候,你能够自动地询问项目。笔者的情趣是,变量’TheWordIntended’根据自己从不据守的正规命名约定应该有一个像’strTheWordIntended’那样的名字。那么些都以可以被重构的。

点击那一个http://www.linuxidc.com/Linux/2013-12/93755.htm 链接关怀Linux公社官方微信,关切后死灰复燃数字141563。就可以获取网络老铁的享受密码。

前程的干活

有为数不菲作业能够做——应用设计形式,OOP。作为软件开荒的庐山真面目目,重构是必需的。

如果裁撤关注Linux公社群众号,纵然再度关心,也将不恐怕提供本服务!

上一篇:10个顶级的CSS3代码生成器 下一篇:开发者必须知道的13件事情