使用c语言实现三子棋游戏

下面简介如何使用c语言的基础语法实现三子游戏的底层逻辑:

首先是菜单模块

使用switch语句进入游戏模块

前置交互完成,开始进入游戏函数。

第一部分棋盘创建,使用二维数组实现。

a.初始化棋盘

为什么要使用初始化棋盘

因为 char Board[ROW][COL] = { 0 };呈现的图像如下:

初始化后将该数组开栈,呈现效果如下:

每个空格内部均是char类型,有四个字节空间大小,不可认为只能存储一个字符。(使用for循环的过程可以视为是乘法,外层循环三次,内部循环三次,相乘就是九个单元啦!)

数组空间创建完成后就可以对其进行棋盘写入了。(for循环嵌套if语句进行实现)

因为实际上打印字符行和分割行是同时的,所以共用同一个外循环,因为分割行比字符行少一行,所以使用if语句限制。

呈现效果如下:

实现后棋盘之后就可以进行下棋啦!

下面实现玩家下棋的步骤:

代码如下

void player_move(char board[ROW][COL], int row, int col)

{

int i = 0;

int j = 0;

printf("please enter you want:>");//提示用户开始输入;

scanf("%d,%d", &i, &j);//用户输入自己想要的坐标;

if (i >= 1 && i <= row && j >= 1 && j <= col)//限制条件:1.判断横坐标是否合法;2.判断纵坐标是否合法;

{

if (board[i - 1][j - 1] == ' ')//如果一二条件合理,进入条件三进行判断,该坐标是否为空,如果为空即可进行写入;

{

board[i - 1][j - 1] = '*';//写入玩家的坐标,写入时注意,语法规定数组的计数方式从0开始计入,而玩家录入数据时是从1开始计数,所以要对进行减一处理;

}

else

{

printf("This position is ocupptated!\n");//如果数据不为空则提示玩家该空格已被占用;

}

}

else

{

printf("The putting is null,please input agian:>\n");//如果不能满足条件一二,不会跳入嵌入的if语句,而是直接跳出。

}

至此玩家下棋过程完成,接下来就是电脑下棋。

-----------------------------------------------------分割行-----------------------------------------------------------

电脑下棋主要有两个步骤:1.随机生成合理坐标;2.赋值。

具体代码如下:

 

void computer_move(char board[ROW][COL], int row, int col)

{

int i, j;

printf("computer's turn!\n");//提示该环节为电脑回合;

while (1)

   {

srand((unsigned int)(time(NULL)));//使用时间戳生成随机数用unsigned类型转化为非负数。

i = rand() % ROW;//确保横向坐标合理;

j = rand() % COL;//确保纵向坐标合理;

     if (board[i][j] == ' ')判断生成坐标是否为空;

    {

board[i][j] = '#';//在合法坐标录入棋子;

break;//确保坐标合法后跳出循环;

    }if语句括号;

  }//while循环括号;

}//函数大括号;

电脑下棋完成;

      --------------------------------------------分割行-------------------------------------------------

在每轮对弈之后都应判断一次游戏是否结束,而三子棋的游戏规则是,某玩家的三颗棋子横向、纵向、或者对角线相同,且该字符不为空,由于这只是个简易的棋盘,我们只要对上述的规则需求进行简单抽象即可;

代码如下:

 

char judge_who_win(char board[ROW][COL], int row, int col)//判断胜负;//函数的返回类型设置为“char”,返回类型断定为字符型,“()”内部为数组传参;

{

int i = 0;

int j = 0;

for (i = 0; i < col; i++)//使用for循环对纵向坐标进行推进;

{

if (board[0][i] == board[1][i] &&board[1][i] == board[2][i] && board[0][i] !=' ')//采用枚举的方法罗列出横向坐标;

{

return board[0][i];//满足条件一横向棋子的类型均相同,返回该棋子类型,跳出判定环节;

}

}

for (j = 0; j < row; j++)//同理,使用for循环对纵列进行推进;

{

if (board[j][0] == board[j][1] && board[j][1] == board[j][2] && board[j][0] != ' ')//枚举纵向坐标,并且判断棋子类型是否相等;

{

return board[j][0];//返回字符;

}

}

if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[0][0] != ' ')//由于侧向赢得的情况只有两种,且棋盘较为基础,进行数字枚举即可,不需使用数学方法进行归纳输出;(此类为由左上推进至右下;

{

return board[0][0];//返回字符类型;

}

if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[1][1] != ' ')//该种状态为由左下推进至右上;

{

return board[0][2];//返回类型;

}

int a = judge_full(board, row, col);//如果上述判断输赢的指定没有执行,即说明游戏没有结束或者结果为平局,嵌套一个函数来对以上逻辑进行机械翻译;

/* 

 

int judge_full(char board[ROW][COL], int row, int col)//判断棋盘是否满了,即游戏是否平局;

{

int y = 0;

for (y = 0; y < row; y++)//依然嵌套两个for循环;

{

int x= 0;

for (x = 0; x < col; x++)

{

if (' ' != board[x][y])依次判定棋盘的每个坐标上是否为空;

{

return 0;//如果为空返回值就为0,所以这个函数的返回类型为整形;

}

}

}

return 1;//如果坐标全部不为空,即返回0;

} */

if (a == 0)

{

return 'C';

}

return 'Q';

}

//至此该游戏的核心逻辑已经用简单的c语言呈现啦!快来对其进行拼装吧!

-------------------------------------------分割行-------------------------------------------------------

//game函数内,各个模块代码的运行:

//代码呈现:

 

void game()

{

char Board[ROW][COL] = { 0 };//创建数组为开创棋盘提供空间;

int row = 0;

int col = 0;

init_board(Board, ROW, COL);//初始化棋盘。

creat_board(Board, ROW, COL);//打印棋盘。

char a;

while (1)

{

player_move(Board, ROW, COL);//玩家下棋;

creat_board(Board, ROW, COL);//呈现玩家下棋结果;

a = judge_who_win(Board, ROW, COL);

if (a != 'C')//判断游戏是否继续;

{

printf("Peaceful!");

break;

}

printf("\n");

computer_move(Board, ROW, COL);//如果游戏继续电脑进行下棋;

creat_board(Board, ROW, COL);//呈现电脑下棋结果;

printf("\n");

}

if (a == '#')

{

printf("Computer wins\n");

break;

}

if (a == '*')

{

printf("You are winner\n");

break;

}

if (a == 'Q')

{

printf(" No one win,No one lose\n");

break;

}

}//至此对游戏的分装也就结束了,让我们回到主函数对游戏进行包装!

代码如下呈现:

int main(void)

{

srand((unsigned int)(time(NULL)));//使用时间戳生成随机数用unsigned类型转化为非负数。

int input = 0;

char Board[ROW][COL] = { 0 };

//menu();

do//先玩一次再说;

{

menu();//呈现菜单,玩家决定是否进入游戏;

printf("Please enter your chiose:>\n");

scanf("%d", &input);

switch (input)

{

case 1://显示游戏开始;

printf("Begianing!\n");

game();//进入游戏核心过程;

break;

case 2://再见!

printf("GOOD GAME!\n");

break;

default:

printf("Please input again!\n");//这是一个有个性的玩家!

}

//break;

} while (input);

return 0;

}

自此我们使用了简单的代码语句完成了三子棋游戏的构造,c语言确实是一种神奇的语言!对逻辑的呈现,我相信你一定可以!让我们一起加油!

tips:开源代码存在gitee账户中,地址如下:工作台 - Gitee.com.

感谢阅读!

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值