三子棋代码内容:
1、利用二维数组,存储棋子 2、游戏开始页面
3、打印棋局 4、玩家下棋 5、电脑下棋 6、判断输赢
游戏代码思路:
好了,内容和思路都已经大概介绍完毕了;现在开始我们的C语言小游戏----三子棋。
第一步 创建三个文件
1.game.h----游戏函数的声明
2.text.c------测试游戏
3.game.c------游戏函数的实现
第二步 敲代码
第一步骤-----创建菜单
我们先想想,玩游戏时,是不是应该需要一个菜单,让我们选择 退出游戏 或者 开始游戏 而且我们不一定只玩一把游戏,所以需要一个循环,当我们游戏结束之后可以开始第二把。
所以我们先在text.c创建一个菜单函数 menu();
- #include<stdio.h>
-
- void menu()
- { printf("***********************");
- printf("********三子棋*********");
- printf("***********************");
- printf("开始游戏>1 退出游戏>0");
- }
-
- int main()
- {
- int input=0;
- while (1)
- {
- menu();
- printf("请选择:"):
- scanf("%d",&input);
- if(input==1)
- {
- //游戏开始
- }
- else if(input==0)
- {
- break; //退出游戏
- }
- else
- { printf("输入有误,重新输入"); }
第二步骤-----创建棋盘
三子棋、三子棋,很明显我们需要打印一个键盘,这样才能开始游戏;三子棋有9个空格,所以我们可以利用二维数组 board[3][3] 打印棋盘,先让二维数组存放的是' '(空格);之后下棋的时候,会用棋子代替;
初始化棋盘,我们可以创建init_board() 函数,也就是给二维数组赋值:
- void init_board(char board[ROW][COL],int row,int col)
- {
- for(int c = 0;c < row;c++)
- {
- for(int d = 0;d < col;d++)
- {
- board[c][d] = ' '; //给二维数组赋' ';
- }
- }
用二维数组的值打印棋盘,我们可以创建print_board () 函数:
- void print_board(char board[ROW][COL],int row,int col)
- {
- for(int c = 0;c < row;c++)
- {
- int d;
- for(d = 0;d < col;d++)
- {
- printf(" %c ",board[c][d]);
- if(d < col-1)
- {
- printf("|");
- }
- }
- printf("\n");
-
- if(c < row-1)
- {
- for(int q=0;q< col;q++)
- {
- printf("---");
- if(q < col-1)
- {
- printf("|");
- }
- }
- printf("\n");
- }
- }
- }
- //注:以上部分则是打印棋局,|和---是棋局的布置;
第三步骤-----人机下棋
玩家需要下棋,电脑也要下棋,并且在一方下完棋之后需要判断是否胜利,又或者是否棋盘满了平局。
玩家下棋,可以创建 player_board() :
- void player_board(char board[ROW][COL],int row,int col)
- {
- printf("玩家下棋,选择坐标:");
- while(1)
- {
- int rows; //行
- int cols; //列
- scanf("%d %d",&rows,&col);
- if( (rows < row) && (cols < col) &&
- board[rows][cols]==' ')
- {
- board[rows][cols] = '*';break; //当坐标是' ';用'*'代替
- }
- else printf("坐标有误,重新输入\n:");
- }
- }
电脑下棋,可以创建computer_board() :
- void computer_board(char board[ROW][COL], int row, int col)
- {
- int a, b;
- printf("机器人下棋\n");
- while (1)
- {
-
- a = rand() % (ROW+1);//行
- b = rand() % (COL+1);//列
-
- if (a <= row && b <= col &&
- board[a][b] == ' ')
- {
- board[a][b] = 'T';//当坐标为' ' ;则用'T'代替
-
- break;
- }
-
- }
- }
当棋手下棋之后需要判断,棋局是否满了,创建 full() 函数:
- char full(char board[ROW][COL]) {
- for (int i = 0; i < 3; i++)
- {
- for (int j = 0; j < 3; j++)
- {
- if (board[i][j] == ' ')return 'p';//棋盘未满,返回p值
- }
- }
- return 'x'; //棋局已满,返回x值
-
- }
有判断是否棋盘满,也应该判断是否胜利,创建使用 win() 函数:
- char win(char board[ROW][COL], int row, int col)
- {
- int i = 0;
- //判断三行
- for (i = 0; i < row; i++)
- {
- if (board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][0] != ' ')
- {
- return board[i][0];
- }
- }
- //判断三列
- for (i = 0; i < col; i++)
- {
- if (board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[0][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];
- }
- return full(board);
-
- }
第四步骤-----人机对局
现在可以进行对局了,但是因为是棋局,所以是你来我往的,需要使用循环,直到一方胜利。
现在定义一个game() 函数;
- void game()
- {
- char ret;
- char board[ROW][COL];
- init_board(board, ROW, COL);
- printfboard(board, ROW, COL);
- while (1) {
- player_board(board, ROW, COL);
- printfboard(board, ROW, COL);
- //判断输赢
- ret = win(board, ROW, COL);
- if (ret == '*') //返回值是*,则赢
- {
- printf("我赢了\n"); break;
- }
- else if (ret == 'x') //返回值是x,则是平局
- {
- printf("平局\n"); break;
- }
- computer_board(board, ROW, COL);
- printfboard(board, ROW, COL);
- //判断输赢
- ret = win(board, ROW, COL);
- if (ret == 'T') //返回值是T,电脑赢了;
- {
- printf("电脑赢了\n"); break;
- }
- else if (ret == 'x') //返回值是x,则是平局
- {
- printf("平局\n"); break;
- }
- }
-
- }
第三步 整合代码
第一小步
先在game.h头文件里申明函数名,为了更方便,还可以放入#include<stdio.h>,代码里因为使用了随机数,所以需要放置头文件#include<stdlib.h>、#include<time.h>;
还需要申明ROW的值和COL的值。
#include<stdio.h> #include<time.h> #include<stdlib.h> #define ROW 3 #define COL 3 //初始化棋盘 void init_board(char board[ROW][COL], int row, int col); //打印键盘 void printfboard(char board[ROW][COL], int row, int col); //玩家下棋 void player_board(char board[ROW][COL], int row, int col); //电脑玩家 void computer_board(char board[ROW][COL], int row, int col); //获胜条件 char win(char board[ROW][COL], int row, int col);
第二小步
先在text.c源文件里添加头文件#include"game.h",然后就可以调用头文件#include"game.h",
由于头文件里申明了函数,所以可以通过头文件访问game.c源文件,从而使用函数。
#include"game.h" void menu() { printf("*********************************\n"); printf("****************三子棋***********\n"); printf("*********************************\n"); printf("进入游戏:1 退出游戏:0\n"); } void game() { char ret; char board[ROW][COL]; init_board(board, ROW, COL); printfboard(board, ROW, COL); while (1) { player_board(board, ROW, COL); printfboard(board, ROW, COL); //判断输赢 ret = win(board, ROW, COL); if (ret == '*') { printf("我赢了\n"); break; } else if (ret == 'x') { printf("平局\n"); break; } computer_board(board, ROW, COL); printfboard(board, ROW, COL); //判断输赢 ret = win(board, ROW, COL); if (ret == 'T') { printf("电脑赢了\n"); break; } else if (ret == 'x') { printf("平局\n"); break; } } } void text() { int a=0; srand((unsigned)time(NULL)); //随机值 while (1) { menu(); scanf("%d", &a); if (a == 1) { printf("游戏开始\n"); game(); } else if (a == 0) { printf("退出游戏\n"); break; } else { printf("错误,重新输入\n"); } } } int main() { text(); return 0; }
第三小步
在game.c文件里先置放头文件#include"game.h", 因为头文件里申明了函数;所以可以创建 init_board() 、print_board ()、player_board() 、computer_board() 、full() 、win() 函数
#include"game.h" void init_board(char board[ROW][COL], int row, int col) { for (int i = 0; i < row; i++) { for (int j=0; j < col; j++) { board[i][j] = ' '; } } } void printfboard(char board[ROW][COL], int row, int col) { int i = 0; for (i; i < row; i++) { int j = 0; for (j; j < col; j++) { printf(" %c ", board[i][j]); if (j < col - 1) { printf("|"); } } printf("\n"); if(i < row - 1) { for (j = 0; j < col; j++) { printf("---"); if (j < col - 1) { printf("|"); } } printf("\n"); } } } void player_board(char board[ROW][COL], int row, int col) { int a, b; while (1) { printf("请输入你的坐标:"); scanf("%d %d", &a, &b); if (a <= row && b <= col && board[a-1][b-1] == ' ') { board[a-1][b-1] = '*'; break; } else printf("坐标有误"); } } void computer_board(char board[ROW][COL], int row, int col) { int a, b; printf("机器人下棋\n"); while (1) { a = rand() % 4; b = rand() % 4; if (a <= row && b <= col && board[a][b] == ' ') { board[a][b] = 'T'; break; } } } char full(char board[ROW][COL]) { for (int i = 0; i < 3; i++) { for (int j = 0; j < 3; j++) { if (board[i][j] == ' ')return 'p'; } } return 'x'; } char win(char board[ROW][COL], int row, int col) { int i = 0; //判断三行 for (i = 0; i < row; i++) { if (board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][0] != ' ') { return board[i][0]; } } //判断三列 for (i = 0; i < col; i++) { if (board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[0][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]; } return full(board); }
代码如上哦;
接下来,我们来编译程序吧;
很明显,代码运行成功了,这就是三子棋的简易代码,当然如果有兴趣,可以根据这个去写一些更多完善,美观的三子棋程序;可借用 easyx图形库 来。