C程序下的三子棋

    xiaoxiao2021-03-25  91

    还记得小时候一下课就用石子和同学在地上玩的三子棋吗?接下来我们一起来做一个模拟游戏来玩一下!

    如果要用代码来写,应该怎么写呢?

    思维逻辑:

    1、打印个开始菜单

    2、进入游戏

    3、先打印一张棋盘

    4、玩家先下或者电脑先下

    5、不管谁下一步,都要检查一下是否赢了,如果赢了跳出、没赢继续

    6、赢了之后输出赢得一方,输出谁赢了然后打印棋单,如果平局,输出平局

    以下是代码!(test.c里为主函数)

    game.h

    #ifndef __GAME_H__ #define __GAME_H__ #include <stdio.h> #include <time.h> #include <stdlib.h> #define ROWS 3 #define COLS 3 void init_arr(char arr[ROWS][COLS],int row, int col); //为数组开辟一块row*col*sizeof(char)大的内存 void display_arr(char arr[ROWS][COLS],int row, int col); //打印row*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); //检查是否有人赢 #endif __GAME_H__game.c

    #define _CRT_SECURE_NO_WARNINGS 1 #include <windows.h> #include "game.h" void init_arr(char arr[ROWS][COLS],int row, int col) { memset(arr,' ',row*col*sizeof(char)); //初始化内存 } void display_arr(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!=2) printf("---|---|---\n"); } } void computer_move(char arr[ROWS][COLS],int row, int col) { while(1) { int x = rand()%3; //求余只能得到0,1或2 int y = rand()%3; if(arr[x][y]==' ') { arr[x][y] = 'O'; //如果棋盘上是空白的就电脑就在这下'O' break; } } } void player_move(char arr[ROWS][COLS],int row, int col) { int x = 0; int y = 0; while(1) { printf("请输入下标->"); scanf("%d%d",&x,&y); x--; //按照正常坐标第一个是1,1 y--; if(((x>=0)&&(x<=2))&&(y>=0)&&(y<=2)) { if(arr[x][y]==' ') { arr[x][y] = 'X'; //在棋盘上,只要在空白的地方玩家下的记为'X' break; } else printf("看清楚,你下错了->"); //若下的那一步在棋盘上有,则输入错误 } else printf("看清楚,你下错了->"); } } static 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; //如果棋盘下满了,还没有分出胜负,则为平局 } char check_win(char arr[ROWS][COLS],int row, int col) { int i = 0; int j = 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(j=0; j<col; j++) { if((arr[0][j]==arr[1][j])&&(arr[1][j]==arr[2][j])&&(arr[0][j]!=' ')) { return arr[0][j]; } } 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)) { return 'q'; //如果没分出胜负返回q } return ' '; } test.c #define _CRT_SECURE_NO_WARNINGS 1 #include <windows.h> #include "game.h" #include <stdlib.h> void menu() { printf("*******************************\n"); printf("***** 1、play 0、exit *****\n"); printf("*******************************\n"); } void game() { char arr[ROWS][COLS]; char ret = 0; init_arr(arr,ROWS,COLS); display_arr(arr,ROWS,COLS); srand((unsigned int)time(NULL)); while(1) { player_move(arr,ROWS,COLS); if((ret = check_win(arr,ROWS,COLS))!=' ') break; display_arr(arr,ROWS,COLS); computer_move(arr,ROWS,COLS); if((ret = check_win(arr,ROWS,COLS))!=' ') break; display_arr(arr,ROWS,COLS); } if(ret == 'X') printf("666,你赢了\n"); else if(ret == 'O') printf("扎心了,老铁\n"); else if(ret == 'q') printf("平局,加油\n"); display_arr(arr,ROWS,COLS); } int main() { int input = 0; do { menu(); printf("请输入->"); scanf("%d",&input); switch(input) { case 1: game(); break; case 0: break; default: printf("输入错误"); break; } }while(input); return 0; }

    转载请注明原文地址: https://ju.6miu.com/read-16300.html

    最新回复(0)