1.菜单的模拟
我在制作菜单的时候是先打印出底图,然后利用getch()获取按键的信息,然后根据接收到的信息,利用标准输出句柄和SetConsoleTextAttribute()函数来变换相应选项的颜色,让使用者看起来像是真的在控制选项的移动。并且根据已经选定的相应选项,在玩家按下回车或者空格的时候进入到游戏中去。
2.贪吃蛇
在贪吃蛇游中,我定义了三个个自定义函数,分别是snake_mobile,control,snak_rand。
snak_rand函数的主要功能就是在地图中的随机位置产生食物,其中我利用随机函数rand,还设置了一个判断选项,判断随机出来的点位是否可用,如果不可用,那么则重新随机。在这里,为了防止死循环,我设置了一个防死循环的变量,记录循环的次数,当循环一定次数的位置均不可用时,则证明,已经没有可用点了。
control函数的功能则是获取当前按了那个键,并且返回相应的返回值,其中我利用了kbhit() 函数,该函数判断按键有没有被按下,按下是,没有按下返回0,是非阻塞函数 。
snake_mobile函数的功能是 ,根据control 函数来使地图产生相应的变化,即,让蛇动起来。其中我利用了数组来保存蛇体,每次蛇移动的时候,我就将他要移动到的下一个坐标加入到数组的下一个位置,并且将蛇尾的坐标踢出数组。然后打印出发生变化的部位。在这里为了防止在游戏中蛇会回头以及贴墙按方向键会死掉的bug,我设置了一个中间变量来保存蛇的上一次的移动方向,如果蛇根据按键移动的当前方向不合理,那么则按照之前的方向行走。这个小技巧,很好的解决了蛇会无故死亡的bug。
3.五子棋
在五子棋游戏中,我设计了7个自定义函数,分别是chess_game_2 ,chess_control_2 ,chess_game_1 ,chess_control_1 ,get_ai ,chess_judge ,get_weight 。
chess_judge函数的功能是判断是否有人获胜,即,连成五子。其中我利用了一个双重循环来遍历整个地图,每次判断以该点开始的左下,下,右下,右是否出现连成的五子,如果出现,则返回相应返回值。在这里我只搜了四个方向而不是八个方向,因为,相反的四个方向在前几次循环中一定已经被搜过,所以后面就可以省略了。
get_weight函数的主要功能是,获取当前各点的权值,这里我利用了多重循环来判断五子棋中的活2,死2,活3,死3,活4,双活3等点,然后根据相应的情况给该点打分。
get_ai函数的主要功能是在人机对战中给让电脑落子,其中我利用了一个循环来确定当前的最高权值可用点,让后让电脑确定在该点落子,如果出现了多个最高权值点,那么则随机选择一个。
chess_control_2和chess_control_1函数的主要功能是通过句柄控制光标的移动以及让玩家通过空格键落子。
chess_game_2和chess_game_1函数则是进行一些细节 的处理,即下棋选手的交换等。
4.俄罗斯方块
在俄罗斯方块游戏中我设计了7个自定义函数,分别是rock_down ,rock_remove ,update ,rock_coor ,rock_control ,rock_flip ,rand_rock 。
rand_rock函数的功能是随机在我预存的方块中选出一个。和贪吃蛇一样,在这里我也同样用了随机函数rand()。
rock_flip函数的功能是将当前方块进行翻转,其中这里我利用双重循环写了了一个矩阵90度翻转的函数,来进行翻转。
rock_coor函数的作用是获取当前方块的各种属性,比如方块的高度,宽度,坐标等。函数内部我通过双重循环来计算出方块的最高点和点,以及最左边的点和最右边的点,最后利用这些数据计算出方块的相应属性。
rock_control函数的功能是获取当前的按键信息,其中我利用了GetAsyncKeyState 函数,GetAsyncKeyState()它返回最近的键盘消息从线程的队列中移出时的键盘状态,判断刚按过了某键。是支持多线程的函数。然后我根据相应的按键,返回相应的返回值。
update函数的功能是对,游戏地图进行刷新,使得地图显示正确。(主要是在方块消除后调用)其中我利用了数组数值进行相应判断,打印出相应的图形。
rock_remove函数的功能是对游戏地图中满一行的方块进行消除,并且记录相应得分的。其中我在当前落点从下往上找四个距离,找到可消除行并且记录。接着计算出消除掉的行数,将没被消除的行移动到底下,按顺序从下往上打印,将消除行数以上的位置,整体向下移动消除行数。
rock_down函数的功能是在方块下落的时候,根据各种信息的变化,来进行地图的局部更新和处理,是该游戏中的最核心的函数。在该函数中我调用了rock_control函数来获取按键信息,其中我,增加来一些if语句来判断,当前操作是否合理,如果合理则根据相应的信息来对地图进行处理。当方块落到底部的时我设置了一个if语句来判断,如果是那么就进行是否产生消除函数的判断以及地图更新。