一条龙小游戏
一、代码构思
全部代码分为三个文件:game.h, game.c, text.c(game.h用来申明所有用到的函数,game.c用来写实现游戏的代码,text.c用来调试代码)
第一步将棋盘初始化为空格;第二步打印棋盘;第三步设计由玩家先走(在棋盘中放入X),然后电脑走(在棋盘中放入*);第四步判断输赢,若有一方有三个相同的子连在一条直线上则赢了,另一方输;若棋盘满了也没有三子连成一线,则为平局。
其中头文件game.h
#ifndef __GAME_H__
#define __GAME_H__
#include <time.h>
#include<stdio.h>
#include <stdlib.h>
#include<time.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 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);//判断输赢函数
#endif //__GAME_H__
二、游戏界面构思
设计一个简单的进入游戏菜单及棋盘
void menu()
{
printf("**************************************\n");
printf("************* 1.play ****************\n");
printf("************* 0.exit ****************\n");
printf("**************************************\n");//游戏菜单
}
菜单效果
void DisplayBoard(char board[ROW][COL], int row, int col)//定义一个二维数组输出函数
{
int i = 0;
int j = 0;
for (i = 0; i<row; i++)
{
//printf(" %c | %c | %c \n", board[i][0], board[i][1], board[i][2]);有局限性,游戏无法扩展
for (j = 0; j<col; j++)
{
printf(" %c ", board[i][j]);
if (j<col - 1)
printf("|");//打印数据行
}
printf("\n");
if (i<row - 1)
{
//printf("---|---|---\n");
for (j = 0; j<col; j++)
{
printf("---");
if (j<col - 1)
printf("|");//打印分割行
}
printf("\n");
}
}
}
void InitBoard(char board[ROW][COL], int row, int col)//定义一个二位数初始化函数
{
memset(&board[0][0], ' ', row*col*sizeof(board[0][0]));//内存设置函数,从二维数组首地址开始将所有值赋‘ ’值
}
游戏刚开始三子棋棋盘效果
三、游戏代码实现
1.玩家走
void PlayerMove(char board[ROW][COL], int row, int col)
{
int x = 0; //定义两个坐标变量
int y = 0;
printf("玩家走:>\n");//提示玩家走
while (1)
{
printf("请输入走的坐标(1-3):>");
scanf("%d%d", &x, &y);
if (x >= 1 && x <= row && y >= 1 && y <= col)//判断输入坐标的合法性,且游戏面向大众坐标从1开始
{
if (board[x - 1][y - 1] == ' ')//数组坐标从0开始,若为空格则可落子
{
board[x - 1][y - 1] = 'X';
break;//只有输入正确时才能跳出while(1)的死循环
}
else
{
printf("坐标被占用,重新输入!\n");//游戏规则:已经有子则重新输入
}
}
else
{
printf("坐标有误,重新输入!\n");
}
}
}
2.电脑走
void ComputerMove(char board[ROW][COL], int row, int col)
{
int x = 0;
int y = 0;
printf("电脑走:>\n");//提示电脑走
while (1)
{
x = rand() % row;//rand()的范围0-32767,取余行列从而随机生成坐标;rand()需要调用srand()函数
y = rand() % col;
if (board[x][y] == ' ')//判断是否被占用
{
board[x][y] = '*';
break;
}
}
}
3.判断游戏输赢
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][0] != ' ')
{
return board[i][0];
}
}
for (i = 0; i<col; 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[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];
}
//判断平局
if (IsFull(board, row, col) == 1)
{
return 'Q';
}
//游戏继续
return ' ';
}
4.游戏效果