摘要:文章目录三子棋的设置的内容设置的设置棋盘的内容棋盘以及棋盘的初始化打印棋盘下棋步骤玩家下棋电脑下棋判断是否胜利三子棋三子棋的规则是在的棋盘里,双方轮流下子以和表示,先将个子连成一条线横竖斜都可以的一方获胜下面是三子棋语
三子棋的规则是:在3x3的棋盘里,双方轮流下子(以X和O表示),先将3个子连成一条线(横竖斜都可以)的一方获胜
下面是三子棋C语言实现的几个问题:
1.要想实现三子棋,我们需要一个棋盘,然后就是棋盘的内容。
2.下棋的时候需要判断是否该位置合法。
3.玩家和电脑的下棋逻辑不同,玩家需要手动输入,电脑是自己下棋
4.每下一步棋都需要判断游戏是否结束(哪方胜利、平局还是继续下棋)。
设计方式:
需要创建三个文件:一个头文件,两个源文件,头文件里面放的是函数的声明以及一系列预处理命令,命名为game.h
两个源文件,一个里面放的是主函数(游戏大体的运行顺序),命名为work.c,一个里面放的是游戏内容的实现逻辑(放大部分执行函数),命名为game.c
首先是进入游戏,为了确保游戏可以重复玩,我们可以以循环的方式实现
//work.c里面的内容#include"gmae.h"//这样的话,在game.h里面包含的文件,在work.c里面也能使用int main(){ int option = 0;//在主函数里面设计循环,可以保证每次游戏结束后可以选择继续游戏或者退出游戏 do { Menu(); scanf("%d", &option); switch (option) { case 1: game();//如果选择开始游戏,就会进入到game()函数, /*我们需要定义game函数来存放游戏的实现顺序*/ break; case 0: printf("已退出"); break; default : printf("错误选择,请重新输入"); } } while (option); return 0;}
//work.c里面的内容void Menu()//定义菜单函数,配合主函数里面的循环,可以实现每次游戏结束会跳到这个界面{ printf("*****************/n"); printf("*** 1.play ****/n"); printf("*** 0.exit ****/n"); printf("*****************/n"); printf("请选择");}
然后就是游戏进行的顺序需要在game函数里面实现
//work.c里面的内容void game(){ srand((unsigned int)time(NULL));//使用随机数,便于后面电脑下棋时是随机出棋 char board[ROW][COL] = { 0 };//创建一个二维数组,用来实现棋盘的内容 printf("游戏开始:/n"); init_board(board,ROW,COL);//初始化棋盘 print_board(board, ROW, COL);//打印棋盘 while (1) { char ret = "0"; player_move(board, ROW, COL);//玩家下棋 print_board(board, ROW, COL);//打印棋盘 ret = is_win(board, ROW, COL);//判断是否结束 if (ret == "*") { printf("玩家胜利/n"); break; } computer_move(board, ROW, COL);//电脑下棋 print_board(board, ROW, COL);//打印棋盘 ret = is_win(board, ROW, COL);//判断是否结束 if (ret == "#")// { printf("电脑胜利/n"); break; }//判断电脑胜利 if (ret == "Q")//判断平局 { printf("平局/n"); break; }//判断平局 }}
下面是对这几点问题的解决方法:
#define _CRT_SECURE_NO_WARNINGS 1#define ROW 3#define COL 3//设置了行与列的值,可以更改#include #include //用来实现时间戳//下面是游戏实现逻辑所需的函数声明。void init_board(char board[ROW][COL], int row, int col);void player_move(char board[ROW][COL], int row, int col);void computer_move(char board[ROW][COL], int row, int col);void print_board(char board[ROW][COL], int row, int col);char is_win(char board[ROW][COL], int row, int col);
我们通过创建一个二维数组来作为棋子,通过输入坐标的方式来进行下棋的步骤
创建数组:
char board[ROW][COL] ;这里括号里面的值我们用提前处理过的ROW与COL来表示, 通过预处理命令,我们后期可以很方便的更改ROW与COL的值来改变棋盘的大小
棋盘是3x3形式,所以我们可以通过循环的方式打印一个棋盘,下面是棋盘的格式
0 | 0 | 0 ---|---|--- 0 | 0 | 0---|---|--- 0 | 0 | 0 //而这个表里面的0就是我们的下的棋子占有的位置 /*而这个棋盘的设计是有明显的规律的: 第一行: 空格%c空格 第二行:---|循环3遍,但是最后遍不打印“|” 然后这样的两行在循环中多次打印,就出现了这样的三子棋表格 注意:最后一行不用再打印“---”
这里我们定义init_board()函数来初始化棋盘(即让数组的所有元素的值都为空格)
void init_board(char board[ROW][COL], int row, int col){ int i = 0; int j = 0; for (i = 0; i < row; i++) { for (j = 0; j < col; j++) { board[i][j] = " ";//把所有元素赋值为" " } }}
void print_board(char board[ROW][COL], int row, int col){ int i = 0; int j = 0; for (i = 0; i < row; i++) { for (j = 0; j < col; j++) { printf(" %c ", board[i][j]); if (j != col - 1) { printf("|");//最后一列不打印"|" } } //每次进行上一个循环时,i的值在变化,打印的是不同的值 printf("/n"); if (i != row - 1)//最后一行不打印字符 { for (j = 0; j < col; j++) { printf("---"); if (j != col - 1) printf("|"); } } printf("/n"); } printf("/n");}
void player_move(char board[ROW][COL], int row, int col){ printf("玩家下棋:/n"); int x = 0; int y = 0; int i = 0; int j = 0; while (1) { scanf("%d %d", &x, &y); if (x >= 1 && x <= row && y <= col & y >= 1) { if (board[x-1][y-1] == " ") { board[x-1][y-1] = "*"; break; } else { printf("该坐标被占用,请重新输入/n"); } } } }
void computer_move(char board[ROW][COL], int row, int col){ char x = 0; char y = 0; while (1) { x = rand() % row; y = rand() % col; if (board[x][y] == " ") { board[x][y] = "#"; break; } }}
char is_full(char board[ROW][COL], int row, int col) //判断是否格子占满了,格子占满了还没有出现胜利的话就会判断平局{ int i = 0; int j = 0; for (i = 0; i < row; i++) { for (j = 0; j < col; j++) { if (board[i][j] = " ") return 0;//用是否还有空格判断平局 } }}char is_win(char board[ROW][COL], int row, int col)//这里是判断横竖斜三种方式是否出现胜利{ int i = 0; int j = 0; int count = 0; for (i = 0; i < row; i++) { if ((board[i][0] == board[i][1])&&(board[i][1]==board[i][2])&&board[i][1]!=" "); { return board[i][0]; } } for (i = 0; i < row; i++) { if ((board[0][i] == board[1][i])&&(board[2][i]==board[1][i]) && board[1][i] != " ") { return board[0][i]; } } if ((board[0][0] == board[1][1]) &&( board[1][1] == board[2][2]) && board[1][1] != " ") { return board[1][1]; } if ((board[0][2] == board[1][1] )&& (board[1][1] == board[2][0]) && board[1][1] != " ") { return board[1][1]; } //一旦出现胜利,就返回胜利一方的棋子字符 if (is_full(board,ROW,COL)) { return "Q";//平局返回"Q" } else return "C";//什么情况都没有就继续游戏}
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/123074.html
摘要:简单介绍了三子棋原理后接下来为大家讲解分步目标及代码如何实现。电脑下棋我们实现了玩家和电脑的下棋后,我们需要编写一个函数来判断双方的输赢。我们使用函数来实现这一目标。 目录 1.三子棋原理 2.分块代码实现 3.总结 1.首先向大家介绍一下三子棋的原理 首先我们需要有一个棋盘,初始时棋...
摘要:三子棋目录一问题介绍三子棋,在民间又叫井字棋。因为人们在游玩时常常不画棋盘的边框,正如汉字中的井字,多称为井字棋。 三子棋 目录 一、问题介绍 三子棋,在民间又叫井字棋。因为人们在游玩时常常不画棋盘的边框,正如汉字中的井字,多称为井字棋。 三子棋的游戏规则十分的简单: ...
摘要:今天博主将为大家带来语言入门级小游戏三子棋井字棋的详细介绍,希望这篇文章对大家能有帮助。在这里,我们使用函数来实现这一功能。 今天博主将为大家带来C语言入门级小游戏——三子棋(井字棋)的详细介绍,希望这篇文章对大家能有帮助 。 在编程的学习过程中,编写一些中这样...
摘要:前言本篇文章记录了用语言实现三子棋小游戏,主要目的是对之前语言知识学习的巩固,联系各个知识,以及怎么样实际使用各个知识。效果显示函数当玩家输入时,跳入到游戏的实现代码之中。这里调用了函数,实现代码如下由于在这里强制转化为正整数。 前言 本篇文章记录了用C语言实现三子棋小游戏,主要目...
阅读 648·2021-11-11 16:55
阅读 2159·2021-11-11 16:55
阅读 1950·2021-11-11 16:55
阅读 2340·2021-10-25 09:46
阅读 1597·2021-09-22 15:20
阅读 2267·2021-09-10 10:51
阅读 1702·2021-08-25 09:38
阅读 2612·2019-08-30 12:48