用C语言写一个三子棋游戏

1.三子棋规则:在九宫格棋盘上,只要将自己的三个棋子走成一条线(横、竖、对角线),对方就算输了。

2.三子棋过程程序过程(三部分:头文件,源文件函数部分,源文件游戏规则部分):

>先写一个头文件:

#ifndef _GAME_H_
#define _GAME_H_
#include<stdio.h>
#include<Windows.h>
#include<stdlib.h>
#include<time.h>
#define ROW 3      //行
#define COL 3	   //列
#endif 

>游戏规则部分:

(1)写一个游戏菜单界面,里面有选择进行游戏还是不进行游戏:

void meun(){
    printf("#################################\n");
    printf("#           1.play              #\n");
    printf("#           2.exit              #\n");
    printf("#################################\n");
    printf("请选择是否进行游戏:");
}

运行结果:


(2).然菜单中有选项,我们就必须要设计一个变量用来接收用户的选择。

而且游戏程序本身应该允许用户反复进行玩耍,所以在主函数中,我们需要用一个循环来完成这个功能。

do-while循环在调用时会先运行循环体,而后在进行判断,所以这里我们选择使用do-while循环:当选1时我们需要为用户启动游戏程序,所以这里我们使用一个switch语句来接受用户的选择。选择2时退出程序,所以我们只需要跳出循环,即可退出。如果输入的数不是1或2会有提示错误,重新输入;

执行代码:

int main(){
	int select=0;
	do{
		meun();
		scanf_s("%d",&select);
		switch (select){
		case 1:game(); break;
		case 2:  exit(0);
		default: printf("输入错误!请重新输入!\n");
		}
	} while (1);
	system("pause");
	return 0;
}

运行结果:


>源代码的函数部分在game()中实现:

 在game()函数下进行游戏的进行:整个游戏在二维数组的棋盘上进行,所以需要创建数组

void game()
{
	char board[ROW][COL];   //创建数组初始化为空
	char ret;
	memset(board, ' ', ROW*COL);  //面板初始化
	do{
		system("CLS");  //覆盖式显示落子,不用走一步打印一个棋盘
		displayBoard(board, ROW); //打印棋盘
		playerMove(board, ROW);   //游戏者下子
		ret = isWin(board, ROW);  //判断是否赢了,走一步判断一步
		if (ret!=' ')break;  
		computerMove(board, ROW);  //电脑下子
		ret = isWin(board, ROW);  //判断是否赢了
	} while (ret==' ');
	if (ret == 'x'){
		printf("恭喜你,你赢了:)!\n");
	}
	else if (ret == 'o'){
		printf("你输了\n");
	}
	else if (ret == 'q'){
		printf("平局!\n");
	}else printf("debug!");
}

    游戏者棋子用‘x’表示,电脑棋子用‘o’表示,平局用q表示,如果是‘  ’的话就继续游戏

(1)打印棋盘:

void displayBoard(char board[][COL], int row)
{
	for (int i = 0; i < row; i++){
		printf(" %c | %c | %c \n", board[i][0], board[i][1], board[i][2]);
		if (i<row - 1){
			printf("---|---|---\n");
		}
	}
}

运行结果:


(2)游戏者落子:

代码:

void playerMove(char board[][COL], int row)
{
	int x, y;
	do{
		printf("plase Enter<x,y>:");
		scanf_s("%d%d", &x, &y);   //输入的坐标
		if (x >= 1 && x <= 3 && y >= 1 && y <= 3){
			if (board[x - 1][y - 1]==' '){ 
				board[x - 1][y - 1] = 'x';
				break;
			}
			else printf("此位置被占用!");
		}
		else printf("输入错误!请重新输入!");
	} while (1);
}

输入坐标,首先判断坐标是否在棋盘内,然后在判断输入的坐标是否有棋子,如果有则提示位置有棋子,重新输入。如果没有棋子则放入游戏者对应的棋子。

(3)电脑落子:

void computerMove(char board[][COL], int row)
{
	srand((unsigned)time(NULL));
	do{
		int x = rand() % ROW;
		int y = rand() % COL;
		if (board[x][y] == ' '){
			board[x][y] = 'o';
			break;
		}
	} while (1);
}
rand()是用来生成随机数的,这里我们还需要在主函数main中加上一行代码。由于我们不希望他多次生成随机数,生成一次就足够用了,所以直接computerMove()函数中加入:
srand((unsigned)time(NULL));    //需要在头文件中加入:#include<time.h>

x,y为随机坐标,需要进行判断是否为空,为空才落子;

(4)判断是否赢了:返回一个值来表示获胜者

char isWin(char board[][COL], int row)
{
	int i = 0;
	for (; 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 < COL; i++){                  //判断列是否全相等
		if (board[0][i] == board[0][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];
	}
	else if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[0][2] != ' '){
		return board[0][2];
	}
	else if (is_Full(board, row)){   //判断棋盘是否下满
		return 'q';
	}
	return ' ';
}
主要是判断行,列,斜着的棋子是否相同,并返回对应所代表的值。

(5)判断棋盘是否下满:

int is_Full(char board[][COL], int row)
{
	int i = 0;
	for (; i < row; i++){
		int j = 0;
		for (; j < COL; j++){
			{
				if (board[i][j] == ' '){
					return 0;
				}
			}
		}
	}
	return 1;
}

也就是判断平局的情况。

下面是完整代码:

game.h:
#ifndef _GAME_H_
#define _GAME_H_
#include<stdio.h>
#include<Windows.h>
#include<stdlib.h>
#include<time.h>
#define ROW 3      //行
#define COL 3	   //列
#endif 
 

main.c:
#include"game.h"
void meun(){
	printf("#################################\n");
	printf("#           1.play              #\n");
	printf("#           2.exit              #\n");
	printf("#################################\n");
	printf("请选择是否进行游戏:");
}int main(){
	int select=0;
	do{
		meun();
		scanf_s("%d",&select);
		switch (select){
		case 1:game(); break;
		case 2:  exit(0);
		default: printf("输入错误!请重新输入!\n");
		}
	} while (1);
	system("pause");
	return 0;
}



game.c
#include"game.h"
void displayBoard(char board[][COL], int row)
{
	for (int i = 0; i < row; i++){
		printf(" %c | %c | %c \n", board[i][0], board[i][1], board[i][2]);
		if (i<row - 1){
			printf("---|---|---\n");
		}
	}
}
void playerMove(char board[][COL], int row)
{
	int x, y;
	do{
		printf("plase Enter<x,y>:");
		scanf_s("%d%d", &x, &y);
		if (x >= 1 && x <= 3 && y >= 1 && y <= 3){
			if (board[x - 1][y - 1]==' '){
				board[x - 1][y - 1] = 'x';
				break;
			}
			else printf("此位置被占用!");
		}
		else printf("输入错误!请重新输入!");
	} while (1);
}
void computerMove(char board[][COL], int row)
{
	srand((unsigned)time(NULL));
	do{
		int x = rand() % ROW;
		int y = rand() % COL;
		if (board[x][y] == ' '){
			board[x][y] = 'o';
			break;
		}
	} while (1);
}
int is_Full(char board[][COL], int row)
{
	int i = 0;
	for (; i < row; i++){
		int j = 0;
		for (; j < COL; j++){
			{
				if (board[i][j] == ' '){
					return 0;
				}
			}
		}
	}
	return 1;
}

char isWin(char board[][COL], int row)
{
	int i = 0;
	for (; 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 < COL; i++){
		if (board[0][i] == board[0][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];
	}
	else if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[0][2] != ' '){
		return board[0][2];
	}
	else if (is_Full(board, row)){
		return 'q';
	}
	return ' ';
}
void game()
{
	char board[ROW][COL];
	char ret;
	memset(board, ' ', ROW*COL);  //面板初始化
	do{
		//system("CLS");
		displayBoard(board, ROW);
		playerMove(board, ROW);
		ret = isWin(board, ROW);
		if (ret!=' ')break;
		computerMove(board, ROW);
		ret = isWin(board, ROW);
	} while (ret==' ');
	if (ret == 'x'){
		printf("恭喜你,你赢了:)!\n");
	}
	else if (ret == 'o'){
		printf("你输了\n");
	}
	else if (ret == 'q'){
		printf("平局!\n");
	}else printf("debug!");
}

阅读更多
个人分类: C语言
上一篇java中==和equals的区别
下一篇大小端
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭