编写三子棋游戏。
游戏规则:“三子棋”顾名思义,在九宫格棋盘上当(横、竖、对角线)上三个棋子连成一条线,则为赢。
构思框架: 游戏菜单 、棋盘 、对弈过程(电脑、用户)、判断输赢。
三子棋代码:
game.h
#define _CRT_SECURE_NO_WARNINGS 1
#ifndef _GAME_H_
#define _GAME_H_
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<time.h>
#define ROW 3
#define COL 3
void Initboard(char board[ROW][COL], int row, int col);
void Dispalyboard(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 Checkwin(char board[ROW][COL], int row, int col);
#endif
游戏应该有菜单页面供用户选择游戏或退出。
用户选择游戏时,必然能反复玩游戏,则使用循环来实现。
在循环体中,使用一个 switch 语句来接收用户的选择,选择“1”用户启动游戏程序,选择“0”用户退出游戏程序,而如果用户输入“0”“1”以外的值,则 default 则会报错请用户重新选择。
test.c
void menu()
{
printf("**************************\n");
printf("********* 1. paly ********\n");
printf("********* 0. exit ********\n");
}
int main()
{
int input = 0;
do
{
menu();
scanf("%d", &input);
switch(input)
{
case 1:
game();
break;
case 0:
break;
default:
printf("选择错误!!");
break;
}
}while (input);
return 0;
}
接下来就是定义游戏中的数字棋盘,并输出棋盘。
game.c
//初始化函数
void main_board(char board[ROW][COL], int row, int col)
{
memset(board, ' ', row*col);
//用来设置内存中函数(指定内存地址,初始化内存大小)
}
//打印棋盘的函数
void Displayboard(char board[ROW][COL], int row, int col)
{
int i = 0;
for (i=0; i<row; i++)
{
printf("%c|%c|%c\n", board[i][0], board[i][1], board[i][2]);
if(i != 2)
printf("---|---|---\n");
}
}
之后便是考虑电脑与用户该如何下棋了。
1.设置用户输入棋盘坐标即可。(同时要考虑到用户并不知道数组下标表示,则应将棋盘坐标设置在用户的认知范围内)
2.让电脑随机生成坐标(3*3以内的坐标值),并且不会与用户下棋的位置重复。
生成随机数则需要Srand函数,并且生成一次足够,引用time.h头文件。
//玩家
void Playermove(char board[ROW][COL], int row, int col)
{
int x = 0;
int y = 0;
while (1)
{
printf("请输入坐标:");
scanf("%d%d", &x, &y);
x--;
y--;
if(((x>=0) && (x<=2)) && ((y>=0) && (y<=2)))
{
if(board[x][y] = ' ')
{
board[x][y] = 'x';
break;
}
else
{
printf("输入有误!");
}
}
}
}
//电脑
void Computermove(char board[ROW][COL], int row, int col)
{
printf("电脑下:\n");
while(1)
{
int x = rand()%3;
int y = rand()%3;
if (board[x][y] = ' ')
{
board[x][y] = '0';
break;
}
}
}
在双方下完后,我们需要判断获胜的结果,则需Checkwin函数来检测并返回一个值来表示谁获胜,存在三种情况。
char Checkwin(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<col; i++)
{
if((board[0][i] == board[0][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][0] == board[1][1]) && (board[1][1] == board[2][0]) && (board[1][1] != ' '))
return board[1][1];
if(is_full(board, row, col))
{
return 'Q';
}
return ' ';
}
void game()
{
int ret = 0;
char board[ROW][COL] = {0};
Initboard (board, ROW, COL);
Dispalyboard(board, ROW, COL);
Srand((unsigned int)time(NULL));
while(1)
{
ret = Checkwin(board, ROW, COL);
Playermove(board, ROW, COL);
if(ret != ' ')
break;
Dispalyboard(board, ROW, COL);
Computermove(board, ROW, COL);
if(ret != ' ')
break;
Dispalyboard(board, ROW, COL);
if(ret = 'X')
{
printf("恭喜你!你赢了!\n");
}
else if (ret == '0')
{
printf("电脑赢!\n");
}
else if (ret == 'Q')
{
printf("平局\n");
}
Dispalyboard(board, ROW, COL);
}
其中平局需要is_full函数判断棋盘是否下满,加上static仅在此源文件的函数中被使用。
static int is_full(char board[ROW][COL], int row, int col)//仅在此源文件中的函数中被使用
{
int i = 0;
int j = 0;
for(i=0; i<row; i++)
{
for(j=0; j<col; j++)
{
if(board[i][j] == ' ')
return 0;
}
}
return 1;//表示棋盘已满
}
此上就是这个游戏的编写思路、过程以及代码。