一.游戏介绍
三字棋又名井字棋,英文名叫Tic-Tac-Toe,是一种在3*3格子上进行的连珠游戏,和五子棋类似,由于棋盘一般不画边框,格线排成井字故得名。游戏需要的工具仅为纸和笔,然后由分别代表O和X的两个游戏者轮流在格子里留下标记(一般来说先手者为X),在程序中我们就不需要纸和笔,我们直接输入棋子坐标即可,然后由分别代表‘*’和‘#’的玩家和电脑轮流在格子里留下标记任意三个标记形成一条直线,则为获胜。
二.游戏实现思路
1.需要一个棋盘,用二维数组创建
char board[ROW][COL];//创建棋盘
2. 初始化棋盘,设计一个函数初始化棋盘
Initboard(board,ROW,COL);//初始化棋盘
3.打印棋盘,设计一个函数打印棋盘
Displayboard(board,ROW,COL);//打印棋盘
4.1.玩家下棋,玩家输入信息
4.2.电脑下棋,电脑自动输入信息
PlayerMove(board,ROW,COL);//玩家下棋
ComputerMove(board,ROW,COL);
5.判断棋局输赢情况
这里我们可以去思考,我们可以设计一个函数去判断,首先我们知道,玩家下棋是‘*’,电脑下棋是‘#’,就可以让函数返回‘*’,‘#’分别代表玩家赢和电脑赢,除此之外,我们还应该考虑两种情况,平局和游戏继续,这里就设计返回‘Q’,‘C’来表示平局和游戏继续
三.游戏实现的详细代码
main.c文件:
#include "game.h" void menu() { printf("******************************\n"); printf("* 1.play *\n"); printf("* 0.exit *\n"); printf("******************************\n"); } void game() { char count={0}; char board[ROW][COL];//创建棋盘 Initboard(board,ROW,COL);//初始化棋盘 Displayboard(board,ROW,COL);//打印棋盘 while(1)//循环是为了一直下棋,直到一方赢或着棋盘满了 { PlayerMove(board,ROW,COL);//玩家下棋 Displayboard(board,ROW,COL); count=Iswin(board,ROW,COL);//判断棋局情况 if(count!='C')//如果返回的是‘C’则棋盘还有空余且没有一方胜出 { break; } ComputerMove(board,ROW,COL); Displayboard(board,ROW,COL); count=Iswin(board,ROW,COL); if(count!='C') { break; } } if(count=='*')//如果返回的是‘*’则是玩家赢 { printf("玩家赢\n"); } else if(count=='#')//如果返回的是‘#’则是电脑赢 { printf("电脑赢\n"); } if(count=='Q')//如果返回的是‘Q’则是平局 { printf("平局\n"); } } int main() { srand((unsigned int)time(NULL));//控制随机变量更加自然 int input=0; do { menu();//菜单 printf("请选择\n"); scanf("%d",&input); switch(input) { case 1: game(); break; case 0: printf("退出游戏\n"); break; default: printf("输入非法,重新选择\n"); break; } }while(input); return 0; }
game.c文件:
#include "game.h" void Initboard(char board[ROW][COL],int row,int col) { int i=0,j=0; for(i=0;i<row;i++) { for(j=0;j<col;j++) { board[i][j]=' ';//三字棋,一共9个格子,将这9个格子初始化为空格‘ ’ } } } void Displayboard(char board[ROW][COL],int row,int col) { printf("*************三字棋*****************\n"); int i=0,j=0; for(i=0;i<row;i++) { for(j=0;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"); } } printf("*************三字棋*****************\n"); } void PlayerMove(char board[ROW][COL],int row,int col) { printf("玩家下棋:>\n"); int x=0,y=0; while(1) { printf("输入下棋坐标\n"); 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) { printf("电脑下棋:>\n"); int x=0,y=0; while(1) { x=rand()%row; y=rand()%col; if(board[x][y]==' ') { board[x][y]='#'; break; } } } int Judge(char board[ROW][COL],int row,int col)//判断是否有空余 { int i=0,j=0; for(i=0;i<row;i++) { for(j=0;j<col;j++) { if(board[i][j]==' ') { return 1; } } } return -1; } char Iswin(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][1]!=' ')//判断行是否相等 { return board[i][1]; } } for(i=0;i<row;i++) { 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]; } int ret=Judge(board,row,col);//判断棋盘是否有空余 if(ret==1)//有空余就返回‘C’ { return 'C'; } else { return 'Q';//没有空余就返回‘Q’平局 } }
game.h文件:
#ifndef game_h #define game_h #endif //头文件 #include <stdio.h> #include<stdlib.h>//控制随机变量的头文件 #include<time.h>//控制随机变量的头文件 //定义行列长度,这里是三字棋,应该定义为3 #define ROW 3 #define COL 3 void Initboard(char board[ROW][COL],int row,int col);//初始化 void Displayboard(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);//判断棋局情况
四.游戏成功运行的结果
注:我使用的编译器是xcode(mac版本的)
五. 游戏细节补充
大家可以设置一个用户登陆过程,即是输入正确的密码才能进入游戏,让我们来看看
int main() { int count=0; char arr[]="bit.is.good999"; char brr[20]={0}; while(count<3) { printf("请输入密码:>\n"); scanf("%s",brr); if(strcmp(arr,brr)==0) { printf("密码输入正确,正在加载游戏\n"); srand((unsigned int)time(NULL));//控制随机变量更加自然 int input=0; do { menu();//菜单 printf("请选择\n"); scanf("%d",&input); switch(input) { case 1: game(); break; case 0: printf("退出游戏\n"); break; default: printf("输入非法,重新选择\n"); break; } }while(input); if(input==0) { break; } } else { printf("密码输入错误,错误三次将退出登陆--------%d次\n",count+1); count++; } } return 0; }
运行结果:
其实这个用户登录过程,可以广范适用于其他的游戏,大家可以去尝试一下
注: 使用字符串比较函数时strcmp,不要忘记引头文件#include<string.h>
六.心得
这个三字棋看似生活不起眼的小游戏,但是对于像我一样才开始接触C的人来说,实现起来也不是那样轻而易举。实现三字棋的过程,让我明白掌握代码并非最重要的,最重要的是,理清实现功能的逻辑,例如:实现这个游戏时,首先得了解游戏规则,其次需要一个棋盘......只要自己逻辑清晰,写代码也是水到渠成,还有一点,只要自己掌握逻辑,下次想再次实现这个功能或着分析已写的代码就不会犯怵了。最后我们要多善于整理总结,下次我们遇到类似的问题,就可以触类旁通了。