游戏规则:在九宫格棋盘上,只要将自己的三个棋子走成一条线(横、竖、对角线),对方就算输了。
设计思路:具体可分成五步:
(1)创建一个三子棋的棋盘
(2)把棋盘打印出来
(3)电脑下棋
(4)玩家下棋
(5)判断输赢
棋盘创建:memset函数初始化棋盘
void Init(char board[ROW][COL], int row, int col)
{
memset(board, ' ', row*col);
}//初始化棋盘
玩家下棋:输入坐标后先判断该坐标是否合法,合法再判断是否为空,不为空填充‘X’;
void PlayerMove(char board[ROW][COL], int row, int col)//玩家下棋
{
int x = 0;
int y = 0;
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]='X';
break;
}
else
printf("该位置被占用\n");
}
else
printf("无此位置\n");
}
}
电脑下棋:rand函数随机生成坐标,先判断,再填充‘0’
void ComeputerMove(char board[ROW][COL], int row, int col)//电脑下棋
{
printf("电脑走>\n");
while(1)
{
int x = rand()%3;
int y = rand()%3;
if(x>=0&&x<row&&y>=0&&y<col)
{
if(board[x][y] == ' ')
{
board[x][y]='0';
break;
}
}
}
}
判断输赢的条件:行/列/对角线全为‘X’或‘0’,或者平局; 返回值设置:玩家赢‘X’电脑赢‘0’平局‘R’没人赢且存在空位置 ‘ ’;
char Judge(char board[ROW][COL], int row, int col)//判断输赢
{
int i = 0;
for(i=0; i<row; i++)
{
int j = 0;
for(j=0; j<col-1; j++)
{
if(board[i][j]!=board[i][j+1])
break;
}
if(j==col-1)
return board[i][0];
}
for(i=0; i<col; i++)
{
int j = 0;
for(j=0; j<row-1; j++)
{
if(board[j][i]!=board[j+1][i])
break;
}
if(j==row-1)
return board[0][i];
}
for(i=0; i<row-1; i++)
{
if(board[i][i]!=board[i+1][i+1])
break;
}
if(i==row-1)
return board[0][0];
for(i=0; i<row-1; i++)
{
if(board[i][row-1-i]!=board[i+1][row-1-i-1])
break;
}
if(i==row-1)
return board[row-1][0];
for(i=0; i<row; i++)
{
int j = 0;
for(j=0; j<col; j++)
{
if(board[i][j]==' ')
return ' ';
}
}
return 'Q';
}
void Judge_win(char win)
{
if(win=='X')
printf("玩家赢\n");
else if(win== '0')
printf("电脑赢\n");
else
printf("平局\n");
}
总共会有可能出现三种情况:(1)玩家赢;(2)电脑赢;(3)平局(即棋盘下满且玩家和电脑都不满足胜利条件)
(1)玩家赢
(2)电脑 赢
(3)平局
当出现以上结果时,返回主菜单,重新选择是否继续游戏。
代码如下:
game.h文件
//game.c头文件
#ifndef __GAME_H__
#define __GAME_H__
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<time.h>
#define ROW 3
#define COL 3
enum input
{
Exit,
Play
};
void Init(char board[ROW][COL], int row, int col);//初始化棋盘
void PlayerMove(char board[ROW][COL], int row, int col);//玩家下棋
void Print_Board(char board[ROW][COL], int row, int col);//输出棋盘
void ComeputerMove(char board[ROW][COL], int row, int col);//电脑下棋
char Judge(char board[ROW][COL], int row, int col);//判断输赢
void Judge_win(char win);
#endif
game.c文件
//game.c源文件
#define _CRT_SECURE_NO_WARNINGS
#include "game.h"
void Init(char board[ROW][COL], int row, int col)
{
memset(board, ' ', row*col);
}//初始化棋盘
void PlayerMove(char board[ROW][COL], int row, int col)//玩家下棋
{
int x = 0;
int y = 0;
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]='X';
break;
}
else
printf("该位置被占用\n");
}
else
printf("无此位置\n");
}
}
void Print_Board(char board[ROW][COL], int row, int col)//输出棋盘
{
int i = 0;
for(i=0; i<row; i++)
{
int j = 0;
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");
}
}
}
void ComeputerMove(char board[ROW][COL], int row, int col)//电脑下棋
{
printf("电脑走>\n");
while(1)
{
int x = rand()%3;
int y = rand()%3;
if(x>=0&&x<row&&y>=0&&y<col)
{
if(board[x][y] == ' ')
{
board[x][y]='0';
break;
}
}
}
}
char Judge(char board[ROW][COL], int row, int col)//判断输赢
{
int i = 0;
for(i=0; i<row; i++)
{
int j = 0;
for(j=0; j<col-1; j++)
{
if(board[i][j]!=board[i][j+1])
break;
}
if(j==col-1)
return board[i][0];
}
for(i=0; i<col; i++)
{
int j = 0;
for(j=0; j<row-1; j++)
{
if(board[j][i]!=board[j+1][i])
break;
}
if(j==row-1)
return board[0][i];
}
for(i=0; i<row-1; i++)
{
if(board[i][i]!=board[i+1][i+1])
break;
}
if(i==row-1)
return board[0][0];
for(i=0; i<row-1; i++)
{
if(board[i][row-1-i]!=board[i+1][row-1-i-1])
break;
}
if(i==row-1)
return board[row-1][0];
for(i=0; i<row; i++)
{
int j = 0;
for(j=0; j<col; j++)
{
if(board[i][j]==' ')
return ' ';
}
}
return 'Q';
}
void Judge_win(char win)
{
if(win=='X')
printf("玩家赢\n");
else if(win== '0')
printf("电脑赢\n");
else
printf("平局\n");
}
test.c文件
//test,c源文件
#define _CRT_SECURE_NO_WARNINGS
#include "game.h"
void menu()
{
printf("******************************\n");
printf("***** 1.play 0.exit ****\n");
printf("******************************\n");
}
void game()
{
char board[ROW][COL] = {0};
char win ;
Init(board, ROW, COL);
Print_Board(board, ROW, COL);
srand((unsigned int)time(NULL));
while(1)
{
PlayerMove(board, ROW, COL);
Print_Board(board, ROW, COL);
win = Judge(board, ROW, COL);
if(win!=' ')
{
Judge_win(win);
break;
}
ComeputerMove(board, ROW, COL);
Print_Board(board, ROW, COL);
win = Judge(board, ROW, COL);
if(win!=' ')
{
Judge_win(win);
break;
}
}
}
int main()
{
int input = 0;
do
{
menu();
printf("请输入:");
scanf("%d",&input);
switch(input)
{
case Play://用枚举,提高可读性
game();
break;
case Exit://用枚举,提高可读性
printf("退出游戏\n");
break;
default:
printf("输入错误,请重新输入\n");
fflush(stdin);//清空输入缓冲区,避免输入字符型数据而死循环
break;
}
}while(input);
return 0;
}