一,游戏规则
玩家棋子用“#”,电脑棋子用“*”,哪方棋子先连成一条线,则获得胜利。
二,游戏步骤
第一步:玩家下棋
第二步:电脑下棋
第三步:一旦有一方胜利则游戏终止,否则继续
【注意】
1,游戏执行之前,我们需要一个菜单来满足我们是否选择进行游戏,游戏结束后也需要一个游戏菜单由玩家选择是否继续游戏。
2,执行游戏步骤时,玩家和电脑落子后都要判断输赢。
3,三子棋有九格,要用3*3的二维数组来实现。我们不能在屏幕上直接落子,要用坐标代替。
三,游戏实现
3.1游戏构思和框架
首先我们需要三个文件来分工合作:
<test.c>测试游戏的逻辑
<game.h>游戏代码的声明(函数声明,符号定义)
<game.c>游戏代码的实现
先在<game.h>头文件中加个库函数<stdio.h>,再将3分别赋值给ROW和LOW,这样是为了以后用四子棋、五子棋只用修改ROW和LOW的赋值就够了。
#include <stdio.h>
#define ROW 3
#define LOW 3
将头文件game.h作为test.c的库函数,这样就相当于直接调用game.h里的内容了。
以下是test.c的大致框架:
#include "game.h"
void mune()
{
printf("**********************\n");
printf("****1.PLAY 0.EXIT****\n");
printf("**********************\n");
}
int main()
{
int input=0;
srand((unsigned)time(NULL)); //随机数的起点
do {
mune(); //打印游戏菜单
printf("请选择:>");
scanf("%d",&input);
switch (input)
{
case 1:
game();
break;
case 0:
break;
default:
printf("选择错误,请重新输入\n");
break;
}
} while (input);
return 0;
}
用do...while()语句来实现整个框架——先打印菜单,再进行选择,将选项赋值在变量input中,再用switch语句执行不同选项,将游戏实现过程放在game.h()函数中
3.2棋盘的初始化和打印
接下来我们编写game()函数。
在该函数中创建一个3*3棋盘并进行初始化——让棋盘中的内容变成空格
void game()
{
char board[ROW][LOW]={0}; //创建3*3棋盘
//初始化棋盘的函数
InitBoard(board,ROW,LOW); //初始化棋盘
DisplayBoard(board,ROW,LOW); //打印棋盘
}
我们将棋盘的初始化和打印的实现放在game.c中,game.c也将game.h作为库函数调用。
#include "game.h"
void InitBoard(char board[ROW][COL],int row,int col) //初始化键盘
{
int i,j;
for (int i = 0; i < row; i++)
{
for (int j = 0; j < col; j++);
{
board[i][j]=' '; //先把棋盘中的数打印成空格
}
}
}
void DisplayBoard(char board[ROW][COL],int row,int col) //打印棋盘
{
int i,j;
for (int i = 0; i < row; i++) //运行三次后打印棋盘
{
for (int j = 0; j < col; j++) {
if (j == col - 1)
printf("%c ", board[i][j]);
else
printf("%c |", board[i][j]);
}
printf("\n");
for (int j = 0; j < col; j++) //运行三次后:---|---|---
{
if (i < 2) {
if (j == col - 1)
printf("---");
else
printf("---|");
}
}
printf("\n");
}
3.3 玩家和电脑下棋实现
我们在game.c中实现玩家和电脑下棋的操作。玩家通过输入坐标下棋,电脑通过运用rand()来生成随机数进行下棋。在test.c中加一个随机起点(srand((unsigned)time(NULL)))
void game()
{
char board[ROW][COL]={0}; //创建3*3棋盘
//初始化棋盘的函数
InitBoard(board,ROW,COL); //初始化棋盘
DisplayBoard(board,ROW,COL); //打印棋盘
player_chess(board,ROW,COL); //玩家下棋
judge(board,ROW,COL); //判断输赢
com_chess(board,ROW,COL); //电脑下棋
//玩家下棋
void player_chess(char board[ROW][COL],int row,int col)
{
int input=1;
while(input)
{
printf("请输入下棋的坐标:>\n");
int a=0; //创建a,b两个变量来储存坐标
int b=0;
scanf("%d %d",&a,&b);
if(a>0 && a<row+1 && b>0 && b<col+1) //坐标必须在0~row(col)+1之间,该步判断坐标是否合法
{
if(board[a-1][b-1]==' ') //判断坐标是否被占用
{
board[a-1][b-1]=='#';
input=0;
}
else
printf("该坐标已被占用,请重新输入");
}
else
{
printf("坐标非法,请重新输入");
}
}
print_board(board,row,col); //打印下棋后的棋盘
}
//电脑下棋
void com_chess(int board[ROW][COL],int row,int col)
{
int input=1;
while(input)
{
int a=rand()%row; //用a,b装0~2的随机数
int b=rand()%col;
if(board[a-1][b-1]==' ') //判断输入坐标的地方是否为空
{
board[a-1][b-1]=='*';
input=0;
}
}
print_board(board,row,col); //打印下棋后的棋盘
}
3.4判断输赢
电脑和玩家下棋后都要判断输赢,依然在game.c中实现,若平局返回‘Q’;若都没赢返回‘P’,游戏继续。
char judge(int board[ROW][COL],int row,int col)
{
int i=0;
for (int 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]; //判断一行是否相同
}
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[0][0]!=' ')
{
return board[0][0]; //判断右斜线是否相同
}
if(board[0][2]==board[1][1] && board[1][1]==board[2][0] && board[1][1]!=' ')
{
return board[0][2]; //判断左斜线是否相同
}
if(if_full(board,row,col))
{
return 'Q'; //判断是否平局,平局返回‘Q’
}
return 'P';
}
若棋盘还未满,在test.c中加一个while循环。
void game()
{
char ret=0;
char board[ROW][COL] = {0}; //创建3*3棋盘
//初始化棋盘的函数
InitBoard(board, ROW, COL); //初始化棋盘
system("cls"); //清空屏幕函数
DisplayBoard(board, ROW, COL); //打印棋盘
while(1)
{
player_chess(board, ROW, COL); //玩家下棋
print_board(board,ROW,COL); //打印下棋后的棋盘
judge(board, ROW, COL); //判断输赢
if(ret!='P') //judge函数返回‘P’,游戏继续
{
break;
}
com_chess(board, ROW, COL); //电脑下棋
ret=judge(board,ROW,COL); //判断输赢
if(ret!='P')
{
break;
}
}
if(ret=='#')
{
printf("玩家胜利!\n");
}
if(ret=='*')
{
printf("电脑胜利!\n");
}
if(ret=='Q')
{
printf("游戏平局!\n");
}
print_board(board,ROW,COL); //游戏结束再打印一次键盘
}
3.5 游戏平局
在game.c中用if_full判断棋盘是否满了,若满了则返回1,在judge函数中返回‘Q’,来表示平局。
int if_full(int 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++) {
if (board[i][j] == ' ')
return 0; //遍历一遍是否有空格,有返回0
}
}
return '1'; //如果都没有空格,返回‘1’
}
3.6游戏头文件 game.h
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#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 player_chess(char board[ROW][COL],int row,int col);
void com_chess(char board[ROW][COL],int row,int col);
char judge(char board[ROW][COL], int row, int col);
四,游戏优化
为了提高用代码下棋的水平,我们需要电脑来“拦截”我们的棋子,当我们的棋子有两个相连的时候就要进行拦截,可提高智能性。 我们在game.c中实现
int intell_com(char board[ROW][COL],int row,int col)
{
int i;
//行
for (i = 0; i < row; i++)
{
if(board[i][0]==board[i][1] && board[i][2]==' ')
{
board[i][2]='*';
return 1;
}
if(board[i][0]==board[i][2] && board[i][1]==' ')
{
board[i][1] = '*';
return 1;
}
if(board[i][1]==board[i][2] && board[i][0]==' ')
{
board[i][0]='*';
return 1;
}
}
//列
for (i = 0; i < col; i++)
{
if (board[0][i] == board[1][i] && board[2][i] == ' ')
{
board[2][i] = '*';
return 1;
}
if (board[0][i] ==board[2][i] && board[1][i] == ' ')
{
board[1][i] = '*';
return 1;
}
if (board[1][i] == board[2][i] && board[0][i] == ' ')
{
board[0][i] = '*';
return 1;
}
}
//对角线判断
if (board[1][1] == board[0][0] && board[2][2] == ' ')
{
board[2][2] = '*';
return 1;
}
if (board[0][0] == board[2][2] && board[1][1] == ' ')
{
board[1][1] = '*';
return 1;
}
if (board[1][1] == board[2][2] && board[0][0] == ' ')
{
board[0][0] = '*';
return 1;
}
//斜对角线判断
if (board[1][2] == board[2][1] && board[3][0] == ' ')
{
board[3][i] = '*';
return 1;
}
if (board[1][2] == board[3][0] && board[2][1] == ' ')
{
board[2][1]='*';
return 1;
}
if (board[2][1] == board[3][0] && board[1][2] == ' ')
{
board[1][2]='*';
return 1;
}
return 0;
}
再将上面的代码插入com_chess中实现。
void com_chess(char board[ROW][COL],int row,int col)
{
printf("电脑下棋\n");
if(intell_com(board,row,col)) //判断是否符合拦截条件,符合进行拦截
{
;
}
else
{
while(1)
{
int a=rand()%row; //用a,b装0~2的随机数
int b=rand()%col;
if(board[a][b]==' ') //判断输入坐标的地方是否为空
{
board[a][b]='*';
break;
}
}
}
DisplayBoard(board,row,col); //打印下棋后的棋盘
}
五,游戏代码
-
game.h
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#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 player_chess(char board[ROW][COL],int row,int col);
void com_chess(char board[ROW][COL],int row,int col);
char judge(char board[ROW][COL], int row, int col);
-
game.c
#include "game.h"
int intell_com(char board[ROW][COL],int row,int col)
{
int i;
//行
for (i = 0; i < row; i++)
{
if(board[i][0]==board[i][1] && board[i][2]==' ')
{
board[i][2]='*';
return 1;
}
if(board[i][0]==board[i][2] && board[i][1]==' ')
{
board[i][1] = '*';
return 1;
}
if(board[i][1]==board[i][2] && board[i][0]==' ')
{
board[i][0]='*';
return 1;
}
}
//列
for (i = 0; i < col; i++)
{
if (board[0][i] == board[1][i] && board[2][i] == ' ')
{
board[2][i] = '*';
return 1;
}
if (board[0][i] ==board[2][i] && board[1][i] == ' ')
{
board[1][i] = '*';
return 1;
}
if (board[1][i] == board[2][i] && board[0][i] == ' ')
{
board[0][i] = '*';
return 1;
}
}
//对角线判断
if (board[1][1] == board[0][0] && board[2][2] == ' ')
{
board[2][2] = '*';
return 1;
}
if (board[0][0] == board[2][2] && board[1][1] == ' ')
{
board[1][1] = '*';
return 1;
}
if (board[1][1] == board[2][2] && board[0][0] == ' ')
{
board[0][0] = '*';
return 1;
}
//斜对角线判断
if (board[1][2] == board[2][1] && board[3][0] == ' ')
{
board[3][i] = '*';
return 1;
}
if (board[1][2] == board[3][0] && board[2][1] == ' ')
{
board[2][1]='*';
return 1;
}
if (board[2][1] == board[3][0] && board[1][2] == ' ')
{
board[1][2]='*';
return 1;
}
return 0;
}
void InitBoard(char board[ROW][COL],int row,int col) //初始化键盘
{
int i,j;
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
board[i][j]=' '; //先把棋盘中的数打印成空格
}
}
}
void DisplayBoard(char board[ROW][COL],int row,int col) //打印棋盘
{
int i,j;
for (i = 0; i < row; i++) //运行三次后打印棋盘
{
for (j = 0; j < col; j++)
{
if (j == col - 1)
printf("%c ", board[i][j]);
else
printf("%c |", board[i][j]);
}
printf("\n");
for (j = 0; j < col; j++) //运行三次后:---|---|---
{
if (i < row-1) {
if (j == col - 1)
printf("---");
else
printf("---|");
}
}
printf("\n");
}
}
//玩家下棋
void player_chess(char board[ROW][COL],int row,int col)
{
printf("玩家下棋\n");
int a=0; //创建a,b两个变量来储存坐标
int b=0;
int input=1;
while(input)
{
printf("请输入下棋的坐标:>\n");
scanf("%d %d",&a,&b);
if(a>0 && a<row+1 && b>0 && b<col+1) //坐标必须在0~row(col)+1之间,该步判断坐标是否合法
{
if(board[a-1][b-1]==' ') //判断坐标是否被占用
{
board[a-1][b-1]='#';
input=0;
}
else
printf("该坐标已被占用,请重新输入");
}
else
{
printf("坐标非法,请重新输入");
}
}
DisplayBoard(board,row,col); //打印下棋后的棋盘
}
//电脑下棋
void com_chess(char board[ROW][COL],int row,int col)
{
printf("电脑下棋\n");
if(intell_com(board,row,col)) //判断是否符合拦截条件,符合进行拦截
{
;
}
else
{
while(1)
{
int a=rand()%row; //用a,b装0~2的随机数
int b=rand()%col;
if(board[a][b]==' ') //判断输入坐标的地方是否为空
{
board[a][b]='*';
break;
}
}
}
DisplayBoard(board,row,col); //打印下棋后的棋盘
}
static int if_full(char board[ROW][COL],int row,int col)
{
int i;
for (i = 0; i < row; i++)
{
int j;
for (j = 0; j < col; j++) {
if (board[i][j] == ' ')
return 0; //遍历一遍是否有空格,有返回0
}
}
return '1'; //如果都没有空格,返回‘1’
}
char judge(char board[ROW][COL],int row,int col)
{
int i;
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 < row; 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[0][0]!=' ')
{
return board[0][0]; //判断右斜线是否相同
}
if(board[0][2]==board[1][1] && board[1][1]==board[2][0] && board[01][1]!=' ')
{
return board[0][2]; //判断左斜线是否相同
}
if(if_full(board,row,col))
{
return 'Q'; //判断是否平局,平局返回‘Q’
}
return 'P';
}
-
test.c
#include "game.h"
void menu()
{
printf("**********************\n");
printf("****1.PLAY 0.EXIT****\n");
printf("**********************\n");
}
void game()
{
char ret;
char board[ROW][COL] = {0}; //创建3*3棋盘
//初始化棋盘的函数
InitBoard(board, ROW, COL); //初始化棋盘
system("cls"); //清空屏幕函数
DisplayBoard(board, ROW, COL); //打印棋盘
while(1)
{
player_chess(board, ROW, COL); //玩家下棋
DisplayBoard(board,ROW,COL); //打印下棋后的棋盘
ret=judge(board,ROW,COL); //判断输赢
if(ret!='P') //judge函数返回‘P’,游戏继续
{
break;
}
DisplayBoard(board,ROW,COL); //打印下棋后的棋盘
com_chess(board, ROW, COL); //电脑下棋
ret=judge(board, ROW, COL); //判断输赢
if(ret!='P')
{
break;
}
}
if(ret=='#')
{
printf("玩家胜利!\n");
}
if(ret=='*')
{
printf("电脑胜利!\n");
}
if(ret=='Q')
{
printf("游戏平局!\n");
}
DisplayBoard(board,ROW,COL); //游戏结束再打印一次键盘
}
int main()
{
srand((unsigned int)time(NULL)); //随机数的起点
int input=0;
do {
menu(); //打印游戏菜单
printf("请选择:>");
scanf("%d",&input);
switch (input)
{
case 1:
game();
break;
case 0:
break;
default:
printf("选择错误,请重新输入\n");
break;
}
} while (input);
return 0;
}
完结撒花!!