人气 481

[游戏程序] 三维圈夹游戏人机编程[转帖] [复制链接]

九艺网 2017-3-10 17:02:23

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

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

x
三维圈夹游戏人机编程[table=560]
[table=560][tr][td]游戏规则:市面上有一些三维的圈夹游戏商品,最常见的一种有4层透明塑料版,每层有4*4形式的洞。两人玩时轮流把有颜色的棋子放入空着的洞中,最先将4个同色的棋子连成一条线的人赢。连线的方式有许多种,可以是水平的、垂直的,或者有角度的。
分析:4个棋子共有76条可能连成的直线。每一层,与边平行的直线有8条,再加上2条对角线,所以每一层水平的直线就有10条,4层总共就有40条。还有16条垂直线,4条长对角线,以及在8个垂直面中,
每个面上的2条对角线。
设计方案:根据下此棋子的得分来判定:(以黑棋为例)
        (1):在一个空白的直线上加黑棋+1分
            在只有一个白棋的直线上加黑棋+2分
            在只有一个黑棋的直线上加黑棋+3分
            在有两个黑棋的直线上加黑棋+4分
            在有两个白棋的直线上加黑棋+5分
            在有三个黑棋的直线上加黑棋 一定执行。返回成功
            在有三个白棋的直线上加黑棋+100分
        (2):然后,下这个点的棋子影响的直线的得分总和如果最大的就下这个点。

给出代码:
<div class="codesamp">
//此版本不考虑图形的显示在很多属性没有纪录:
#include
#include
#include
#define MAX 100

//pMatixLine<i>[7]纪录了下这个点的棋子与76条直线的那条直线有关
int pMatixLine[64][7]=
{{1,5,9,41,57,61,69},{1,6,42,63,0,0,0},{1,7,43,65,0,0,0},{1,8,10,44,58,67,70},
{2,5,45,71,0,0,0},{2,6,9,46,0,0,0},{2,7,10,47,0,0,0},{2,8,48,72,0,0,0},
{3,5,49,73,0,0,0},{3,6,10,50,0,0,0},{3,7,9,51,0,0,0},{3,8,52,74,0,0,0},
{4,5,10,53,59,62,75},{4,6,54,64,0,0,0},{4,7,55,66,0,0,0},{4,8,9,56,60,68,76},
{11,15,19,41,0,0,0},{11,16,42,69,0,0,0},{11,17,43,70,0,0,0},{11,18,20,44,0,0,0},
{12,15,45,61,0,0,0},{12,16,19,46,57,63,71},{12,17,20,47,58,65,72},{12,18,48,67,0,0,0},
{13,15,49,62,0,0,0},{13,16,20,50,59,64,73},{13,17,19,51,60,66,74},{13,18,52,68,0,0,0},
{14,15,20,53,0,0,0},{14,16,54,75,0,0,0},{14,17,55,76,0,0,0},{14,18,19,56,0,0,0},
{21,25,29,41,0,0,0},{21,26,42,70,0,0,0},{21,27,43,69,0,0,0},{21,28,30,44,0,0,0},
{22,25,45,62,0,0,0},{22,26,29,46,60,64,72},{22,27,30,47,59,66,71},{22,28,48,68},
{23,25,49,61,0,0,0},{23,26,30,50,58,63,74},{23,27,29,51,57,65,73},{23,28,52,67,0,0,0},
{24,25,30,53,0,0,0},{24,26,54,76,0,0,0},{24,27,55,75,0,0,0},{24,28,29,26,0,0,0},
{31,35,39,41,60,62,70},{31,36,42,64,0,0,0},{31,37,43,66,0,0,0},{31,38,40,44,59,68,69},
{32,35,45,72,0,0,0},{32,36,39,46,0,0,0},{32,37,40,47,0,0,0},{32,38,48,71,0,0,0},
{33,35,49,74,0,0,0},{33,36,40,50,0,0,0},{33,37,39,51,0,0,0},{33,38,52,73,0,0,0},
{34,35,40,53,58,61,76},{34,36,54,63,0,0,0},{34,37,55,65,0,0,0},{34,38,39,56,57,67,75}};
typedef enum LineStyle{empty,oneblack,towblack,threeblack,onewhite,towwhite,threewhite,mix,succeed}MyLineStyle;
typedef enum ChessmanStyle{without,chessblack,chesswhite}MyChessmanStyle;
//typedef enum ChessmanStyle{without,have}MyChessmanStyle;
typedef enum CurrentChess{black,white}MyCurrentChess;
//实现根据chess的输入改变alllinestyle影响的线条状态和allchess棋子的状态以方便下此选择的过滤
//返回1成功
int ChangeState(int IFblack,MyLineStyle AllLineStyle[76],int chess,MyChessmanStyle AllChess[64]);
//计算如果下这位置的得分数
//变成有唯一一个自己的+1
//变成有二个的+3
//变成有三个的+4
//变成有四个的+max+1
//破坏对方三个的+max
//破坏对方一个的+2
//破坏对方二个的+5
//从本来就无用的变成有用的+0
//返回-1为成功,必选
int SingleCount(int IFblack,int chess,MyLineStyle AllLineStyle[76]);
//实现选择那个方案最理想返回下的棋子位置
//返回-1无棋子可下
int ProjectSelect(int IFblack,MyLineStyle AllLineStyle[76],MyChessmanStyle AllChess[64]);
//白棋用户的输入状态
int InputChess(int IFblack,MyChessmanStyle AllChess[64]);
//打印棋盘
int chessboard(MyChessmanStyle AllChess[64]);
//打印菜单
char menu();
//人-机游戏
int mantocomputer();
//单机版人与人游戏
int mantoman();
//游戏规则
int ReadMe();
int ChangeState(int IFblack,MyLineStyle AllLineStyle[76],int chess,MyChessmanStyle AllChess[64])
{
int i;
int curline;
if (AllChess[chess]) {printf("Did not chance input ");return 0;}
// AllChess[chess]=have;
if(IFblack)//白棋下
{  
  AllChess[chess]=chesswhite;
  for(i=0;i
回复

使用道具 举报

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

QQ|手机版|小黑屋|九艺游戏动画论坛 ( 津ICP备2022000452号-1 )

GMT+8, 2024-4-19 10:22 , Processed in 0.163033 second(s), 23 queries .

Powered by Discuz! X3.4  © 2001-2017 Discuz Team.