本文共 5334 字,大约阅读时间需要 17 分钟。
用数组写三子棋游戏
建立一个井字棋盘,玩家与电脑分别下棋,三个棋子能连成一条线就获胜。
玩家和电脑每次落子之后,都打印出棋盘的情况,并将其储存。
1、前期准备工作
建立game.h头文件,text.c文件, game.c文件。
game.h头文件用于声明函数,text.c文件用于编写游戏流程,game.c文件用于编写函数内容2、设立菜单、棋盘
在text.c内进行操作:
引入自定义头文件用#include “game.h”,不同于引入C语言自带的头文件用< >,引入自定义的头文件要用" "。 设主函数:int main(){ text(); return 0;}
设text函数:(因为需要游戏可以重复玩,所有使用do…while语句,在菜单内输入1进行游戏,输入0退出游戏,输入其他数字,提示错误)
void test(){ int input = 0; do { menu(); printf("请选择:>"); scanf("%d",&input); switch(input) { case 1: game(); break; case 0: printf("退出游戏\n"); break; default: printf("输出错误,请重新输入\n"); break; } }while(input);}
设立菜单menu函数:
void menu(){ printf("********************************\n"); printf("*********1.play 0.exit**********\n"); printf("********************************\n");}
输出的结果如下图:
设立棋盘
棋盘为一个3*3而且没有边框的井字形状,需要用到设置数组board[ ][ ]代表坐标。
在game.h头文件进行定义,定义ROW 为行,并且值为3,COL为列,值也为3。#define ROW 3#define COL 3
定义函数DispalyBoard 打印棋盘
i代表行,j代表列。第一行先打印(空格)%c(空格) 说明玩家输入坐标或者电脑进行随机填空时,输入的一个字符*或者#,之后打印 | 进行竖分割,但只打印两个竖分割符号。之后进行换行打印- - -进行横分割,之后打印 | 进行竖分割。void DispalyBoard (char board[ROW][COL],int row ,int col){ int i = 0; for(i = 0; i
打印出来的结果如下:
3、设置玩家下棋,电脑下棋。
玩家下棋
让玩家输入X,Y坐标,并在棋盘上显示,用“*”。因为数组的下标是从0开始,当时输入坐标是1~3,所以需要在设计数组时,需要进行-1操作。如果输入的坐标上已有值,提示“该坐标已经有棋子”,并重新输入。如果输入超过3的值,则提醒:“坐标非法,请重新输入!”自定义函数PlayerMove ( )
void PlayerMove(char board[ROW][COL],int row ,int col){ int x= 0; int y= 0; printf("玩家走:>\n"); while(1) { printf("请输入要下棋的坐标:>"); scanf("%d%d",&x,&y); if(x>=1 && x<=row && y>=1 && y<=col) { if(board[x-1][y-1] == ' ') { board[x-1][y-1] = '*'; break; } else { printf("该坐标已经有棋子\n"); } } else { printf("坐标非法,请重新输入!\n"); } }}
电脑下棋
电脑下棋使用srand函数以时间来调用rand函数:srand((unsigned) time(NULL)); 在test函数内调用srand函数,用“#”代表电脑下棋 自定义ComputerMove函数:void ComputerMove(char board[ROW][COL],int row ,int col){ int x = 0; int y = 0; printf("电脑走:>\n"); while(1) { x = rand() %row; y = rand() %col; if(board[x][y]== ' ') { board[x][y] = '#'; break; } }}
X= rand()%row,说明X的取值范围就在1~ 3。同理,Y的取值范围也是1~ 3。
设置好玩家与电脑的下棋步骤之后,需要在每次玩家或者电脑落棋之后,打印出棋盘情况,需要在函数下,加入打印棋盘函数DispalyBoard()即:
PlayerMove(board,ROW,COL); DispalyBoard(board,ROW,COL); ComputerMove(board,ROW,COL); DispalyBoard(board,ROW,COL);
四、判断获胜条件
游戏分别有以下三种情况:
- 1、其中一方获胜:当有一方的棋子连成一条线,即三个相同棋子连成一条竖线或者横线,再或者斜线。
- 2、双方平局:当所有的格子都已经有棋子,并且没有出现三子连线的情况,双方平局。
- 3、游戏继续:当棋盘还有空格子,并且没有出现三子连线的情况,游戏继续。
由于获胜条件需要在每一方落子之后,进行判断。所以在PlayMove函数和ComputerMove函数加入IsWin函数,用于判断游戏情况。
1)其中一方获胜:
char IsWin(char board[ROW][COL],int row ,int col){ int i = 0; for(i= 0; i
2)双方平局:
设定IsFull()函数判断上述没有出现获胜情况,并且格子已满。
int IsFull(char board[ROW][COL],int row ,int col){ int i= 0; int j= 0; for(i=0; i
3)游戏继续:
当上述两种情况都没有发生时,游戏依然处于进行当中。所以需要在IsWin函数最后加入return ‘c’;代表游戏继续。
此时游戏可以正常运行:
完整代码为:
game.h文件下:
#define _CRT_SECURE_NO_WARNINGS 1#define ROW 3#define COL 3#include#include #include void InitBoard(char board[ROW][COL],int row, int col);void DispalyBoard (char board[ROW][COL],int row ,int col);void PlayerMove(char board[ROW][COL],int row ,int col);void ComputerMove(char board[ROW][COL],int row ,int col);char IsWin(char board[ROW][COL],int row ,int col);int IsFull(char board[ROW][COL],int row ,int col);
game.c文件下:
#define _CRT_SECURE_NO_WARNINGS 1#include "game.h"void InitBoard(char board[ROW][COL],int row, int col){ int i = 0; int j = 0; for (i=0; i\n"); while(1) { printf("请输入要下棋的坐标:>"); scanf("%d%d",&x,&y); if(x>=1 && x<=row && y>=1 && y<=col) { if(board[x-1][y-1] == ' ') { board[x-1][y-1] = '*'; break; } else { printf("该坐标已经有棋子\n"); } } else { printf("坐标非法,请重新输入!\n"); } }}void ComputerMove(char board[ROW][COL],int row ,int col){ int x = 0; int y = 0; printf("电脑走:>\n"); while(1) { x = rand() %row; y = rand() %col; if(board[x][y]== ' ') { board[x][y] = '#'; break; } }}int IsFull(char board[ROW][COL],int row ,int col){ int i= 0; int j= 0; for(i=0; i
text.c文件下:
#define _CRT_SECURE_NO_WARNINGS 1#include "game.h"void menu(){ printf("********************************\n"); printf("*********1.play 0.exit**********\n"); printf("********************************\n");}void game(){ char ret = 0; char board[ROW][COL]={ 0}; InitBoard(board,ROW,COL); DispalyBoard(board,ROW,COL); while(1) { PlayerMove(board,ROW,COL); DispalyBoard(board,ROW,COL); ret = IsWin(board,ROW,COL); if(ret != 'c') { break; } ComputerMove(board,ROW,COL); DispalyBoard(board,ROW,COL); ret = IsWin(board,ROW,COL); if(ret != 'c') { break; } } if (ret == '*') { printf("玩家赢\n"); } else if (ret == '#') { printf("电脑赢\n"); } else { printf("平局\n"); }}void test(){ int input = 0; srand((unsigned int)time(NULL)); do { menu(); printf("请选择:>"); scanf("%d",&input); switch(input) { case 1: game(); break; case 0: printf("退出游戏\n"); break; default: printf("输出错误,请重新输入\n"); break; } }while(input);}int main(){ test(); return 0;}
缺点就是电脑下棋都是随机的,只要带着脑子玩这个游戏,基本不会输。我也想写出有脑子的电脑,奈何我还不会 ╮(╯_╰)╭
转载地址:https://blog.csdn.net/xiaotangyu7dong/article/details/115683058 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!