博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C语言实现小游戏——三子棋(Three Peices Chess)
阅读量:4149 次
发布时间:2019-05-25

本文共 5182 字,大约阅读时间需要 17 分钟。


前言


相信不少小伙伴都玩过五子棋,其实三子棋和它的游戏规则一样,谁在行/列/对角线上连成直线,谁就获得胜利。

接下来用C语言实现它


Code and Explain


首先为了方便代码编写,实现系统试编程。在工程里定义3个文件:

1

其中,tpc.h是用来存放宏定义和函数声明的头文件

tpc.c是头文件中声明函数的具体实现

test.c则是用来测试代码的源文件。

下面给出各个模块的代码并解释:

首先,tcp.h

#ifndef __TPC_H__#define __TPC_H__//棋盘的行和列,为了方便修改所以定义成宏。因为是三子棋所以定义为3#define COLS 3#define ROWS 3//下面是各种函数声明void init_board(char board[ROWS][COLS], int rows, int cols);//初始化棋盘void    display_board(char board[ROWS][COLS], int rows, int cols);//打印棋盘void player_move(char board[ROWS][COLS], int rows, int cols);//玩家操作void computer_move(char board[ROWS][COLS], int rows, int cols);//电脑操作char check_win(char board[ROWS][COLS], int rows, int cols);//判断输赢#endif

其次,tpc.c:

#define _CRT_SECURE_NO_WARNINGS#include "tpc.h"#include
#include
void init_board(char board[ROWS][COLS], int rows, int cols)//初始化棋盘(数组){ memset(board, ' ', sizeof(char)*cols*rows);//用库函数代替for循环初始化数组,提高效率}void display_board(char board[ROWS][COLS], int rows, int cols)//打印棋盘{ int i = 0; for (i = 0; i < rows; i++) { printf(" %c | %c | %c \n", board[i][0], board[i][1], board[i][2]); if (i != rows - 1) { printf("---|---|---\n"); } }}void player_move(char board[ROWS][COLS], int rows, int cols)//玩家操作{ int x = 0; int y = 0; while (1) { printf("请输入坐标:>"); scanf("%d%d", &x, &y); x--;//此举是为了方便玩家操作,玩家输入的第一行第一列实际上是是数组下标的0 0,所以要-- y--; if ((x >= 0) && (x <= rows - 1) && (y >= 0) && (y <= cols - 1))//判断输入合法性 { if (board[x][y] = ' ') { board[x][y] = 'P'; break; } else { printf("tips:该位置已经放有数据了哦,请重新输入坐标。\n"); } } }}void computer_move(char board[ROWS][COLS], int rows, int cols)//电脑操作{ while (1)//电脑操作不需要判断合法性,因为它不可能非法 { int x = rand() % 3; int y = rand() % 3; if (board[x][y] = ' ')//没放数据的位置才可以放 { board[x][y] = 'C'; break; } }}static int Is_full(char board[ROWS][COLS], int rows, int cols)//判断棋盘是否为空,用于checkwin函数调用//使用static使其不带外部链接属性{ int i = 0; int j = 0; for (i = 0; i < rows; i++)//便利棋盘数组判断棋盘状态 { for (j = 0; j < cols; j++) { if (board[i][j] == ' ') return 0;//棋盘未满 } } return 1;//棋盘已满}char check_win(char board[ROWS][COLS], int rows, int cols)//判断输赢{ int i = 0; //判断3行3列,直接用for循环 for (i = 0; i < rows; i++) { if ((board[i][0] == board[i][1]) && (board[i][1] == board[i][2]) && (board[i][1] != ' ')) { return board[i][1]; } if ((board[0][i] == board[1][i]) && (board[1][i] == board[2][i]) && (board[1][i] != ' ')) { return board[1][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, rows, cols)) { return 'Q';//如棋盘已满,则为平局 } return ' ';//输出空格表示棋盘未满,且无人赢。此时游戏继续}

最后就是test.c:

#define _CRT_SECURE_NO_WARNINGS#include
#include
#include"tpc.h"#include
#include
void menu()//菜单,可以自己设置{ printf("|************Tic-Tac-Toe Game***********|\n"); printf("|----------------------------------------|\n"); printf("|********* 1.play *********|\n"); printf("|********* 0.exit *********|\n"); printf("|________________________________________|\n"); printf("\n");}enum OPTION//用枚举来定义操作,便于代码编写,提高程序可读性{ EXIT, PLAY};void game(){ char board[ROWS][COLS] = { 0 };//定义并初始化棋盘数组 char ret = 0;//checkwin的返回值 init_board(board, ROWS, COLS); display_board(board, ROWS, COLS); while (1)//玩家和电脑一直进行操作直到条件不满足退出 { //玩家操作 player_move(board, ROWS, COLS); display_board(board, ROWS, COLS); ret = check_win(board, ROWS, COLS); //判断游戏是否结束 if (ret != ' ')//游戏并没有结束 break; //电脑操作 computer_move(board, ROWS, COLS); printf("Compter Move:\n"); printf("\n"); display_board(board, ROWS, COLS); ret = check_win(board, ROWS, COLS); //判断游戏是否结束 if (ret != ' ') break; } //判断输赢 if (ret == 'P') { printf("The Winner is YOU~\n"); } else if (ret == 'C') { printf("The Winner is Computer~\n"); } else { printf("Both of you are Winner~\n"); }}int main(){ int input = 0; srand((unsigned)time(NULL)); do//使用do while循环 { menu();//默认打印menu printf("请选择>:"); scanf("%d", &input); switch (input) { case PLAY: printf("开始游戏~\n"); printf("\n"); game(); break; case EXIT: break; default: printf("您的输入有误,请重新选择!!!\n"); break; } } while (input); system("pause"); return 0;}

测试


玩家赢

玩家赢真的很容易,不信你试试。。

2

3

电脑赢双赢就不测试了,太难了。

你可能感兴趣的文章
腾讯T3亲自讲解!字节大牛耗时八个月又一力作,大牛最佳总结
查看>>
你所不知道的Android原生开发的现状,手慢无
查看>>
做了3年Android还没看过OkHttp源码?小白也能看明白
查看>>
免费Android高级工程师学习资源,挥泪整理面经
查看>>
全世界都在问Android开发凉了吗?赶紧收藏!
查看>>
全世界都在问Android开发凉了吗?送大厂面经一份!
查看>>
全网最具深度的三次握手、四次挥手讲解,最全Android知识总结
查看>>
全网最具深度的三次握手、四次挥手讲解,看这一篇就够了!
查看>>
全网最具深度的三次握手、四次挥手讲解,知乎上转疯了!
查看>>
全靠这份Android知识点PDF大全,完整版开放下载
查看>>
关于Android程序员最近的状况,大厂内部资料
查看>>
从草根到百万年薪程序员的十年风雨之路,成功收获美团,小米安卓offer
查看>>
价值2000元的学习资源泄露,实战篇
查看>>
作为移动开发程序员,2021年Android开发者跳槽指南,实战篇
查看>>
你了解过移动端适配吗?文末领取面试资料
查看>>
你有过迷茫吗?完整版开放下载
查看>>
全套学习!2021最新Android大厂面试真题大全,已拿到offer
查看>>
全靠这份Android知识点PDF大全,详细的Android学习指南
查看>>
看完不会的来打我!想给金三银四找工作的程序员几点建议,社招面试心得
查看>>
真的已经讲烂了!34岁安卓开发大叔感慨,全网最新
查看>>