三子棋小游戏
一:游戏设计理念
用C语言知识,设计一个3*3的二维数组当作棋盘
二:构建游戏架构
1.先从主函数开始,设计菜单,可以让玩者快速明白游戏怎么玩----需menu()函数
2.最主要的部分就是游戏怎么玩---需game()函数,
3.在玩游戏之前首先要初始化棋盘,打印棋盘----需Init_board()/Print_board()函数
4.游戏中心就是在game()函数里面实现3步:
(1).玩家玩---Player_move
(2).电脑玩---Computer_move
(3).判断输赢---Check_win
由以上4步就可以实现一个简单的三子棋游戏
三:测试部分
游戏由于棋盘较小,可以直接输入坐标进行测试
产生三种结果:玩家赢、平局、电脑赢
四:优化部分
可以将此游戏改写为五子棋,将3*3棋盘增大到5*5,更近一步到10*10,
若有能力可以将五子棋电脑玩部分编写的更智能,让其产生记忆功能,为其输入一些更容易赢得棋法
五:用下面代码清晰的展现游戏架构
1.test.c
#include"game.h"
void menu()
{
printf("************************\n");
printf("**** 1.game 0.break ****\n");
printf("************************\n");
}
//最主要的就是怎么玩这个游戏
void game()
{
//首先要给一个棋盘--棋盘式一个3*3二维数组
int board[ROWS][COLS] = {0};
int ret = 0;
srand((unsigned int)time(NULL));//srand()函数
Init_board(board,ROWS,COLS); //初始化棋盘
do
{
Print_board(board,ROWS,COLS); //打印棋盘
printf("玩家玩:\n");
Player_move(board,ROWS,COLS); //玩家玩
ret = Check_win(board,ROWS,COLS); //玩家玩完之后,要检测其是否赢了
if(ret != ' ')//不等于空格,游戏结束了
{
break;
}
Print_board(board,ROWS,COLS);
printf("电脑玩:\n");
Computer_move(board,ROWS,COLS); //电脑玩
ret = Check_win(board,ROWS,COLS); //电脑玩完之后也要检测其是否赢了
}while(ret == ' ');
if(ret == 'X')
{
printf("玩家赢\n");
}
else if(ret == '0')
{
printf("电脑赢\n");
}
else if(ret == 'q')
{
printf("平局\n");
}
//Print_board(board,ROWS,COLS);
}
void Test()
{
int input = 0;
do
{
menu();
printf("请选择:");
scanf("%d",&input);
switch(input)
{
case 0:
break;
case 1:
game();
break;
default:
printf("选择错误.请重新选择.\n");
break;
}
}while(input);
}
int main()
{
Test();
system("pause");
return 0;
}
2.game.h(函数的声明)
#ifndef __GAME_H__
#define __GAME_H__
#include
#include
#include
#define ROWS 3
#define COLS 3
void Init_board(int arr[ROWS][COLS],int rows,int cols);
void Print_board(int arr[ROWS][COLS],int rows,int cols);
void Player_move(int arr[ROWS][COLS],int rows,int cols);
void Computer_move(int arr[ROWS][COLS],int rows,int cols);
int Check_win(int arr[ROWS][COLS],int rows,int cols);
#endif//__GAME_H__ 3.game.c(函数的实现)
#include"game.h"
void Init_board(int arr[ROWS][COLS],int rows,int cols)
{
int i = 0;
for(i=0; i
{
int j = 0;
for(j=0; j
{
arr[i][j] = ' ';
}
}
}
void Print_board(int arr[ROWS][COLS],int rows,int cols)
{
int i = 0;
for(i=0;i
{
printf(" %c | %c | %c \n",arr[i][0],arr[i][1],arr[i][2]);//
if(i != cols-1)//为了让最后一行不输出
{
printf("---|---|---\n");
}
}
}
void Player_move(int arr[ROWS][COLS],int rows,int cols)
{
int x = 0;
int y = 0;
while(1)
{
printf("请输入坐标:");
scanf("%d%d",&x,&y);
if((x>=1)&&(x<= ROWS))
{
if((y>=1)&&(y<= COLS))
{
if(arr[x-1][y-1] == ' ')//注意x.y是坐标,所以其下标应该减1
{
arr[x-1][y-1] = 'X';
break;
}
}
}
}
}
void Computer_move(int arr[ROWS][COLS],int rows,int cols)
{
//电脑要输入随机数
int x = 0;
int y = 0;
while(1)
{
x = rand()%3;//rand()是随机数函数
y = rand()%3;//要调用rand(),就必须先要调用srand()
if(arr[x][y] == ' ')
{
arr[x][y] = '0';
break;
}
}
}
static int is_full(int arr[ROWS][COLS],int rows,int cols)
{
int i = 0;
for(i=0; i
{
int j = 0;
for( j=0; j
{
if(arr[i][j] == ' ')
return 0;
}
}
return 1;
}
//判断输赢
int Check_win(int arr[ROWS][COLS],int rows,int cols)//返回int就是字符的ASCII码值
{
//行连起来
int i = 0;
for( i=0; i
{
if((arr[i][0]==arr[i][1])&&(arr[i][1]==arr[i][2])&&(arr[i][0] != ' '))
{
return arr[i][0];
}
}
//列连起来
for( i=0; i
{
if((arr[0][i]==arr[1][i])&&(arr[1][i]==arr[2][i])&&(arr[0][i] != ' '))
{
return arr[0][i];
}
}
//对角线
if((arr[0][0]==arr[1][1])&&(arr[1][1]==arr[2][2])&&(arr[1][1] != ' '))
{
return arr[1][1];
}
if((arr[0][2]==arr[1][1])&&(arr[1][1]==arr[2][0])&&(arr[1][1] != ' '))
{
return arr[1][1];
}
if(is_full(arr,rows,cols))
return 'q';//平局,看棋盘有没有满
return ' ';//表示没有人赢
}