三子棋小游戏

来源:互联网 发布:单片机c语言手册 编辑:程序博客网 时间:2024/06/02 04:45

先介绍一下游戏规则:在一个3*3的九宫格中,玩家和电脑谁先拥有三个呈一条直线的棋子则为赢。这次游戏代码将由test.c 和game.c 以及game.h组成。

1>game.h(引用头文件以及函数声明)

#ifndef __GAME1_H__#define __GAME1_H__#include <stdio.h> #include<time.h>#include<stdlib.h>#include <string.h>#define ROWS 3  //行#define COLS 3//列void init_board(char arr[ROWS][COLS],int row, int col);//初始化棋盘void display(char arr[ROWS][COLS], int row, int col);//打印此时的棋盘void computer_move(char arr[ROWS][COLS], int row, int col); //电脑走void player_move(char arr[ROWS][COLS], int row, int col);//玩家玩char check_win(char arr[ROWS][COLS], int row, int col);//检查是否赢int is_full(char arr[ROWS][COLS], int row, int col);//检查棋盘是否满#endif // !__GAME1_H__
2>test.c(用来测试)

#define _CRT_SECURE_NO_WARNINGS 1//用来测试#include"game.h"void menu()//打印菜单{printf("*********************************\n");printf("***********1.play 0.exit*********\n");printf("*********************************\n");}void game(){char arr[ROWS][COLS] = { 0 };char win = 0;init_board(arr, ROWS, COLS);                //初始化棋盘display(arr, ROWS, COLS);        //打印棋盘srand((unsigned int)time(NULL));                //电脑下的随机值do{computer_move(arr, ROWS, COLS);//电脑先走win = check_win(arr, ROWS, COLS);//检测是否还能继续if (win != ' ')                     {break;}display(arr, ROWS, COLS);//打印此时棋盘player_move(arr, ROWS, COLS);//玩家走win = check_win(arr, ROWS, COLS);//检测是否还能继续if (win != ' '){break;}display(arr, ROWS, COLS);//打印棋盘} while (win == ' ');if (win == 'X'){printf("玩家赢\n");}else if (win == '0'){printf("电脑赢\n");}else if (win == 'q'){printf("平局\n");}display(arr, ROWS, COLS);}void test(){int input = 0;do{menu();printf("请选择:");scanf("%d", &input);switch (input){case 1:game();break;case 0:break;default:printf("选择错误重新选择\n");break;}} while (input);}int main(){test();return 0;}
3>game.c(包含game函数中的各个函数的实现)

#define _CRT_SECURE_NO_WARNINGS 1#include "game.h"void init_board(char arr[ROWS][COLS], int row, int col)  //初始棋盘{memset(arr,' ', row*col * sizeof(arr[0][0])); //memset(空间起始地址,初始化的内容,空间大小)}void display(char arr[ROWS][COLS], int row, int col)     //打印棋盘{int i = 0;for (i = 0; i < row; i++){printf(" %c | %c | %c \n",arr[i][0], arr[i][1], arr[i][2]);if (i != (row - 1)){printf("---|---|---\n");}}printf("\n");}void computer_move(char arr[ROWS][COLS], int row, int col)  //电脑随机走{while (1){int x = rand() % 3;int y = rand() % 3;if(arr[x][y] == ' ')//判断此位置是否有棋子{arr[x][y] = '0';break;}}}void player_move(char arr[ROWS][COLS], int row, int col)//玩家走{while (1){int x = 0;int y = 0;printf("请输入坐标(x y)用空格隔开:");scanf("%d%d", &x, &y);if (((x >= 1) && (x <= 3)) && ((y >= 1) && (y <= 3))){if (arr[x-1][y-1] == ' '){arr[x-1][y-1] = 'X';break;}else{printf("该位置已被下过\n");}}else{printf("坐标有误\n");}}}char check_win(char arr[ROWS][COLS], int row, int col){int i = 0;for (i = 0; i < row; 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 < col; i++)//判断一列{if ((arr[0][i] == arr[1][i]) && (arr[1][i] == arr[2][i]) && (arr[0][i] != ' ')){return arr[i][0];}}if ((arr[0][0] == arr[1][1]) && (arr[1][1] == arr[2][2]) && (arr[0][0] != ' ')) //左上到右下 {return arr[0][0];}if ((arr[0][2] == arr[1][1]) && (arr[1][1] == arr[2][0]) && (arr[1][1] != ' '))  //右上到左下{return arr[1][1];}if (is_full(arr, row, col) == 1){return 'q';}return ' ';}int is_full(char arr[ROWS][COLS], int row, int col)  //判断棋盘是否满{int i = 0;int j = 0;for (i = 0; i < row;  i++){for (j = 0; j < col; j++){if (arr[i][j] == ' ')return 0;}}return 1;}

整个游戏共有三种结果:玩家赢,电脑赢,平局。





0 0
原创粉丝点击